I would like to use Conv2D
layer in order to stride an input image and run three 2x2
kernels.
This is not the purpose of tensorflow, but I really want to use tensorflow as the backend engine to run kernels efficiently and to distribute the work load between different devices GPUs and/or CPUs.
I tried something like the following code. But It doesn't seem to work very well.
import tensorflow as tf
class InitConvKernels(tf.keras.initializers.Initializer):
def __init__(self, num_kernels, kernel_tensor):
self.kernel_list= kernel_tensor
self.index = -1
self.num_kernels = num_kernels
def __call__(self, shape, dtype=None):
index += 1
assert(self.index <= self.num_kernels) # doesn't affect anything
tf.print(shape) # doesn't work
return self.kernel_list[index]
def get_config(self):
return {'kernel_list': self.kernel_list, 'num_kernels': self.num_kernels}
I am calling the custom initializer, but the returned layer is empty:
kernel_list = tf.constant([[[-1, -1], [-1, -1]], [[1, 1], [1, 1]], [[-1, 1], [1, -1]],])
layer = layers.Conv2D(
filters=3,
kernel_size=2,
kernel_initializer=InitConvKernels(3,kernel_list),
bias_initializer=initializers.Zeros()
)
layer.variables
is empty ([]
)
layer.layer.get_weights()
is also empty ([]
)
My goal is to evaluate the convolution of the three kernels in kernel_list
on an input image and aggregate all the results.