CNTK收集动态轴上的操作

时间:2018-07-12 11:57:07

标签: python numpy cntk

我正在使用在Python上使用CNTK的简单神经网络,但是我想在训练过程中打印出自定义指标,以监控学习过程如何改进此特定指标。

神经网络在x,y和z分量的3D中的输出为202点(在我的设置中,这是x,y和z分量彼此相邻的606点的向量,请参见例)。我想在训练期间监视的是预测y分量与目标的差异值。

这是输出结果的示例:

              #x0    y0    z0    x1    y1    z1    ...  x202  y202  z202
predictions = [1.56, 2.34, 1.33, 3.24, 2.33, 1.97, ..., 0.97, 1.43, 5.86]
target =      [1.42, 2.20, 1.00, 2.99, 3.25, 1.97, ..., 0.52, 1.22, 4.99]

numpy中,我可以通过花式索引轻松获得y分量:

y_components = predictions[1::3]
# [2.34, 2.33, ..., 1.43]

但是,CNTK不能立即解决这个问题,因此我将不得不使用提供的CNTK操作;我发现值得注意的一个是cntk.gather,它以预测和我需要的值的索引的掩码数组作为参数。因此,我创建了一个常量值,如下所示:

y_component_idx = C.constant(np.arange(1, 606, 3), dtype=np.int)

由此,我应该能够使用以下代码仅使用y分量来计算指标:

c_X = C.input_variable((18,), np.float32)
c_Y = C.input_variable((606,), np.float32)
neural_net = Sequential([
    Dense(1000, activation=C.tanh),
    Dense(606)
])
predictions = neural_net(c_X)

y_component_idx = C.constant(np.arange(1, 606, 3), dtype=np.int)
y_pred_components = C.gather(predictions, y_component_idx)
y_targ_components = C.gather(c_Y, y_component_idx)
mse = C.reduce_mean(C.squared_error(predictions, c_Y))
metric = C.reduce_mean(C.less(C.abs(y_pred_components - y_targ_components), [0.1]))

params = [sgd(predictions.parameters, lr=0.01)]
trainer = C.Trainer(predictions, criterion=[mse, metric],
                    parameter_learners=params,
                    progress_writers=progress_printer)

for i in range(1000):
    # X_train and Y_train have sizes (1000, 18) and (1000, 606) respectively
    trainer.train_minibatch({c_X: X_train, c_Y: Y_train})

在运行时,出现以下错误:

RuntimeError: Gather operation's right operand doesn't expect to have dynamic axis

我尝试创建一个等于批处理大小的常量掩码数组,但出现相同的错误。如何制定cntk.gather操作以使其支持动态轴?

1 个答案:

答案 0 :(得分:0)

collect的第一个参数不能有任何动态轴。它是值的张量。因此,您可以在收集之前和之后unpack_batch / to_batch来实现此目的。

回答here