我正在尝试训练一个神经网络来控制角色在二维空间中的速度,x和y的速度范围在-1到1米/秒之间。目前我将这个范围划分为0.1米/秒的区间,因此我最终得到了400个输出神经元(20个x值 * 20个y值)。如果我将精度提高到0.01米/秒,我将得到40,000个输出神经元。有没有办法减少输出神经元的数量?
回答:
我假设你将这个问题视为一个分类问题。在训练过程中,你有输入X
和输出Y
。由于你在进行分类训练,你的预期输出总是像这样:
-1 -0.9 ... 0.3 0.4 0.5 ... 1.0 m/sY1 = [0, 0, ..., 1, 0, 0, ..., 0] // x方向速度分量Y2 = [0, 0, ..., 0, 0, 1, ..., 0] // y方向速度分量Y = [Y1, Y2]
也就是说:对于x和y方向的每个速度分量,只有一个神经元输出1;所有其他神经元输出0(在上面的例子中,预期输出是x方向0.3米/秒,y方向0.5米/秒,针对这个训练实例)。实际上,这可能更容易学习,并且具有更好的预测性能。但正如你指出的,它不具备扩展性。
我认为你也可以将这个问题视为一个回归问题。在你的网络中,你为每个速度分量设置一个神经元。你的预期输出只是:
Y = [0.3, 0.5] // 针对你拥有的同一个训练实例。
为了获得-1到1的输出范围,你在输出层有不同的激活函数选项。例如,你可以使用
f(x) = 2 * (Sigmoid(x) - 0.5)Sigmoid(x) = 1 / (1 + exp(-x))
由于sigmoid (x) 在(0,1)之间,2*(sigmoid(x) – 0.5) 在(-1,1)之间。这种改变(用两个神经元替换输出层中的多个神经元)大大降低了模型的复杂性,因此你可能需要在中间层增加更多的神经元以避免欠拟合。