我想在Tensorflow中转换一般张量/矢量,但是要举一个具体的例子,比如旋转图像。 为此,我想有一个旋转矩阵R,该矩阵可以通过我的网络学习到,即应该有可计算的梯度。 你会怎么做?
我找到了tf.contrib.image.transform,但是据说没有将梯度计算到转换参数中。 通过py_func,梯度也不可用,或者必须手动计算-在为此编写一个长的自定义解决方案(如果可能的话)之前,也许有任何现成的解决方案吗?
我不能是第一个这样做的人。 对于请求的代码:我只想输入图像作为输入,也许应用一些卷积层,最后得到一个2x2的矩阵,表示我的变换:
conv_1 = tf.layers.conv2d(conv1, 16, [3, 3], strides=(2, 2), padding='same', activation=tf.nn.leaky_relu)
...
M = tf.contrib.layers.fully_connected(conv_n, 4, activation_fn=tf.nn.tanh)
然后矩阵M描述了我的索引是如何变换的(将图像中的每个像素想象为具有端点x,y的矢量),然后我将每个像素移动到其新位置。 例如,在numpy中,我可以这样做:
indices = []
for i in range(28):
for j in range(28):
indices.append([i, j])
indices = np.repeat(np.expand_dims(np.asarray(indices), 0), self.batch_size, 0)
transformed = []
for b in range(self.batch_size):
transformed.append(tf.matmul(indices[b], M[b]))
transformed = tf.stack(transformed)
transformed_img = np.zeros((self.batch_size, 28, 28))
for b in range(self.batch_size):
transformed_img[b, transformed[b, :, :, 0].astype(np.int32), transformed[b, :, :, 1].astype(np.int32)] = input_img[b, :, :, 0]