2017-07-11 7 views
0

ケラ、特に時系列の異常検出用のLSTMを学習しようとしています。しかし何らかの理由で、動作していません。私はTypeError: only integer scalar arrays can be converted to a scalar indexに関連する以前の投稿で提案されたようにしましたが、何も機能しませんでした。それから、私はそれがニンピーと関係があることを集める。ここに私のコードは次のとおりです。Keras - TypeError:整数スカラー配列のみスカラーインデックスに変換することができます

import numpy 
import pandas 
import matplotlib.pyplot as plt 
import math 
import tensorflow as tf 
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 

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

#load the dataset 
dataframe = pandas.read_csv('international-airline-passengers.csv', usecols=[1], engine='python', skipfooter=3) 
dataset = dataframe.values 
dataset = dataset.astype('float32') 

#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 = create_dataset(train, look_back)[0] 
trainY = create_dataset(train, look_back)[0] 
testX = create_dataset(test, look_back)[0] 
testY = create_dataset(test, look_back)[0] 

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

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

#make predictions 
trainPredict = model.predict(trainX) 
testPredict = model.predict(testX) 

#invert predictions 
trainPredict = scaler.inverse_transform(trainPredict) 
trainY = scaler.inverse_transform([trainY])[0] 

# calculate root mean squared error 
trainScore = math.sqrt(mean_squared_error(train[0], trainPredict[:,0])) 
print('Train Score: %.2f RMSE' % (trainScore)) 
testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0])) 
print('Test Score: %.2f' % (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() 

と私はエラーを取得することから:

Using TensorFlow backend. 
96 48 
Traceback (most recent call last): 
    File "C:\Users\fires\Anaconda3\envs\python3.5\lib\site-packages\numpy\core\fromnumeric.py", line 57, in _wrapfunc 
    return getattr(obj, method)(*args, **kwds) 
TypeError: only integer scalar arrays can be converted to a scalar index 


During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:/Users/fires/PycharmProjects/RSI/Test 1.py", line 52, in <module> 
    trainX = numpy.reshape(trainX, (trainX[0], 1, trainX.shape[1]))[0] 
    File "C:\Users\fires\Anaconda3\envs\python3.5\lib\site-packages\numpy\core\fromnumeric.py", line 232, in reshape 
    return _wrapfunc(a, 'reshape', newshape, order=order) 
    File "C:\Users\fires\Anaconda3\envs\python3.5\lib\site-packages\numpy\core\fromnumeric.py", line 67, in _wrapfunc 
    return _wrapit(obj, method, *args, **kwds) 
    File "C:\Users\fires\Anaconda3\envs\python3.5\lib\site-packages\numpy\core\fromnumeric.py", line 47, in _wrapit 
    result = getattr(asarray(obj), method)(*args, **kwds) 
TypeError: only integer scalar arrays can be converted to a scalar index 
+0

'Tensorflow backendの使用はエラーメッセージではありません。Keranoを他のバックエンド(Theano、最近はCNTK)と一緒に走らせることができるので有益なメッセージです。投稿のタイトルを適宜更新しました – desertnaut

答えて

2

あなたは非整数の長さにあなたのアレイを再構築しようとしています。

次のコードを記述しました。

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

は、しかし、私はあなたが trainX.shape[0]代わりの trainX[0]意味疑い。これにより、 only integer arrays can be converted to a scalar indexエラーが修正されます。しかし、これ以下の行では、にはシェイプ引数が必要なため、 testX = numpy.reshape(testX)と書かれています。無効です。私はあなたがその行で達成しようとしていることを正確には分かりませんが、うまくいけばあなたの注意を喚起して問題を解決してください!

関連する問題