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

Tôi đã chạy trên Ubuntu và trên Windows. Thử nghiệm trên các cửa sổ với keras v 2.0.4 và 2.0.8, trên ubuntu với 2.0.5 (phiên bản mới nhất có sẵn thông qua conda)Cùng một mã, độ chính xác rất khác nhau trên windows/ubuntu (Keras/Tensorflow)

Độ chính xác trên cửa sổ là 17% và đường chéo phân loại là ~ 2, từ từ hội tụ nhưng nó luôn bắt đầu có

tính chính xác trên ubuntu là 98% và crossentropy phân loại dường như là 0, và nó không thực sự thay đổi

sự khác biệt mã chỉ là đường dẫn đến file csv, csv các tệp hoàn toàn giống nhau. Điều gì có thể gây ra sự khác biệt quyết liệt như vậy?

Đã sự khác biệt là một hoặc hai phần trăm, tôi có thể viết nó đi như bỏ học/tf khởi tạo ngẫu nhiên, nhưng như là nó quá nhiều để có cơ hội tinh khiết

chỉnh sửa: giải pháp chứng minh được sửa csv phân loại tập tin, mặc dù họ đã utf-8 dường như có một cái gì đó khác cần thiết để có được chúng để chơi tốt đẹp với Linux khi chúng được tạo ra trong cửa sổ. Tôi không chắc chắn nếu tôi cho phép để đánh dấu câu trả lời của riêng tôi là "chấp nhận"

+1

Bạn sẽ có thể chấp nhận câu trả lời của riêng mình sau 2 ngày. – charlesreid1

Trả lời

3

Vấn đề này được chứng minh là trong các tập tin csv, được chuyển ban đầu từ cửa sổ. mặc dù chúng được lưu ở định dạng utf-8, tôi vẫn cần phải truy cập libreoffice và lưu chúng dưới dạng tệp csv linux.

Trong trạng thái ban đầu, chúng không tải được, nhưng không mã hóa một cách nóng một cách chính xác, dẫn đến tất cả các mã hóa nóng là 0. Rõ ràng dẫn đến độ chính xác rất cao.

+1

Khi bạn yêu cầu một công cụ Windows để lưu trong UTF-8, nó thường sẽ tiền tố dữ liệu với một dấu byte-mã hóa UTF-8, và nó có khả năng sẽ sử dụng CR-LF làm các dấu tách dòng. Những tính năng này có thể gây nhầm lẫn cho các công cụ Posix-y. Tôi nghi ngờ LibreOffice sẽ loại bỏ BOM và chuyển đổi các bộ phân tách dòng CR-LF thành các đầu cuối dòng LF. Có lẽ một trong những khác biệt này gây ra vấn đề. –

1

np.random.seed(12) cần phải được đặt trước khi bạn nhập keras

+0

Có cần thiết đặt hạt giống trước khi nhập Keras không? Tôi đã đặt hạt giống sau khi nhập khẩu và đã làm việc tốt. –

+0

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

+0

Cảm ơn bạn cho nhận xét của bạn, mặc dù điều đó không chứng minh được vấn đề Tôi đã nhận thấy rằng nhập tensorflow.set_random_seed và cài đặt có tác động mạnh đến giá trị ban đầu của chỉ số độ chính xác, nhưng điều này là do khả năng tương thích csv giữa các cửa sổ và ubuntu –

Các vấn đề liên quan