我有一个依赖历史数据的多分类问题。我尝试使用LSTM,损失函数为’sparse_categorical_crossentropy’。训练准确率增加,损失减少。但是,我的测试准确率开始剧烈波动。
我做错了什么?
输入数据:
X = np.reshape(X, (X.shape[0], X.shape[1], 1))X.shape(200146, 13, 1)
我的模型
# 为了重现性,固定随机种子seed = 7np.random.seed(seed)# 定义10折交叉验证测试工具kfold = StratifiedKFold(n_splits=10, shuffle=False, random_state=seed)cvscores = []for train, test in kfold.split(X, y): regressor = Sequential() # Units = 我们希望在第一层中拥有的LSTM数量 -> 我们希望有很高的维度,需要高数量 # return_sequences = True,因为我们在这之后要添加另一层 # input shape = 最后两个维度和指示器 regressor.add(LSTM(units=50, return_sequences=True, input_shape=(X[train].shape[1], 1))) regressor.add(Dropout(0.2)) # 额外的LSTM层 regressor.add(LSTM(units=50, return_sequences=True)) regressor.add(Dropout(0.2)) # 第三层 regressor.add(LSTM(units=50, return_sequences=True)) regressor.add(Dropout(0.2)) # 第四层 regressor.add(LSTM(units=50)) regressor.add(Dropout(0.2)) # 输出层 regressor.add(Dense(4, activation='softmax', kernel_regularizer=regularizers.l2(0.001))) # 编译RNN regressor.compile(optimizer='adam', loss='sparse_categorical_crossentropy',metrics=['accuracy']) # 设置回调函数以提前停止训练并保存迄今为止的最佳模型 callbacks = [EarlyStopping(monitor='val_loss', patience=9), ModelCheckpoint(filepath='best_model.h5', monitor='val_loss', save_best_only=True)] history = regressor.fit(X[train], y[train], epochs=250, callbacks=callbacks, validation_data=(X[test], y[test])) # 绘制训练和验证损失 pyplot.plot(history.history['loss']) pyplot.plot(history.history['val_loss']) pyplot.title('model train vs validation loss') pyplot.ylabel('loss') pyplot.xlabel('epoch') pyplot.legend(['train', 'validation'], loc='upper right') pyplot.show() # 评估模型 scores = regressor.evaluate(X[test], y[test], verbose=0) print("%s: %.2f%%" % (regressor.metrics_names[1], scores[1]*100)) cvscores.append(scores[1] * 100)print("%.2f%% (+/- %.2f%%)" % (np.mean(cvscores), np.std(cvscores)))
结果:
回答:
你描述的是过拟合现象。这意味着你的模型一直在学习你的训练数据,而不能泛化,或者说它在学习训练集的具体特征。这是深度学习中你需要处理的主要问题。并没有一个固定的解决方案。你需要尝试不同的架构、不同的超参数等等。
你可以尝试使用一个较小的模型,让它欠拟合(即训练准确率和验证准确率都处于较低百分比),然后逐渐增加你的模型,直到它过拟合。然后你可以调整优化器和其他超参数。
这里的较小模型是指具有较少隐藏单元或较少层的模型。