【发布时间】:2017-10-19 12:21:20
【问题描述】:
我正在使用 CNTK.GPU v2.2.0 并使用以下方法保存了一个模型:
model.Save(modelFilePath);
现在我想再次加载它,例如继续训练或只评估样本。我可以看到两种可能的方式。一种方法可行,但不切实际。第二个不行。
-
我再次从头开始构建我的神经网络的整个结构,然后在其上调用以下方法:
model.Restore(modelFilePath);
确实,这行得通。
-
我使用以下静态方法创建模型:
Function.Load(modelFilePath, DeviceDescriptor.GPUDevice(0));
这不起作用。
在这些操作之后,我只是为模型创建了一个训练器,创建一个 minibatchSource 并尝试以与保存模型之前相同的方式训练模型。
但是对于第二种策略,我得到以下异常:
System.ArgumentOutOfRangeException: 'Values for 1 required arguments 'Input('features', [28 x 28 x 1], [, #])', 请求的输出 'Output('aggregateLoss ', [], []), Output('lossFunction', [1], [, #]), Output('aggregateEvalMetric', [], [])' 依赖,未提供。
[CALL STACK]
> CNTK::Internal:: UseSparseGradientAggregationInDataParallelSGD
- CNTK::Function:: Forward
- CNTK:: CreateTrainer
- CNTK::Trainer:: TotalNumberOfSamplesSeen
- CNTK::Trainer:: TrainMinibatch (x2)
- CSharp_CNTK_Trainer_TrainMinibatch__SWIG_0
- 00007FFA34AE8967 (SymFromAddr() error: The specified module could not be found.)
它表示尚未提供输入功能。我在训练和从头开始创建模型时使用输入:
var input = CNTKLib.InputVariable(_imageDimension, DataType.Float, _featureName);
var scaledInput = CNTKLib.ElementTimes(Constant.Scalar<float>(0.002953125f, _device), input);
...
所以我想我必须用我为训练创建的模型替换加载模型的输入,并在我从头开始创建模型时使用——尽管输入没有不同。 但我坚持尝试这个,因为我无法检索模型对象的输入,我需要替换它(我认为)。
model.FindByName(inputLayerName);
只是返回 null,虽然我可以清楚地看到该名称与调试器中模型的“输入”列表中的层名称匹配。
因此我不知道如何正确加载保存的模型。我希望有人可以帮助我。
【问题讨论】: