1

我遇到了许多与动态轴相关的问题。我正在尝试实现类似于 LSTM() 函数的卷积 rnn,但处理顺序图像输入并输出图像。

我能够构建网络并通过它传递虚拟数据以产生输出,但是当我尝试使用 input_variable 标签计算错误时,我始终看到以下错误:

RuntimeError: Node '__v2libuid__Input471__v2libname__img_label' (InputValue operation): DataFor: FrameRange's dynamic axis is inconsistent with matrix: {numTimeSteps:1, numParallelSequences:2, sequences:[{seqId:0, s:0, begin:0, end:1}, {seqId:1, s:1, begin:0, end:1}]} vs. {numTimeSteps:2, numParallelSequences:1, sequences:[{seqId:0, s:0, begin:0, end:2}]}`

如果我正确理解此错误消息,它声称我作为标签传入的值与 2 个时间步长和 1 个并行序列的预期轴不一致,而所需的是 1 个时间步长和 2 个序列。这对我来说很有意义,但我不确定我传入的数据如何不符合这一点。以下是(大致)变量声明和 eval 语句:

…
img_input = input_variable(shape=img_shape, dtype=np.float32, name="img_input")
convlstm = Recurrence(conv_lstm_cell, initial_state=initial_state)(img_input)
out = select_last(convlstm)
img_label = input_variable(shape=img_shape, dynamic_axes=out.dynamic_axes, dtype=np.float32, name="img_label”)
error = squared_error(out, img_label)
…

dummy_input = np.ones(shape=(2, 3, 3, 32, 32))   # (batch, seq_len, channels, height, width)
dummy_label = np.ones(shape=(2, 3, 32, 32))        # (batch, channels, height, width)
out = error.eval({img_input:dummy_input, img_label:dummy_label})

我相信部分问题在于创建 img_label input_variable 时设置的 dynamic_axes,我也尝试将其设置为 [Axis.default_batch_axis()] 并且根本没有设置它,或者平方错误抱怨 out 和 img_label 之间的轴不一致或者我看到与上面相同的错误。

4

1 回答 1

0

我在上面的设置中看到的唯一问题是你的虚拟标签应该有一个明确的动态轴,所以它应该被声明为

dummy_label = np.ones(shape=(2, 1, 3, 32, 32))

假设您的convlstm作品类似于 lstm,那么以下作品对我来说没有问题,它会评估两个输入/输出对的损失。

x = C.input_variable((3,32,32))
cx = convlstm(x)
lx = C.sequence.last(cx)
y = C.input_variable(lx.shape, dynamic_axes=lx.dynamic_axes)
loss = C.squared_error(y, lx)
x0 = np.arange(2*3*3*32*32,dtype=np.float32).reshape(2,3,3,32,32)
y0 = np.arange(2*1*3*32*32,dtype=np.float32).reshape(2,1,3,32,32)
loss.eval({x:x0, y:y0})
于 2017-01-13T23:45:07.900 回答