import pandas as pd
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import LSTM
from keras.optimizers import Adam
from sklearn.preprocessing import MinMaxScaler
def create_dataset(dataset, datasetClass, look_back):
dataX, dataY = [], []
for i in range(len(dataset)-look_back-1):
a = dataset[i:(i+look_back), 0]
dataX.append(a)
dataY.append(datasetClass[:,(i+look_back):(i+look_back+1)])
return np.array(dataX), np.array(dataY)
def one_hot_encode(dataset):
data = np.zeros((11, len(dataset)),dtype='int')
for i in range(len(dataset)):
data[dataset[i]-1,i] = 1
return data
#Set a seed for repeatable results
np.random.seed(12)
dataframe = pd.read_csv('time-series.csv', usecols=[1], engine='python')
dataset = dataframe.values
dataset = dataset.astype('float32')
dataframeClass = pd.read_csv('time-series-as-class.csv', usecols=[1], engine='python')
datasetClass = dataframeClass.values
datasetClass = datasetClass.astype('int')
datasetClass = one_hot_encode(datasetClass)
#normalize input vals
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
#separate to test/train
train_size = int(len(dataset) * 0.67)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size, :], dataset[train_size:len(dataset), :]
trainClass, testClass = datasetClass[:, 0:train_size,], datasetClass[:, train_size:len(dataset)]
#set up sliding windows
look_back = 150
trainX, trainY = create_dataset(train, trainClass, look_back)
testX, testY = create_dataset(test, testClass, look_back)
#reformat for proper passing to nn
trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1]))
trainY = np.squeeze(trainY, 2)
testY = np.squeeze(testY, 2)
# create and fit the LSTM network
model = Sequential()
model.add(LSTM(15, input_shape=(1,look_back)))
model.add(Dense(22,activation='tanh'))
model.add(Dropout(0.2))
model.add(Dense(11,activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['categorical_accuracy'])
print(model.summary())
model.fit(trainX, trainY, epochs=90, batch_size=1, verbose=2)
# make predictions
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)
J'ai exécuter sur Ubuntu et sous Windows. Testé sur Windows avec keras v 2.0.4 et 2.0.8, sur Ubuntu avec 2.0.5 (dernière version disponible par conda)Même code, très différent précision sur les fenêtres/ubuntu (Keras/tensorflow)
La précision sur les fenêtres est à 17% et la crossentropy catégorique est à ~ 2, il lentement converge, mais il commence toujours là
la précision sur ubuntu est de 98% et le crossentropy catégorique semble être 0, et il ne change pas réellement
la seule différence de code est chemin vers les fichiers csv, csv les fichiers sont exactement les mêmes. Qu'est-ce qui pourrait causer une telle différence?
Had la différence a été une ou deux pour cent, je pouvais la considérer comme le décrochage/tf initialisation au hasard, mais tout comme il est trop pour être pur hasard
modifier: La solution consiste à fixer le csv catégorique Les fichiers, même s'ils étaient utf-8, apparemment, il y a quelque chose d'autre à faire pour qu'ils jouent bien avec linux quand ils ont été créés dans Windows. Je ne sais pas si je suis autorisé à marquer ma réponse comme « accepté »
Vous serez en mesure d'accepter votre propre réponse après 2 jours. – charlesreid1