以十为单位更新变量切片

2024-05-23 22:38:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码片段,用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个梯度张量初始化为一个变量,并预先用零填充它们。现在我正在为这些部分分配而挣扎。我用Variable.assign试过了,但没有运气。在

目前,这是我的代码:

^{pr2}$

在将列表索引从Lua转换为python之后,当我直接输出作为4个assign命令的参数的计算时,得到了不错的结果,但是在输出xGrad1的内容时只得到了一个黑色的图像等等。在

我假设不兼容的形状有问题,但我已经将validate_shapes切换为False,因为在会话创建时我不知道输入的形状,因为输入图像是在会话启动后加载的。如果有人对此也有想法,请随时回答我,但现在我只问如何仅部分分配一个变量张量。在


Tags: 代码图像selfinputtorchabswidthlua
1条回答
网友
1楼 · 发布于 2024-05-23 22:38:47

如果你想做一个切片作业,你必须遵循这样的方法

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://stackoverflow.com/a/43139565/6531137

希望这有帮助。在

相关问题 更多 >