我正在尝试训练神经网络从输入数据中提取参数。特别是确定砖块的宽度、高度和颜色(参见附图作为示例输入)。
我已经尝试过在原始图像上运行的 CNN 和在提取的特征上运行的 NN(2 个描述边缘和一个颜色直方图)。
这两种方法似乎都学习了训练数据的平均值。颜色多为灰色,宽度和高度介于两个极端之间。输出不依赖于输入,因为 NN 总是输出“相同”的值(只有非常小的波动)。
当我对生成的数据进行操作时,我在输入和期望的输出以及无限的训练数据之间有着完美的相关性。使用的损失函数是均方误差(也尝试了绝对误差)。
有人可以解释为什么会发生这种情况或如何避免这种训练行为吗?
我正在使用库tiny-cnn。我目前的方法(使用特征)使用 5 个全连接层,将层大小从 1200 减小到 17(参数数量)。
net << fully_connected_layer<sigmoid>(1200, 600)
<< fully_connected_layer<sigmoid>(600, 300)
<< fully_connected_layer<sigmoid>(300, 150)
<< fully_connected_layer<sigmoid>(150, 60)
<< fully_connected_layer<identity>(60, 17);
我测试了几个 CNN 结构,总是以 2 个全连接层结束。我尝试了从 3 到 11 的不同内核大小。
这是我尝试的最后一个:
net << convolutional_layer<tan_h>(100, 100, 5, 3, 4)
<< average_pooling_layer<tan_h>(96, 96, 4, 2)
<< convolutional_layer<tan_h>(48, 48, 7, 4, 8)
<< average_pooling_layer<tan_h>(42, 42, 8, 2)
<< convolutional_layer<tan_h>(21, 21, 7, 8, 16)
<< average_pooling_layer<tan_h>(15, 15, 16, 3)
<< convolutional_layer<tan_h>(5, 5, 5, 16, 32)
<< fully_connected_layer<relu>(32, 64)
<< fully_connected_layer<identity>(64, size);
5-conv,平均,7-conv,平均,7-conv,平均(3x3),5-conv,完整,完整
我主要使用具有标准学习率的 RMSProp 和 adagrad,但也尝试了更高和更低的学习率。
示例输入:


