我在我的应用程序中使用https://github.com/cbovar/ConvNetSharp来使用卷积神经网络。
不幸的是,图书馆根本没有完整的文件记录。但无论如何,我对培训过程有疑问:
我声明了一个字典类型字符串和列表的位图。
然后我在字典中添加了一些字母(例如a,b,c等等)及其相应的名称。
在此之后,我创建神经网络如下:
Network.AddLayer(new InputLayer(Width, Height, 1));
Network.AddLayer(new ConvLayer(5, 5, NumberFilters) { Stride = 1, Pad = 2 });
Network.AddLayer(new ReluLayer());
Network.AddLayer(new PoolLayer(2, 2) { Stride = 2 });
Network.AddLayer(new ConvLayer(5, 5, NumberFilters * 2) { Stride = 1, Pad = 2 });
Network.AddLayer(new ReluLayer());
Network.AddLayer(new PoolLayer(3, 3) { Stride = 3 });
Network.AddLayer(new FullyConnLayer(TrainingSet.Count));
Network.AddLayer(new SoftmaxLayer(TrainingSet.Count));
如果我现在通过这种方法开始训练过程:
public void StartTraining()
{
_initializeLayers();
_locked = true;
int _increment = 0;
Console.WriteLine("Training...");
foreach (var data in TrainingSet)
{
for (int i = 0; i < data.Value.Count; i++)
{
var map = MapBmpToDouble(data.Value[i]);
var input = new Volume(map, new Shape(map.Length));
var output = Network.Forward(input, true);
for (int j = 0; j < Iterations; j++)
{
var trainer = new SgdTrainer(Network) { LearningRate = Epsilon, L2Decay = Decay, Momentum = 0.9, BatchSize = TrainingSet.Count };
trainer.Train(input, new Volume(GetTrainingValues(_increment), new Shape(TrainingSet.Count)));
}
}
_increment++;
}
Console.WriteLine("Done.");
}
并测试结果例如字母a,我得到了非常不合逻辑的值。
网络的最后一个项目/类别的概率总是最高的。对于训练部分,我只使用该方法
public double[] GetTrainingValues(int index)
{
double[] values = new double[TrainingSet.Count];
values[index] = 1.0;
return values;
}
定义哪个类位置必须是具有相应标签Y的图像X的最高位置。
此外,如果我为每个标签使用相同的图像,我得到相同的结果!为什么?
你知道如何训练最好的,或者你能推荐我一个更好的图书馆吗?
非常感谢你 !
您应该在训练循环之外仅对训练器进行一次实例化。
var trainer = new SgdTrainer(Network) {
LearningRate = Epsilon,
L2Decay = Decay,
Momentum = 0.9,
BatchSize = TrainingSet.Count };
for (int j = 0; j < Iterations; j++)
{
trainer.Train(input,
new Volume(GetTrainingValues(_increment),
new Shape(TrainingSet.Count)));
}