2017-10-10 3 views
5
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é »

+1

Vous serez en mesure d'accepter votre propre réponse après 2 jours. – charlesreid1

Répondre

3

La question se est révélée dans les fichiers csv, qui ont été initialement portés à partir de windows. Bien qu'ils aient été sauvegardés au format utf-8, je devais toujours aller à libreoffice et les sauvegarder en tant que fichiers linux csv. Dans leur état initial, ils n'ont pas manqué de charger, mais n'ont pas correctement codé à chaud, ce qui a fait que tous les codages à un seul codage à chaud étaient 0. Apparemment, cela conduit à une très grande précision.

+1

Lorsque vous demandez à un outil Windows de sauvegarder en UTF-8, il préfixera généralement les données avec un octet de commande codé en UTF-8, et il utilisera probablement CR-LF comme séparateur de ligne. Ces fonctionnalités peuvent confondre les outils Posix-y. Je suppose que LibreOffice supprime la nomenclature et convertit les séparateurs de ligne CR-LF en terminateurs de ligne LF. Peut-être que l'une de ces différences a causé le problème. –

1

np.random.seed(12) doit être réglé avant d'importer keras

+0

Est-ce nécessaire pour placer les graines avant d'importer des Keras? J'ai mis la graine après l'importation et ai fonctionné bien. –

+0

@SreeramTP oui: https://github.com/fchollet/keras/issues/2743 https://stackoverflow.com/questions/32419510/how-to-get-reproducible-results-in-keras – Brendan

+0

Remerciez J'ai trouvé que l'importation de tensorflow.set_random_seed et le réglage qui a un fort effet sur la valeur initiale de la métrique de précision, mais cela a été causé par la compatibilité csv entre windows et ubuntu –