2017-10-10 52 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) 

मैं इस Ubuntu पर और Windows पर चलने गए हैं। 2.0.5 (कोंडा के माध्यम से उपलब्ध नवीनतम संस्करण) के साथ ubuntu पर keras v 2.0.4 और 2.0.8 के साथ विंडोज़ पर परीक्षण किया गयाएक ही कोड, खिड़कियां/ubuntu पर बहुत अलग सटीकता (Keras/Tensorflow)

विंडोज़ पर सटीकता 17% है और स्पष्ट क्रॉसेंट्रॉपी ~ 2 पर है, धीरे-धीरे converges लेकिन यह लगातार शुरू होता है वहाँ

ubuntu पर सटीकता 98% है और स्पष्ट crossentropy 0 प्रतीत होता है, और यह वास्तव में

केवल कोड अंतर csv फ़ाइलें करने के लिए पथ है, csv परिवर्तन नहीं करता है फाइलें बिल्कुल वही हैं। संभवतः इतना कठोर अंतर क्या हो सकता है?

था अंतर एक या दो प्रतिशत कर दिया गया है, मैं/इसे बंद लिख सकता है छोड़ने वालों के रूप में बेतरतीब ढंग से आरंभ tf, लेकिन है, क्योंकि यह शुद्ध मौका होने के लिए

संपादित बहुत ज्यादा है: समाधान स्पष्ट सीएसवी फिक्सिंग जा साबित हुई फाइलें, हालांकि वे utf-8 थे, जाहिर है कि उन्हें विंडोज़ में बनाए जाने पर लिनक्स के साथ अच्छा खेलने के लिए कुछ और आवश्यक है। मुझे यकीन है कि अगर मैं अपने खुद के जवाब चिह्नित करने के लिए अनुमति दी हूँ के रूप में "स्वीकार किए जाते हैं"

+1

आप 2 दिनों के बाद अपना जवाब स्वीकार कर पाएंगे। – charlesreid1

उत्तर

3

आयात मुद्दा csv फ़ाइलें, जो मूल रूप मोड़ा गया में साबित हुई नहीं कर रहा हूँ खिड़कियों से हालांकि वे utf-8 प्रारूप में सहेजे गए थे, फिर भी मुझे libreoffice पर जाने और उन्हें linux csv फ़ाइलों के रूप में सहेजने की आवश्यकता थी।

अपने शुरुआती राज्य में, वे लोड करने में विफल नहीं हुए, लेकिन ठीक से एक-गर्म एन्कोड नहीं किया, जिससे सभी एक-गर्म एन्कोडिंग 0 हो गई। जाहिर है कि यह बहुत सटीकता की ओर जाता है।

+1

जब आप यूटीएफ -8 में सहेजने के लिए विंडोज उपकरण से पूछते हैं, तो यह आम तौर पर यूटीएफ -8-एन्कोडेड बाइट-ऑर्डर-मार्क के साथ डेटा को उपसर्ग करेगा, और यह सीआर-एलएफ का उपयोग लाइन विभाजक के रूप में करेगा। ये विशेषताएं Posix-y टूल्स को भ्रमित कर सकती हैं। मुझे संदेह है कि लिबर ऑफिस बीओएम को स्ट्रिप्स करता है और सीआर-एलएफ लाइन विभाजक को एलएफ लाइन टर्मिनेटर में परिवर्तित करता है। शायद इन मतभेदों में से एक ने समस्या पैदा की। –

1

np.random.seed(12) जरूरतों स्थापित किया जाना इससे पहले कि आप keras

+0

क्या केरा आयात करने से पहले बीज सेट करना आवश्यक है? मैंने आयात के बाद बीज निर्धारित किया है और ठीक काम किया है। –

+0

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

+0

धन्यवाद आप अपनी टिप्पणी के लिए, हालांकि यह समस्या साबित नहीं हुई थी, मुझे पता चला कि tensorflow.set_random_seed आयात करना और सेटिंग जो सटीकता मीट्रिक के प्रारंभिक मान पर एक मजबूत प्रभाव डालती है, लेकिन यह विंडोज़ के बीच सीएसवी संगतता के कारण हुई थी और ubuntu –

संबंधित मुद्दे