2017-03-24 98 views
3

大家早上好。我試圖用keras和pandas來實現這個LSTM算法來讀取csv文件。我使用的後端是Tensorflow。在預測訓練集之前,我在反轉結果時遇到了問題。下面是我的代碼LSTM-Keras錯誤:ValueError:具有形狀(67704,1)的非廣播輸出操作數與廣播形狀(67704,12)不匹配

import numpy 
import matplotlib.pyplot as plt 
import pandas 
import math 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.layers import LSTM 
from sklearn.preprocessing import MinMaxScaler 
from sklearn.metrics import mean_squared_error 


#plt.plot(dataset) 
#plt.show() 

#fix random seed for reproducibility 
numpy.random.seed(7) 

#Load dataset 
col_names = ['UserID','SysTouchTime', 'EventTime', 'ActivityTouchID', 'Pointer_count', 'PointerID', 
       'ActionID', 'Touch_X', 'Touch_Y', 'Touch_Pressure', 'Contact_Size', 'Phone_Orientation'] 
dataframe = pandas.read_csv('touchEventsFor5Users.csv', engine='python', header=None, names = col_names, skiprows=1) 
#print(dataset.head()) 
#print(dataset.shape) 
dataset = dataframe.values 
dataset = dataframe.astype('float32') 
print(dataset.isnull().any()) 
dataset = dataset.fillna(method='ffill') 
feature_cols = ['SysTouchTime', 'EventTime', 'ActivityTouchID', 'Pointer_count', 'PointerID', 'ActionID', 'Touch_X', 'Touch_Y', 'Touch_Pressure', 'Contact_Size', 'Phone_Orientation'] 

X = dataset[feature_cols] 
y = dataset['UserID'] 
print(y.head()) 
#normalize the dataset 
scaler = MinMaxScaler(feature_range=(0, 1)) 
dataset = scaler.fit_transform(dataset) 

# split into train and test sets 

train_size = int(len(dataset) * 0.67) 
test_size = len(dataset) - train_size 
train, test = dataset[0:train_size, :], dataset[train_size:len(dataset),:] 
print(len(train), len(test)) 

# convert an array of values into a dataset matrix 
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 numpy.array(dataX), numpy.array(dataY) 

# 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) 

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

#create and fit the LSTM network 
model = Sequential() 
model.add(LSTM(4, input_dim=look_back)) 
model.add(Dense(1)) 
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy']) 
model.fit(trainX, trainY, epochs=1, batch_size=32, verbose=2) 

# make predictions 
trainPredict = model.predict(trainX) 
testPredict = model.predict(testX) 
# invert predictions 
import gc 
gc.collect() 

#####problem occurs with the following line of code############# 

trainPredict = scaler.inverse_transform(trainPredict) 

trainY = scaler.inverse_transform([trainY]) 
testPredict = scaler.inverse_transform(testPredict) 
testY = scaler.inverse_transform([testY]) 
# calculate root mean squared error 
trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0])) 
print('Train Score: %.2f RMSE' % (trainScore)) 
testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0])) 
print('Test Score: %.2f RMSE' % (testScore)) 

#shift train predictions for plotting 
trainPredictPlot = numpy.empty_like(dataset) 
trainPredictPlot[:, :] = numpy.nan 
trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict 
# shift test predictions for plotting 
testPredictPlot = numpy.empty_like(dataset) 
testPredictPlot[:, :] = numpy.nan 
testPredictPlot[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict 
# plot baseline and predictions 
plt.plot(scaler.inverse_transform(dataset)) 
plt.plot(trainPredictPlot) 
plt.plot(testPredictPlot) 
plt.show() 

,我得到的是

ValueError異常錯誤:與形狀非broadcastable輸出操作數(67704,1)廣播形狀不匹配(67704,12)

想你們可以幫我解決這個問題嗎?我對此非常陌生,但想要學習它如此糟糕,而這個錯誤正在讓我受苦!感謝您提供的任何幫助。

回答

2

當您縮放數據時,它將以不同的方式縮放12個字段。它將採用每個字段的最小值,並將其轉換爲0到1的值。

當你做一個invert_transform時,它對這個函數沒有意義,因爲你只給它一個字段,它不知道該如何處理它,最小值和最大值是多少......你需要提供一個12字段的數據集,這個預測字段在正確的位置。

嘗試有問題​​的行之前添加此:

# create empty table with 12 fields 
trainPredict_dataset_like = np.zeros(shape=(len(train_predict), 12)) 
# put the predicted values in the right field 
trainPredict_dataset_like[:,0] = trainPredict[:,0] 
# inverse transform and then select the right field 
trainPredict = scaler.inverse_transform(trainPredict_dataset_like)[:,0] 

這是否幫助? :)

+0

謝謝你的回覆!我加了你的代碼的建議權之前: trainPredict = scaler.inverse_transform(trainPredict) 而這個錯誤是給予: 文件 「C:/Users/Gunn/PycharmProjects/airplaneLSTM/lstm.py」,行80,在 trainPredict_dataset_like [:,0] = trainPredict ValueError:無法從形狀(67704,1)廣播輸入數組成形狀(101055) – Jamiel

+0

不錯。所以做到了這一點,它有同樣的錯誤,但不同的數字,所以進步!這是錯誤: ValueError:無法將形狀(67704,1)中的輸入數組廣播成形(67704)............是否可能是由於trainX是單維陣列? – Jamiel

+0

再次編輯:) –

相關問題