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"
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