gpt4 book ai didi

python - 使用 Keras/Tensorflow 模拟 PyTorch 切片赋值的最佳方法

转载 作者:行者123 更新时间:2023-11-28 20:33:55 29 4
gpt4 key购买 nike

我正在尝试模仿下面在 PyTorch 中完成的操作:

vol = Variable(torch.FloatTensor(A, B*2, C, D, E).zero_()).cuda()
for i in range(C):
if i > 0 :
vol[:, :B, i, :,i:] = input0[:,:,:,i:]
vol[:, B:, i, :,i:] = input1[:,:,:,:-i]
else:
vol[:, :B, i, :,:] = input0
vol[:, B:, i, :,:] = input1

到目前为止,我已尝试在 TF 中使用以下切片分配并将其包装在 Keras Lambda 层中:

vol = tf.Variable(K.zeros((A, D, E, C, B*2)))
for i in range(C):
if i > 0:
vol[:, :, i:, i, :B].assign(input0[:,:,i:,:])
vol[:, :, i:, i, B:].assign(input1[:,:,:-i,:])
else:
vol[:, :, :, i, :B].assign(input0)
vol[:, :, :, i, B:].assign(input1)
return vol

我还尝试了 vol = vol[...].assign(...)

这会将值正确分配给 vol 变量,然后我可以将其转换为张量以用于我的图表的其余部分。但是,此操作的梯度在 TF 中未定义(LookupError: No gradient defined for operation 'strided_slice/_assign' (op type: StridedSliceAssign)),并且梯度不会传播到前一个生成 input0input1 的层,而它们似乎确实在 PyTorch 实现中被传输了。有没有一种方法可以在 TF 中构造相同的变量,以便定义梯度并且我之前的操作没有 None 梯度?

最佳答案

您需要“手动”构造张量。假设 input0input1 的形状都是 (A, D, E, B),你可以这样做:

# Make the indexing mask with TensorFlow
in_shape = tf.shape(input0)
in_dims = 4
idx = tf.meshgrid(*[tf.range(in_shape[i]) for i in range(in_dims)], indexing='ij')[2]
idx = tf.expand_dims(idx, axis=3)
r = tf.range(C)[tf.newaxis, tf.newaxis, tf.newaxis, :, tf.newaxis]
mask = idx >= r

# If all dimensions are known at graph construction time, you can instead
# make the mask with NumPy like this to save graph computation time
idx = np.meshgrid(*[np.arange(d) for d in (A, D, E, B)], indexing='ij')[2]
idx = np.expand_dims(idx, 3)
r = np.arange(C)[np.newaxis, np.newaxis, np.newaxis, :, np.newaxis]
mask = idx >= r

# Make the tensor
input0_tile = tf.tile(tf.expand_dims(input0, 3), (1, 1, 1, C, 1))
input1_tile = tf.tile(tf.expand_dims(input1, 3), (1, 1, 1, C, 1))
zero_tile = tf.zeros_like(input0_tile)
vol0 = np.where(mask, input0_tile, zero_tile)
vol1 = np.where(mask, input1_tile, zero_tile)
vol = tf.concat([vol0, vol1], axis=-1)

请注意,您需要第一个或第二个 block ,然后是第三个 block ,而不是三个 block (请参阅注释)。该代码使用 tf.meshgrid 构建二进制掩码和一个 tf.range的索引,然后使用 tf.where从输入或零中选择值。

关于python - 使用 Keras/Tensorflow 模拟 PyTorch 切片赋值的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49755316/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com