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上运行了它。在keras v 2.0.4和2.0.8的Windows上进行了测试,在Ubuntu 2.0.5上进行了测试(最新版本可通过conda获得)
窗口的精度为17%,分类交叉熵为〜2,缓慢收敛,但始终从那里开始
ubuntu的准确性为98%,分类交叉熵似乎为0,并且实际上并没有变化
唯一的代码差异是csv文件的路径,这些csv文件完全相同。有什么可能导致如此巨大的差异?
如果差异是一两个百分点,我可以将其记为dropout/tf随机初始化,但由于它太多了,所以纯属偶然
编辑:解决方案被证明可以修复分类的csv文件,尽管它们显然是utf-8,但在Windows中创建它们时,还需要其他一些措施才能使它们与linux配合使用。我不确定是否可以将自己的答案标记为“已接受”
最佳答案
事实证明,问题出在csv文件中,该文件最初是从Windows移植的。尽管它们以utf-8格式保存,但我仍然需要转到libreoffice并将其另存为linux csv文件。
在其初始状态下,它们没有加载失败,但没有正确执行一键编码,从而导致所有一键编码均为0。显然,这导致了很高的准确性。
关于windows - 相同的代码,在Windows/Ubuntu(Keras/Tensorflow)上的准确性差异很大,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46672864/