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
'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