【问题标题】:Error: Value rank (4) should be larger than the Variable rank (1) at most by number of dynamic axes (2)错误:值等级 (4) 最多应大于变量等级 (1) 的动态轴数 (2)
【发布时间】:2018-01-24 06:51:40
【问题描述】:

我想知道如何为 CNTK 网络建模提供输入变量并像给定的 here 那样训练模型

由于我有两个自变量和三个目标变量,X 和 Y 的形状:

X["train"].shape
Out[60]: (34567, 10, 2, 1)

Y["train"].shape
Out[61]: (34567, 3, 1)

我将 time_steps 和 time_shift 设为 10。

N = 10  ### Specify the internal-state dimensions of the LSTM cell which is 10
def create_model(x):
    with C.layers.default_options(initial_state = 0.1):
        m = C.layers.Recurrence(C.layers.LSTM(N))(x)
        m = C.sequence.last(m)
        m = C.layers.Dropout(0.2, seed=1)(m)
        m = C.layers.Dense(1)(m)
        return m


BATCH_SIZE = 100;EPOCHS = 100

def next_batch(x, y, ds):
    def as_batch(data, start, count):
        part = []
        for i in range(start, start + count):
            part.append(data[i])
        return np.array(part)
    for i in range(0, len(x[ds])-BATCH_SIZE, BATCH_SIZE):
        yield as_batch(x[ds], i, BATCH_SIZE), as_batch(y[ds], i, BATCH_SIZE)



x = C.sequence.input_variable(1)
z = create_model(x)
l = C.input_variable(1, dynamic_axes=z.dynamic_axes, name="y")
learning_rate = 0.02
lr_schedule = C.learning_parameter_schedule(learning_rate)
loss = C.squared_error(z, l)
error = C.squared_error(z, l)
momentum_schedule = C.momentum_schedule(0.9, minibatch_size=BATCH_SIZE)
learner = C.fsadagrad(z.parameters, 
                      lr = lr_schedule, 
                      momentum = momentum_schedule, 
                      unit_gain = True)
trainer = C.Trainer(z, (loss, error), [learner])



# train
loss_summary = []
for epoch in range(0, EPOCHS):
    for x1, y1 in next_batch(X, Y, "train"):
        trainer.train_minibatch({x: x1, l: y1})
    if epoch % (EPOCHS / 10) == 0:
        training_loss = trainer.previous_minibatch_loss_average
        loss_summary.append(training_loss)
        print("epoch: {}, loss: {:.5f}".format(epoch, training_loss))

但这会产生错误:

Traceback(最近一次通话最后一次):

文件“”,第 6 行,在 trainer.train_minibatch({x: x1, l: y1})

文件 "c:\program 文件\python36\lib\site-packages\cntk\train\trainer.py",第 184 行,在 train_minibatch 设备)

文件 "c:\program files\python36\lib\site-packages\cntk\cntk_py.py", 第 2856 行,在 train_minibatch 中 return _cntk_py.Trainer_train_minibatch(self, *args)

ValueError:值排名 (4) 应大于变量排名 (1) 最多通过动态轴数 (2);变量='输入('Input4973', [#, *], 1)', 值形状 = '[100 x 10 x 2 x 1]'。

[调用堆栈]

CNTK::TrainingParameterSchedule:: 变换 - CNTK::Internal:: UseSparseGradientAggregationInDataParallelSGD (x2) - CNTK::Function:: 转发 - CNTK:: CreateTrainer - CNTK::Trainer:: TotalNumberOfUnitsSeen - CNTK::Trainer:: TrainMinibatch (x2) - PyInit__cntk_py (x2) - PyEval_EvalFrameDefault - Py_CheckFunctionResult - PyObject_CallFunctionObjArgs - PyEval_EvalFrameDefault - Py_CheckFunctionResult - PyObject_CallFunctionObjArgs

我知道这个错误对应于动态轴和输入变量。但我不知道在 C.sequence.input_variable(1) 和 C.input_variable(1, dynamic_axes=z.dynamic_axes, name="y") 中给出什么作为输入变量

另外,我想预测三个目标变量

【问题讨论】:

    标签: python python-3.x lstm cntk


    【解决方案1】:

    要预测 3 个目标变量,您需要在最后一层有 3 个输出,因此您应该将 m = C.layers.Dense(1)(m) 更改为 m = C.layers.Dense(3)(m)

    另一个错误是因为您的 X["train"] 具有 shape=(batch, sequence, 2, 1),但是当您调用 create_model 时,您传递的东西具有 shape=(sequence, 1)。解决此问题的最佳方法是使您的 X["train"] 具有 shape=(batch, sequence, 2) (例如通过调用 np.squeeze),然后使用 C.sequence.input_variable(2) 调用 create_model。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多