我正在使用在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
操作以使其支持动态轴?
答案 0 :(得分:0)
collect的第一个参数不能有任何动态轴。它是值的张量。因此,您可以在收集之前和之后unpack_batch / to_batch来实现此目的。
回答here。