因此,我一直在尝试对这个CSV文件应用LSTM 我试图训练的CSV文件
然而,它似乎可以自我训练,但在训练之后,我的测试文件出现了问题,出现错误1,如果我稍微修改一下,就会得到另一个错误,显示“值错误:无法将大小为1047835的数组重塑为指定形状”。
这是我正在实现的代码:
import mathimport matplotlib.pyplot as pltimport kerasimport pandas as pdimport numpy as npimport osos.environ["CUDA_VISIBLE_DEVICES"] = "-1" #由于GPU能力为3.0,不得不使用CPUfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import LSTMfrom keras.layers import Dropoutfrom keras.layers import *from sklearn.preprocessing import MinMaxScalerfrom sklearn.metrics import mean_squared_errorfrom sklearn.metrics import mean_absolute_errorfrom sklearn.model_selection import train_test_splitfrom keras.callbacks import EarlyStopping df=pd.read_csv(r'C:\Users\LambertThePrick\Desktop\Databysir\LSTM.csv')print(df.shape)print(df.head(5))#df.head(5) TrainPart=df.iloc[:800,1:3].valuestest_set=df.iloc[800:,1:3].valuesscaler=MinMaxScaler(feature_range=(0,1))Trainpart_scaled=scaler.fit_transform(TrainPart)print(Trainpart_scaled) X_Train=[]Y_Train=[]for i in range(60,800): X_Train.append(Trainpart_scaled[i-60:i,0]) Y_Train.append(Trainpart_scaled[i,0])X_Train,Y_Train=np.array(X_Train),np.array(Y_Train)X_Train = np.reshape(X_Train, (X_Train.shape[0], X_Train.shape[1], 1))# print(X_train = np.reshape(X_Train, (X_Train.shape[0], X_Train.shape[1], 1)))#(740, 60, 1) model = Sequential()#添加第一个LSTM层和一些Dropout正则化model.add(LSTM(units = 50, return_sequences = True, input_shape = (X_Train.shape[1], 1)))model.add(Dropout(0.2))# 添加第二个LSTM层和一些Dropout正则化model.add(LSTM(units = 50, return_sequences = True))model.add(Dropout(0.2))# 添加第三个LSTM层和一些Dropout正则化model.add(LSTM(units = 50, return_sequences = True))model.add(Dropout(0.2))# 添加第四个LSTM层和一些Dropout正则化model.add(LSTM(units = 50))model.add(Dropout(0.2))# 添加输出层model.add(Dense(units = 1))# 编译RNNmodel.compile(optimizer = 'adam', loss = 'mean_squared_error')# 将RNN拟合到训练集model.fit(X_Train, Y_Train, epochs = 100, batch_size = 32) #这是实验之后 dataset_train = df.iloc[:800, 1:3]dataset_test = df.iloc[800:, 1:3]dataset_total = pd.concat((dataset_train, dataset_test), axis = 0)inputs = dataset_total[len(dataset_total) - len(dataset_test) - 60:].valuesinputs = inputs.reshape(-1,1)inputs = scaler.transform(inputs)X_Test = []for i in range(60, 800): X_Test.append(inputs[i-60:i, 0])X_Test = np.array(X_Test)X_Test = np.reshape(X_Test, (X_Test.shape[0], X_Test.shape[1], 1))print(X_Test.shape) predicted_stock_price = model.predict(X_Test)predicted_stock_price = scaler.inverse_transform(predicted_stock_price) plt.plot(df.loc[800:, 'Date'],dataset_test.values, color = 'red', label = '实际ASTL股票价格')plt.plot(df.loc[800:, 'Date'],predicted_stock_price, color = 'blue', label = '预测的ASTL股票价格')plt.xticks(np.arange(0,459,50))plt.title('ASTL股票价格预测')plt.xlabel('时间')plt.ylabel('ASTL股票价格')plt.legend()plt.show()
回答:
在你的重塑过程中,你会遇到非整数除法的情况。看这个例子:
import numpy as npdata = np.zeros(3936)out = data.reshape((-1,1,24,2))
因为3936/24/2的结果是一个整数82
,所以运行得很好。
但在这个例子中
import numpy as npdata = np.zeros(34345)out = data.reshape((-1,1,24,2))
你会得到错误信息值错误:无法将大小为34345的数组重塑为形状(1,24,2)
,因为除法结果不是整数。
所以,像你这样循环操作肯定会导致这类问题。