在本教程中,您将发现如何诊断LSTM模型对序列预测问题的拟合。完成本教程后,您将了解:如何收集和绘制LSTM模型的训练历史记录。如何识别欠拟合、更好拟合和过度拟合模型。如何通过平均多个模型运行来开发更强大的诊断。开始吧。1.Keras中的训练历史您可以通过查看模型的性能如何随时间变化来了解有关模型行为的更多信息。LSTM模型通过调用fit()函数进行训练。此函数返回一个名为history的变量,其中包含损失函数的轨迹以及在模型编译期间标记的任何指标。这些分数将在每个纪元结束时记录下来。...history=model.fit(...)例如,如果您的模型被编译为优化logloss(binary_crossentropy),并且您想在每个epoch测量准确度,那么logloss和accuracy将被计算并记录在每个训练时期的历史中。可以通过调用fit()获得的历史记录中的键访问每个分数。默认情况下,拟合模型时优化的损失函数为“loss”,准确率为“acc”。model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])history=model.fit(X,Y,epochs=100)print(history.history['loss'])打印(history.history['acc'])Keras还允许在拟合模型时指定独立的验证数据集,也可以使用相同的损失函数和度量对其进行评估。可以通过在fit()中设置validation_split参数来启用此功能,将训练数据的一部分拆分为验证数据集。history=model.fit(X,Y,epochs=100,validation_split=0.33)也可以通过设置validation_data参数并将X和Y数据集的元组传递给它来执行此功能。history=model.fit(X,Y,epochs=100,validation_data=(valX,valY))在验证数据集上计算的指标将使用相同的名称,但会附加一个“val_”前缀。...model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])history=model.fit(X,Y,epochs=100,validation_split=0.33)print(history.history['loss'])print(history.history['acc'])print(history.history['val_loss'])print(history.history['val_acc'])2。诊断图LSTM模型的训练历史可以用来诊断模型行为。您可以使用Matplotlib库来可视化性能。您可以绘制训练损失和测试损失以进行比较,如下所示:损失'])pyplot.plot(history.history['val_loss'])pyplot.title('modeltrainvsvalidationloss')pyplot.ylabel('loss')pyplot。xlabel('epoch')pyplot.legend(['train','validation'],loc='upperright')pyplot.show()创建和检查这些图可以帮助您找到可能优化模型性能配置的新图.接下来,让我们看一些例子。我们将从损失最小化的角度考虑训练集和验证集的建模技术。3.欠拟合示例欠拟合模型是在训练集上表现良好但在测试集上表现不佳的模型。这可以通过训练损失曲线低于验证损失曲线这一事实来诊断,并且验证集中的损失函数显示出被优化的趋势。下面是一个人为设计的小型欠拟合LSTM模型。fromkeras.modelsimportSequentialfromkeras.layersimportDensefromkeras.layersimportLSTMfrommatplotlibimportpyplotfromnumpyimportarray#returntrainingdatadefget_train():seq=[[0.0,0.1],[0.1,0.2],[0.2,0.3],[0.3,0.4],[0.4,0.5]]seq=array(seq)X,y=seq[:,0],seq[:,1]XX=X.reshape((len(X),1,1))returnX,y#returnvalidationdatadefget_val():seq=[[0.5,0.6],[0.6,0.7],[0.7,0.8],[0.8,0.9],[0.9,1.0]]seq=array(seq)X,y=seq[:,0],seq[:,1]XX=X.reshape((len(X),1,1))returnX,y#definemodelmodel.add(LSTM(10,input_shape=(1,1)))model.add(Dense(1,activation='linear'))#compilemodelmodel.compile(loss='mse',optimizer='adam')#fitmodelX,y=get_train()valX,valY=get_val()history=model.fit(X,y,epochs=100,validation_data=(valX,valY),shuffle=False)#plottrainandvalidationlosspyplot.plot(history.history['loss'])pyplot.plot(history.history['val_loss'])pyplot.title('modeltrainvsvalidationloss')pyplot.ylabel('loss')pyplot.xlabel('epoch')pyplot.legend(['train','validation'],loc='upperright')pyplot.show()运行此示例会生成训练损失和验证损失图,显示欠拟合模型的特征。在这种情况下,模型性能可能会随着训练时期数的增加而提高。欠拟合模型的诊断图此外,如果模型在训练集上的表现优于在验证集上的表现,并且模型性能曲线趋于稳定,则该模型也可能欠拟合。下面是一个欠拟合模型的例子,它缺少足够的记忆单元。fromkeras.modelsimportSequentialfromkeras.layersimportDensefromkeras.layersimportLSTMfrommatplotlibimportpyplotfromnumpyimportarray#returntrainingdatadefget_train():seq=[[0.0,0.1],[0.1,0.2],[0.2,0.3],[0.3,0.4],[0.4,0.5]]seq=array(seq)X,y=seq[:,0],seq[:,1]XX=X.reshape((5,1,1))returnX,y#returnvalidationdatadefget_val():seq=[[0.5,0.6],[0.6,0.7],[0.7,0.8],[0.8,0.9],[0.9,1.0]]seq=array(seq)X,y=seq[:,0],seq[:,1]XX=X。reshape((len(X),1,1))returnX,y#definemodelmodel.add(LSTM(1,input_shape=(1,1)))model.add(Dense(1,activation='linear'))#compilemodelmodel.compile(loss='mae',optimizer='sgd')#fitmodelX,y=get_train()valX,valY=get_val()history=model.fit(X,y,epochs=300,validation_data=(valX,valY),shuffle=False)#plottrainandvalidationlosspyplot.plot(history.history['loss'])pyplot.plot(history.history['val_loss'])pyplot.title('modeltrainvsvalidationloss')pyplot.ylabel('loss')pyplot.xlabel('epoch')pyplot.legend(['train','validation'],loc='upperright')pyplot.show()运行这个例子将展示内存不足的欠拟合模型的特征。在这种情况下,可以通过增加模型的容量来提高模型的性能,例如隐藏层中的记忆单元数量或隐藏层的数量。欠拟合模型状态诊断线图4.拟合良好示例模型拟合良好是指模型在训练集和验证集上的表现都较好。这可以通过训练损失和验证损失在同一点下降和稳定来诊断。下面的小例子描述了一个拟合良好的LSTM模型。fromkeras.modelsimportSequentialfromkeras.layersimportDensefromkeras.layersimportLSTMfrommatplotlibimportpyplotfromnumpyimportarray#returntrainingdatadefget_train():seq=[[0.0,0.1],[0.1,0.2],[0.2,0.3],[0.3,0.4],[0.4,0.5]]seq=array(seq)X,y=seq[:,0],seq[:,1]XX=X.reshape((5,1,1))returnX,y#returnvalidationdatadefget_val():seq=[[0.5,0.6],[0.6,0.7],[0.7,0.8],[0.8,0.9],[0.9,1.0]]seq=array(seq)X,y=seq[:,0],seq[:,1]XX=X。reshape((len(X),1,1))returnX,y#definemodelmodel.add(LSTM(10,input_shape=(1,1)))model.add(Dense(1,activation='linear'))#compilemodelmodel.compile(loss='mse',optimizer='adam')#fitmodelX,y=get_train()valX,valY=get_val()history=model.fit(X,y,epochs=800,validation_data=(valX,valY),shuffle=False)#plottrainandvalidationlosspyplot.plot(history.history['loss'])pyplot.plot(history.history['val_loss'])pyplot.title('modeltrainvsvalidationloss')pyplot.ylabel('loss')pyplot.xlabel('epoch')pyplot.legend(['train','validation'],loc='upperright')pyplot.show()运行此示例会创建一个折线图,其中训练损失和验证损失重叠。理想情况下,我们都希望我们的模型是这样的,尽管考虑到大量数据的挑战,这似乎不太可能。良好拟合模型的诊断线图5.过拟合示例过拟合模型是指模型在训练集上表现良好,并在某一点后继续增长,而其在验证集上的表现达到某一点,然后开始下降。这可以用一个折线图来诊断,其中训练损失不断下降,验证损失下降到一个拐点,然后开始上升。下面的示例是过度拟合的LSTM模型。fromkeras.modelsimportSequentialfromkeras.layersimportDensefromkeras.layersimportLSTMfrommatplotlibimportpyplotfromnumpyimportarray#returntrainingdatadefget_train():seq=[[0.0,0.1],[0.1,0.2],[0.2,0.3],[0.3,0.4],[0.4,0.5]]seq=array(seq)X,y=seq[:,0],seq[:,1]XX=X.reshape((5,1,1))returnX,y#returnvalidationdatadefget_val():seq=[[0.5,0.6],[0.6,0.7],[0.7,0.8],[0.8,0.9],[0.9,1.0]]seq=array(seq)X,y=seq[:,0],seq[:,1]XX=X。reshape((len(X),1,1))returnX,y#definemodelmodel.add(LSTM(10,input_shape=(1,1)))model.add(Dense(1,activation='linear'))#compilemodelmodel.compile(loss='mse',optimizer='adam')#fitmodelX,y=get_train()valX,valY=get_val()history=model.fit(X,y,epochs=1200,validation_data=(valX,valY),shuffle=False)#plottrainandvalidationlosspyplot.plot(history.history['loss'][500:])pyplot.plot(history.history['val_loss'][500:])pyplot.title('modeltrainvsvalidationloss')pyplot.ylabel('loss')pyplot.xlabel('epoch')pyplot.legend(['train','validation'],loc='upperright')使用pyplot.show()运行此示例将创建一个图表,显示过拟合模型验证集中的拐点,这可能是训练次数过多的标志。在这种情况下,模型会在拐点处停止训练。此外,训练样本的数量可能会增加。过拟合模型的诊断线图6.多次运行实例LSTM是随机的,这意味着每次运行它都会得到不同的诊断图。多次重复诊断运行(例如5、10、30次)很有用。可以绘制每次运行的训练和验证轨迹,以更稳健的方式记录模型随时间的行为。以下示例多次运行相同的实验,然后绘制每次运行的训练损失和验证损失轨迹。fromkeras.modelsimportSequentialfromkeras.layersimportDensefromkeras.layersimportLSTMfrommatplotlibimportpyplotfromnumpyimportarrayfrompandasimportDataFrame#returntrainingdatadefget_train():seq=[[0.0,0.1],[0.1,0.2],[0.2,0.3],[0.3,0.4],[0.4,0.5]]seq=数组(seq)X,y=seq[:,0],seq[:,1]XX=X.reshape((5,1,1))returnX,y#returnvalidationdatadefget_val():seq=[[0.5,0.6],[0.6,0.7],[0.7,0.8],[0.8,0.9],[0.9,1.0]]seq=array(seq)X,y=seq[:,0],seq[:,1]XX=X。重塑((len(X),1,1))returnX,y#collectdataacrossmultiplerepeatstrain=DataFrame()val=DataFrame()foriinrange(5):#definemodelmodel.add(LSTM(10,input_shape=(1,1)))model.add(Dense(1,activation='linear'))#compilemodelmodel.compile(loss='mse',optimizer='adam')X,y=get_train()valX,valY=get_val()#fitmodelhistory=model.fit(X,y,epochs=300,validation_data=(valX,valY),shuffle=False)#storyhistorytrain[str(i)]=history.history['loss']val[str(i)]=历史。历史['val_loss']#plottrainandvalidationlossacrossmultiplerunspyplot.plot(train,color='blue',label='train')pyplot.plot(val,color='orange',label='validation')pyplot.title('modeltrainvsvalidationloss')pyplot.ylabel('loss')pyplot.xlabel('epoch')pyplot.show()从下图中,我们可以看到5次运行中模型欠拟合的通常趋势,这个案例有力地证明了增加训练epoch数量的有效性模型运行了多次TheDiagnosticLine图表扩展阅读部分提供了更丰富的资源,如果你想深入挖掘的话。Keras的历史回调KerasAPI(HistoryCallbackKerasAPI,https://keras.io/callbacks/#history)维基百科机器学习中的学习曲线,https://en.wikipedia。org/wiki/Learning_curve#In_machine_learning)维基百科对过拟合的描述(OverfittingonWikipedia,https://en.wikipedia.org/wiki/Overfitting)原文:https://machinelearningmastery.com/diagnose-overfitting-underfitting-lstm-models/【本文为《机器之心》专栏原创翻译,微信公众号“机器之心(id:almosthuman2014)”】点此查看作者更多好文
