【问题标题】:Avoiding overfitting in LSTM避免 LSTM 中的过拟合
【发布时间】:2020-05-20 04:29:43
【问题描述】:

我使用 Keras 和 TensorFlow 编写了代码来识别循环数据集中的模式。我担心的是过度拟合以及如何避免过度拟合。现在,从损失值和准确率来看,我似乎已经过拟合了。代码如下:

#importing libraries
import numpy as np
import pandas as pd
import os
import math
import matplotlib.pyplot as plt
import tensorflow as tf
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from pandas import read_csv
from matplotlib import pyplot
import tensorflow.keras.backend as K
from keras.layers import Dense, Activation
from keras.layers.recurrent import LSTM
from keras import backend as K
from keras.models import Sequential
from sklearn.metrics import mean_squared_error
from keras.layers import InputLayer

# Reading dataset
df = pd.read_excel("concate35w270.xlsx")
df = df.astype('float32')
df.head()


scaler = MinMaxScaler(feature_range= (0,1))
df = scaler.fit_transform(df)

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.25, random_state = 0)

#Looking last time step

def create_dataset(dataset, look_back=1):
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i+look_back), 0]
        dataX.append(a)
        dataY.append(dataset[i + look_back, 0])
    return np.array(dataX), np.array(dataY
# Reshaping dataset
# reshape into X=t and Y=t+1
look_back = 1
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)

look_back = 1
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)


# reshape input to be [samples, time steps, features]
trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1]))




# Network Architecture 

# create and fit the LSTM network
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.LSTM(1, input_shape=(1, look_back)))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, activation = tf.nn.relu))
#model.add(tf.keras.layers.Dense(128, activation = tf.nn.relu))
model.add(tf.keras.layers.Dense(1, activation = 'sigmoid'))



def coeff_determination(y_true, y_pred):
    SS_res =  K.sum(K.square( y_true-y_pred ))
    SS_tot = K.sum(K.square( y_true - K.mean(y_true) ) )
    return ( 1 - SS_res/(SS_tot + K.epsilon()) )

model.compile(optimizer='sgd', 
         loss='mse',
         metrics = [coeff_determination])



model.fit(trainX, trainY, epochs = 30)

在开始使用训练数据集拟合模型后,我从机器上看到了这样的按摩:

Epoch 1/30
702543/702543 [==============================] - 64s 91us/sample - loss: 0.0376 - coeff_determination: 0.4673
Epoch 2/30
702543/702543 [==============================] - 61s 86us/sample - loss: 0.0015 - coeff_determination: 0.9791
Epoch 3/30
702543/702543 [==============================] - 60s 86us/sample - loss: 0.0014 - coeff_determination: 0.9802
Epoch 4/30
702543/702543 [==============================] - 64s 91us/sample - loss: 0.0013 - coeff_determination: 0.9812
Epoch 5/30
702543/702543 [==============================] - 68s 97us/sample - loss: 0.0013 - coeff_determination: 0.9820
Epoch 6/30
702543/702543 [==============================] - 67s 96us/sample - loss: 0.0012 - coeff_determination: 0.9827
Epoch 7/30
702543/702543 [==============================] - 67s 95us/sample - loss: 0.0012 - coeff_determination: 0.9834

我想我应该定义一个惩罚以避免过度拟合,我该怎么做? 所有帮助将不胜感激。

【问题讨论】:

  • 我认为这篇文章总体上会有所帮助:towardsdatascience.com/…
  • @ShivamMohan 感谢您的评论,我需要知道,从头开始编写自己的代码是否很好,而有很多库具有强大的 API 可以做同样的事情?我不想写,因为我认为它不必要地重新发明轮子。你能把你的想法给我吗?
  • 抱歉,您的问题毫无意义,检查过度拟合的唯一方法是使用验证数据,而您没有提供此数据。您不能仅使用训练数据或训练损失来推断过度拟合。
  • @MatiasValdenegro 我没有明白你的意思。如果你的意思是我上面提到的代码没有提供关于是否过度拟合的信息,因为只是放置了训练数据,你是对的,我必须更进一步才能确定。但是,我想知道编写自己的代码还是使用准备好的库好?
  • 这似乎与您问题中的问题不同,请将问题和所有详细信息放在您的帖子中。

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

您的 测试 数据用于监控模型对训练数据的过度拟合,因此您必须在 .fit 方法中插入 validation_data 参数,如下所示:

model.fit(trainX, trainY, validation_data=(testX, testY), epochs=30)

详细信息您可以在my answer here获取。

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 2019-05-08
    • 2019-12-15
    • 2020-06-24
    • 2021-07-23
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    相关资源
    最近更新 更多