在过去的几天里,我一直在尝试使用TensorFlow,但我不确定我编写的函数是否会破坏神经网络中的反向传播。在尝试将这个函数集成到神经网络之前,我想在这里问问。基本设置是我想用以下方式添加两个矩阵:
op = tf.add(tfObject, tfImageBackground)
其中tfImageBackground
是一个常量图像(例如,一个尺寸为800×800的RGBA图像,其中R = G = B = A = 0),而tfObject
也是一个相同维度的矩阵,但我们通过我所不确定的函数获取它:
def getObject(vector): objectId = vector[0] x = vector[1] y = vector[2] xEnd = baseImageSize-(x+objectSize) yStart =baseImageSize- (y+objectSize) padding = tf.convert_to_tensor([[x, xEnd], [yStart, y],[0,0]]) RTensor = tfObjectMatrix[objectId,:,:,0:1] GTensor = tfObjectMatrix[objectId,:,:,1:2] BTensor = tfObjectMatrix[objectId,:,:,2:3] ATensor = tfObjectMatrix[objectId,:,:,3:4] paddedR = tf.pad(tensor = RTensor, paddings= padding, mode='Constant', name='padAverageRed', constant_values=255) ... generates padding for every channel ... finalTensor=tf.concat([paddedR, paddedG, paddedB, paddedA], 2) return finalTensor
tfObjectMatrix
是一组不会改变的图像。我确实检查了是否能够从op
生成tf.gradient
,结果是可以的。不过,我不确定这是否足以让反向传播正常工作。
感谢你们的时间和努力。任何输入都将不胜感激。
回答:
TensorFlow默认情况下会对所有内容进行反向传播。根据你的代码,所有内容都会在优化器的训练操作中接收梯度。所以回答你的问题,反向传播会工作。
唯一需要考虑的是,你说tfObjectMatrix
是一组不会改变的图像。所以你可能不希望它接收任何梯度。因此,你可能需要考虑使用tf.stop_gradient()
,并像OM = tf.stop_gradient( tfObjectMatrix )
这样使用,然后在你的函数中使用OM
。