Optimization 随着验证准确性的提高,培训损失增加

Optimization 随着验证准确性的提高,培训损失增加,optimization,keras,Optimization,Keras,我正在训练一个CNN,用keras和tensorflow对每幅15k样本的图像进行二值分类 这是我的模型: #input layer : first conv layer model = Sequential() model.add(Conv2D(filters=32, kernel_size=(5,5), input_shape=(256,256,3), padding='same',

我正在训练一个CNN,用keras和tensorflow对每幅15k样本的图像进行二值分类

这是我的模型:

#input layer : first conv layer
model = Sequential()
model.add(Conv2D(filters=32,
                 kernel_size=(5,5),
                 input_shape=(256,256,3),
                 padding='same',
                 kernel_regularizer=regularizers.l2(0.0001)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.1))

# second conv layer
model.add(Conv2D(filters=64,
                 kernel_size=(5,5),
                 padding='same',
                 kernel_regularizer=regularizers.l2(0.0001)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
# third layer
model.add(Conv2D(filters=128,
                 kernel_size=(5,5),
                 padding='same',
                 kernel_regularizer=regularizers.l2(0.0001)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.3))
# fourth layer : FC layer
model.add(Flatten())
model.add(Dense(128,kernel_regularizer=regularizers.l2(0.0001)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.5))
# prediction layer
model.add(Dense(2,activation='softmax',name='prediction',kernel_regularizer=regularizers.l2(0.0001)))
    
我使用Adam设置为keras文档中给出的默认值作为优化程序。 当我开始训练这个模型时,它开始表现得很奇怪

Epoch 14/180
191s - loss: 0.7426 - acc: 0.7976 - val_loss: 0.7306 - val_acc: 0.7739

Epoch 15/180
191s - loss: 0.7442 - acc: 0.8034 - val_loss: 0.7284 - val_acc: 0.8018

Epoch 16/180
192s - loss: 0.7439 - acc: 0.8187 - val_loss: 0.7516 - val_acc: 0.8103

Epoch 17/180
191s - loss: 0.7401 - acc: 0.8323 - val_loss: 0.7966 - val_acc: 0.7945

Epoch 18/180
192s - loss: 0.7451 - acc: 0.8392 - val_loss: 0.7601 - val_acc: 0.8328

Epoch 19/180
191s - loss: 0.7653 - acc: 0.8471 - val_loss: 0.7776 - val_acc: 0.8243

Epoch 20/180
191s - loss: 0.7514 - acc: 0.8553 - val_loss: 0.8367 - val_acc: 0.8170

Epoch 21/180
191s - loss: 0.7580 - acc: 0.8601 - val_loss: 0.8336 - val_acc: 0.8219

Epoch 22/180
192s - loss: 0.7639 - acc: 0.8676 - val_loss: 0.8226 - val_acc: 0.8438

Epoch 23/180
191s - loss: 0.7599 - acc: 0.8767 - val_loss: 0.8618 - val_acc: 0.8280

Epoch 24/180
191s - loss: 0.7632 - acc: 0.8761 - val_loss: 0.8367 - val_acc: 0.8426

Epoch 25/180
191s - loss: 0.7651 - acc: 0.8769 - val_loss: 0.8520 - val_acc: 0.8365

Epoch 26/180
191s - loss: 0.7713 - acc: 0.8815 - val_loss: 0.8770 - val_acc: 0.8316
等等

损失在增加,准确性也在增加培训和验证

由于我使用的是softmax分类器,因此获得起始损耗~0.69-ln0.5是合乎逻辑的,但此处的损耗高于此值

我不知道这是否太合适。
有人能告诉我这里发生了什么吗?

对于二进制分类,您可以尝试将预测层更改为:

model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

对于二进制分类,您可以尝试将预测层更改为:

model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

首先使用二进制交叉熵进行二进制分类,其次需要调整学习率,我认为学习率的值太大了


另外,如果你能告诉我们你正在使用的图像是什么,那会很有帮助。

首先使用二进制交叉熵进行二进制分类,其次你需要调整学习率,我认为你的学习率值太大了



请注意,如果您能告诉我们您正在使用的图像是什么,这将非常有用。

您将显示第14纪元及更高纪元的数据。在以前的年代里,你的损失是单调减少的吗?如果是这样的话,那么这些更高时代的行为就不是那么不寻常了,特别是如果你没有使用可调节的学习率的话。损失会增加,但准确度也会增加,这种情况并不少见。它们是通过完全不同的方法计算的。请尝试使用Keras内置的学习率调节器,如Keras.callbacks.callbacks.ReducelRon提供。这将根据您选择监控的指标,降低您的学习率。您可以将损失函数视为N空间中的一个谷,当您接近最小值时,它会变窄。请参见附图。如果您在接近最小值时学习率过大,请参见图中的箭头。您的损失将不再单调减少,而是开始增加。

您显示了第14纪元及更高纪元的数据。在以前的年代里,你的损失是单调减少的吗?如果是这样的话,那么这些更高时代的行为就不是那么不寻常了,特别是如果你没有使用可调节的学习率的话。损失会增加,但准确度也会增加,这种情况并不少见。它们是通过完全不同的方法计算的。请尝试使用Keras内置的学习率调节器,如Keras.callbacks.callbacks.ReducelRon提供。这将根据您选择监控的指标,降低您的学习率。您可以将损失函数视为N空间中的一个谷,当您接近最小值时,它会变窄。请参见附图。如果您在接近最小值时学习率过大,请参见图中的箭头。您的损失将不再单调减少,而是开始增加。

我感到困惑。这与我得到的结果有什么关系?您能解释一下吗?您只是为您的用例选择了错误的体系结构。我只能推测你关于设置的培训价值,因为你没有在model.compile.model.compileloss='categorical\u crossentropy',optimizer=optimizers.Adam,metrics=['accurity']中提供所选损失和指标的详细信息。我感到困惑。这与我得到的结果有什么关系?您能解释一下吗?您只是为您的用例选择了错误的体系结构。我只能推测你的设置培训值,因为你没有在model.compile.model.compileloss='categorical\u crossentropy',optimizer=optimizers.Adam,metrics=['accurity']中提供所选损失和指标的详细信息。你检查过你的预测吗?你可能会得到同样的预测。这也是一个庞大的网络。你是不是先试了一个Conv2D图层,然后测试了结果?我还没试过。我会试试的。但这是过度拟合吗?是的,当你的火车损失小于你的验证损失时,就会发生过度拟合,但是你有一个更大的问题,你的损失会随着时间的推移而增加,这是不应该发生的,因为这是一个最小化问题。很难说问题出在哪里。您也只提供您的网络,但您应该包括您的数据处理,以便其他人可以看到整个方法。数据预处理只涉及将3个通道中的每个通道的平均值减去一个数字,而不是以数据为中心的平均值图像。没有增加。你也除以标准差吗?你检查你的预测了吗?你可能会得到同样的预测。这也是一个庞大的网络。你是不是先试了一个Conv2D图层,然后测试了结果?我还没试过。我会试试的。但是这是不是太合适了?是的,你是太合适了,当你的火车损失较小时就会发生这种情况
然而,与验证损失相比,您有一个更大的问题,即您的损失随着时间的推移而增加,这是不应该发生的,因为这是一个最小化问题。很难说问题出在哪里。您也只提供您的网络,但您应该包括您的数据处理,以便其他人可以看到整个方法。数据预处理只涉及将3个通道中的每个通道的平均值减去一个数字,而不是以数据为中心的平均值图像。没有增广,你也除以标准差吗?