具有自定义RNN的动态轴

时间:2017-01-13 17:28:42

标签: cntk

我遇到了许多与动态轴有关的问题。我试图实现类似于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或者我看到与上面相同的错误。

1 个答案:

答案 0 :(得分: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})
相关问题