我正在尝试处理从YOLO v5获得的数据,这些数据是每个检测到的对象的4个值的数组(posX, posY, SizX, Sizy)。我知道多个检测之间存在关联,我希望神经网络能找到这种关联。对于每个输入数组,它应该返回一个2×4的矩阵,或者平铺后的大小为8的数组。我正在使用Keras Sequential模型训练4017个样本:
model = Sequential()model.add(layers.Dense(256, activation="relu", name="layer1"))model.add(Dropout(0.5))model.add(BatchNormalization())model.add(layers.Dense(592, activation="relu", name="layer2"))model.add(Dense(8))model.add(Activation('softmax'))sgd = tf.keras.optimizers.SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])hist=model.fit(X, y, batch_size=48, epochs=50, validation_split=0.2)
但是我得到的结果并不理想:
Epoch 20/2080/80 [==============================] - 1s 10ms/step - loss: 0.5413 - accuracy: 0.9963 - val_loss: 0.5414 - val_accuracy: 0.9937
其中预测结果为:
Input: [0.50070833 0.50070833 0.42683333 0.22983333]Expected Output: [[0.591 0.50070833 0.04514583 0.25035417] [0.50070833 0.34475 0.44735417 0.04514583]]NeuralNetwork Output: [[0.28618604 0.18969838 0.00889739 0.06283922] [0.18952993 0.09904755 0.15489812 0.00890343]]
添加/删除层/BatchNormalization/Dropout 没有任何效果,改变损失函数/优化器只会使结果变得更差。你对这个问题有什么建议或解决方案吗?
回答:
输出层的Softmax激活函数通常用于分类问题,你似乎不是在做分类,而是回归(因为输出是连续的,而不是离散的)。
那么你应该将输出层的激活函数改为适合的函数,比如linear
(通用解决方案)或sigmoid
(如果目标值在[0, 1]范围内)。