2017-10-10 9 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上でこれを実行しようとしました。ケラスv 2.0.4および2.0.8のウインドウで2.0.5のウブントでテスト済み(最新版はcondaから入手可能)同じコードが、ウィンドウ/ Ubuntuの上で非常に異なる精度(Keras/Tensorflow)は

ウインドウの精度は17%であり、カテゴリクロスエントロピーは〜2にあります。収束が、それは一貫し

はUbuntuの上の精度は98%で、カテゴリcrossentropyが0であるように思われ、それが実際に

コードだけ差が、CSV CSVファイルへのパスでは変更されませんが起動しますファイルはまったく同じです。このような劇的な違いを引き起こす可能性があるのは何ですか?

は私がランダムに初期化TF /ドロップアウトとしてそれを書くことができ、差がパーセントまたは2されていたが、あるとして、純粋なチャンスに

編集することが多すぎるのです:ソリューションはカテゴリcsvファイルを固定することが判明しましたファイルではありましたが、Windowsで作成されたときにLinuxでうまくプレイするために必要なことが他にもありました。あなたは問題が最初に移植されたCSVファイルを、であることが判明したkeras

+1

あなたは2日後にあなた自身の答えを受け入れることができます。 – charlesreid1

答えて

3

をインポートする前に設定する

+1

WindowsツールにUTF-8で保存するよう依頼すると、UTF-8でエンコードされたバイトオーダーマークがデータの前に付加され、通常CR-LFがライン区切り文字として使用されます。これらの機能は、Posix-yツールを混乱させる可能性があります。私は、LibreOfficeがBOMを取り除き、CR-LFラインセパレータをLFラインターミネータに変換すると思われます。多分これらの違いの1つが問題の原因でした。 –

1

np.random.seed(12)ニーズを「受け入れ」と私は自分の答えをマークするために許可されてるかどうかはわかりません窓から。彼らはutf-8形式で保存されましたが、私はまだlibreofficeに行き、linux csvファイルとして保存する必要がありました。

初期状態では、読み込みに失敗しませんでしたが、1ホットエンコードは正しく行われず、1ホットエンコードはすべて0になりました。明らかに非常に高い精度につながります。

+0

Kerasをインポートする前に種を設定する必要がありますか?私は輸入後に種子を入れ、うまくいった。 –

+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 –

関連する問題