与前一个时期相比更高的起始损失
Higher starting loss compared to previous epoch
我目前正在使用 https://keras.io/examples/vision/handwriting_recognition/ 中的代码,这是一个关于文本识别的教程。我正在使用本地数据集来测试模型。在我的实验过程中,我遇到了一些让我产生疑问的事情。
1.) 一个损失值开始比上一个损失值高是正常的吗?如果不是,可能是什么原因造成的,我该如何预防?
2.) val_loss 为 1 是否足以用于双 LSTM 网络?如果不能,我该如何减少损失?
这是两个连续纪元的片段。
1520/1520 [==============================] - 735s 484ms/step - loss: 2.5462 - val_loss: 2.7302
Epoch 12/100
443/1520 [=======>......................] - ETA: 8:18 - loss: 3.9221
以下是当前模型的总结
Layer (type) Output Shape Param # Connected to
==================================================================================================
image (InputLayer) [(None, 128, 32, 1) 0 []
]
Conv1 (Conv2D) (None, 128, 32, 32) 320 ['image[0][0]']
batchnorm1 (BatchNormalization (None, 128, 32, 32) 128 ['Conv1[0][0]']
)
pool1 (MaxPooling2D) (None, 64, 16, 32) 0 ['batchnorm1[0][0]']
Conv2 (Conv2D) (None, 64, 16, 64) 18496 ['pool1[0][0]']
Conv3 (Conv2D) (None, 64, 16, 64) 36928 ['Conv2[0][0]']
batchnorm2 (BatchNormalization (None, 64, 16, 64) 256 ['Conv3[0][0]']
)
pool2 (MaxPooling2D) (None, 32, 8, 64) 0 ['batchnorm2[0][0]']
reshape (Reshape) (None, 32, 512) 0 ['pool2[0][0]']
dense1 (Dense) (None, 32, 64) 32832 ['reshape[0][0]']
dropout_3 (Dropout) (None, 32, 64) 0 ['dense1[0][0]']
bidirectional_9 (Bidirectional (None, 32, 256) 197632 ['dropout_3[0][0]']
)
bidirectional_10 (Bidirectiona (None, 32, 256) 394240 ['bidirectional_9[0][0]']
l)
bidirectional_11 (Bidirectiona (None, 32, 128) 164352 ['bidirectional_10[0][0]']
l)
label (InputLayer) [(None, None)] 0 []
dense2 (Dense) (None, 32, 85) 10965 ['bidirectional_11[0][0]']
ctc_loss (CTCLayer) (None, 32, 85) 0 ['label[0][0]',
'dense2[0][0]']
==================================================================================================
Total params: 856,149
Trainable params: 855,957
Non-trainable params: 192
__________________________________________________________________________________________________
optimizer = Adam
batch_size = 64
total_dataset = 100,000+
activation = relu
回答第一个查询:
是的,开始时损失值高于前一个时期是很常见的。在每个时期,您的模型都在不同批次的数据上进行训练,并且在这些批次上累积或平均损失(取决于您的损失函数)。在纪元结束时,您会观察到整个数据集的损失。在下一个纪元开始时,您会观察到您的模型正在训练的第一批数据集的损失。
您的数据集(理想情况下)遵循您希望模型学习的一般模式。您的数据集的 批次 可能包含一般模式之外的 sub-pattern。在一个纪元结束时,假设您的模型之前已经暴露于 整个数据集 ,与 sub-pattern 相比,它可以更好地预测数据的一般模式.因此,包含sub-pattern的批次/数据的损失会更高。
对于第二个问题:
很难说损失的某个数值对网络来说是好是坏,因为您的验证损失将取决于许多因素。其中包括您正在使用的损失函数、使用了多少数据点来计算损失等。只要您的模型符合您在 评估指标 .
中定义的性能标准,损失的数值就无关紧要
我目前正在使用 https://keras.io/examples/vision/handwriting_recognition/ 中的代码,这是一个关于文本识别的教程。我正在使用本地数据集来测试模型。在我的实验过程中,我遇到了一些让我产生疑问的事情。
1.) 一个损失值开始比上一个损失值高是正常的吗?如果不是,可能是什么原因造成的,我该如何预防?
2.) val_loss 为 1 是否足以用于双 LSTM 网络?如果不能,我该如何减少损失?
这是两个连续纪元的片段。
1520/1520 [==============================] - 735s 484ms/step - loss: 2.5462 - val_loss: 2.7302
Epoch 12/100
443/1520 [=======>......................] - ETA: 8:18 - loss: 3.9221
以下是当前模型的总结
Layer (type) Output Shape Param # Connected to
==================================================================================================
image (InputLayer) [(None, 128, 32, 1) 0 []
]
Conv1 (Conv2D) (None, 128, 32, 32) 320 ['image[0][0]']
batchnorm1 (BatchNormalization (None, 128, 32, 32) 128 ['Conv1[0][0]']
)
pool1 (MaxPooling2D) (None, 64, 16, 32) 0 ['batchnorm1[0][0]']
Conv2 (Conv2D) (None, 64, 16, 64) 18496 ['pool1[0][0]']
Conv3 (Conv2D) (None, 64, 16, 64) 36928 ['Conv2[0][0]']
batchnorm2 (BatchNormalization (None, 64, 16, 64) 256 ['Conv3[0][0]']
)
pool2 (MaxPooling2D) (None, 32, 8, 64) 0 ['batchnorm2[0][0]']
reshape (Reshape) (None, 32, 512) 0 ['pool2[0][0]']
dense1 (Dense) (None, 32, 64) 32832 ['reshape[0][0]']
dropout_3 (Dropout) (None, 32, 64) 0 ['dense1[0][0]']
bidirectional_9 (Bidirectional (None, 32, 256) 197632 ['dropout_3[0][0]']
)
bidirectional_10 (Bidirectiona (None, 32, 256) 394240 ['bidirectional_9[0][0]']
l)
bidirectional_11 (Bidirectiona (None, 32, 128) 164352 ['bidirectional_10[0][0]']
l)
label (InputLayer) [(None, None)] 0 []
dense2 (Dense) (None, 32, 85) 10965 ['bidirectional_11[0][0]']
ctc_loss (CTCLayer) (None, 32, 85) 0 ['label[0][0]',
'dense2[0][0]']
==================================================================================================
Total params: 856,149
Trainable params: 855,957
Non-trainable params: 192
__________________________________________________________________________________________________
optimizer = Adam
batch_size = 64
total_dataset = 100,000+
activation = relu
回答第一个查询:
是的,开始时损失值高于前一个时期是很常见的。在每个时期,您的模型都在不同批次的数据上进行训练,并且在这些批次上累积或平均损失(取决于您的损失函数)。在纪元结束时,您会观察到整个数据集的损失。在下一个纪元开始时,您会观察到您的模型正在训练的第一批数据集的损失。
您的数据集(理想情况下)遵循您希望模型学习的一般模式。您的数据集的 批次 可能包含一般模式之外的 sub-pattern。在一个纪元结束时,假设您的模型之前已经暴露于 整个数据集 ,与 sub-pattern 相比,它可以更好地预测数据的一般模式.因此,包含sub-pattern的批次/数据的损失会更高。
对于第二个问题:
很难说损失的某个数值对网络来说是好是坏,因为您的验证损失将取决于许多因素。其中包括您正在使用的损失函数、使用了多少数据点来计算损失等。只要您的模型符合您在 评估指标 .
中定义的性能标准,损失的数值就无关紧要