与前一个时期相比更高的起始损失

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的批次/数据的损失会更高。

对于第二个问题

很难说损失的某个数值对网络来说是好是坏,因为您的验证损失将取决于许多因素。其中包括您正在使用的损失函数、使用了多少数据点来计算损失等。只要您的模型符合您在 评估指标 .

中定义的性能标准,损失的数值就无关紧要