【发布时间】: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