更新 Tensorflow 中的变量切片
Posted
技术标签:
【中文标题】更新 Tensorflow 中的变量切片【英文标题】:Update slices of variables in Tensorflow 【发布时间】:2018-05-07 03:33:33 【问题描述】:我有以下代码sn-p,用Lua用torch写的,这是一个自定义的边缘检测算法:
xGrad1[,,,1,width-1] = input:narrow(4,2,width-1) - input:narrow(4,1,width-1)
yGrad1[,,1,height-1,] = input:narrow(3,2,height-1) - input:narrow(3,1,height-1)
xGrad2[,,,2,width] = input:narrow(4,2,width-1) - input:narrow(4,1,width-1)
yGrad2[,,2,height,] = input:narrow(3,2,height-1) - input:narrow(3,1,height-1)
local xGrad = (torch.abs(self.xGrad1) + torch.abs(self.xGrad2))/2
local yGrad = (torch.abs(self.yGrad1) + torch.abs(self.yGrad2))/2
output = torch.sum(xGrad,2)+torch.sum(yGrad,2)
如您所见,xGrad 和 yGrad 张量的最后两个维度(表示图像的宽度和高度)仅部分更新,例如在 xGrad2 中只有第 2 列到 width-1。
现在我想用 Tensorflow 和 Python 实现相同的结果。我不确定我的一般方法是否正确,但我已将所有 4 个 Grad-tensor 初始化为变量并用零预填充它们。现在我正在为这些部分分配而苦苦挣扎。我用Variable.assign
尝试过,但没有运气。
目前,这是我的代码:
input = tf.image.decode_png(tf.read_file(f), 3)
input = tf.cast(input, tf.float32)
height = tf.shape(input)[0]
width = tf.shape(input)[1]
xGrad1 = tf.Variable(tf.zeros(tf.shape(input)), validate_shape=False)
yGrad1 = tf.Variable(tf.zeros(tf.shape(input)), validate_shape=False)
xGrad2 = tf.Variable(tf.zeros(tf.shape(input)), validate_shape=False)
yGrad2 = tf.Variable(tf.zeros(tf.shape(input)), validate_shape=False)
xGrad1[:, :width-2].assign(input[:,1:width-2] - input[:,:width-2])
yGrad1[:height-2].assign(input[1:height-2] - input[:height-2])
xGrad2[:, 1:width-1].assign(input[:,1:width-2] - input[:,:width-2])
yGrad2 [1, height-1].assign(input[1:height-2] - input[:height-2])
xGrad = (tf.abs(xGrad1) + tf.abs(xGrad2)) / 2
yGrad = (tf.abs(yGrad1) + tf.abs(yGrad2)) / 2
output = tf.reduce_sum(xGrad,axis=2) + tf.reduce_sum(yGrad,axis=2)
将列表索引从 Lua 转换为 python 后,我在直接输出作为 4 个分配命令的参数的计算时得到了不错的结果,但在输出 xGrad1 等的内容时只有黑色图像。
我假设形状不兼容存在问题,但我已将 validate_shapes 切换为 False,因为在会话创建时我不知道输入的形状,因为输入图像是在会话开始后加载的。如果有人对此也有想法,请随时回答我,但现在我只问如何仅部分分配变量张量。
【问题讨论】:
【参考方案1】:如果你想做一个分片作业,你必须遵循这样的事情,
with tf.control_dependencies([xGrad1[:, :width-2].assign(input[:,1:width-2] - input[:,:width-2]), yGrad1[:height-2].assign(input[1:height-2] - input[:height-2]),xGrad2[:, 1:width-1].assign(input[:,1:width-2] - input[:,:width-2]),yGrad2 [1, height-1].assign(input[1:height-2] - input[:height-2])]): # should give the list of slice assignment here
xGrad = (tf.abs(xGrad1) + tf.abs(xGrad2)) / 2
yGrad = (tf.abs(yGrad1) + tf.abs(yGrad2)) / 2
output = tf.reduce_sum(xGrad,axis=2) + tf.reduce_sum(yGrad,axis=2)
sess = tf.Session()
with sess.as_default():
sess.run(tf.global_variables_initializer())
output= output.eval()
这是对 Tensorflow 中切片赋值的一个很好的解释, https://***.com/a/43139565/6531137
希望这会有所帮助。
【讨论】:
它有帮助。感谢您阐明如何进行切片作业,这正是我所需要的。以上是关于更新 Tensorflow 中的变量切片的主要内容,如果未能解决你的问题,请参考以下文章