2017-07-11 1 views
0

J'essaie d'apprendre keras, en particulier LSTM pour la détection d'anomalies dans les séries temporelles, et pour ce faire j'ai suivi les exemples en ligne. Pourtant, pour une raison quelconque, cela ne fonctionne pas. J'ai fait comme cela a été suggéré sur un post précédent concernant TypeError: only integer scalar arrays can be converted to a scalar index, mais rien n'a fonctionné. De cela, je suppose que cela a quelque chose à voir avec Numpy. Voici mon code:Keras - TypeError: seuls les tableaux scalaires entiers peuvent être convertis en un index scalaire

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

Et à partir de ce que je reçois les erreurs:

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

'L'utilisation de Tensorflow backend' n'est pas un message d'erreur - c'est un message informatif, puisque vous pouvez exécuter Keras avec d'autres backends (Theano, et récemment CNTK). J'ai mis à jour votre titre de poste en conséquence – desertnaut

Répondre

2

Vous essayez de remodeler votre tableau dans une longueur non entier.

Vous avez écrit le code suivant;

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

Cependant, je pense que vous voulez dire trainX.shape[0] au lieu de trainX[0]. Cela corrige l'erreur only integer arrays can be converted to a scalar index. Cependant, dans la ligne ci-dessous, vous avez écrit testX = numpy.reshape(testX), ce qui est invalide, car numpy.reshape nécessite un argument de forme. Je ne suis pas sûr exactement ce que vous essayez d'atteindre avec cette ligne, mais j'espère que porter ceci à votre attention résout votre problème!