windows - 相同的代码,在 windows/ubuntu (Keras/Tensorflow) 上的准确性非常不同

标签 windows ubuntu tensorflow keras

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 上测试,在 2.0.5 的 ubuntu 上测试(最新版本可通过 conda 获得)

Windows 上的准确率为 17%,分类交叉熵约为 2,收敛缓慢但始终从那里开始

ubuntu 上的准确率为 98%,分类交叉熵看起来为 0,实际上并没有改变

唯一的代码差异是 csv 文件的路径,csv 文件完全相同。什么可能导致如此巨大的差异?

如果差异是一两个百分点,我可以将其记为 dropout/tf 随机初始化,但它太纯属偶然了

编辑:该解决方案被证明是修复分类 csv 文件,尽管它们是 utf-8 显然,当它们在 Windows 中创建时,还需要其他一些东西才能使它们在 linux 上正常运行。我不确定是否允许我将自己的答案标记为“已接受”

最佳答案

问题证明出在csv文件中,这些文件最初是从windows移植过来的。尽管它们是以 utf-8 格式保存的,但我仍然需要去 libreoffice 并将它们保存为 linux csv 文件。

在它们的初始状态下,它们并没有加载失败,但是没有正确的 one-hot 编码,导致所有的 one-hot 编码都为 0。显然这会导致非常高的准确性。

关于windows - 相同的代码,在 windows/ubuntu (Keras/Tensorflow) 上的准确性非常不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46672864/

相关文章:

ubuntu - 无法编译 HTTP-Live-Video-Stream-Segmenter-and-Distributor

python - Hdf5 和 pickle 比原始 csv 文件占用更多空间

python - 监督数据集上的 TF2 padded_batch

tensorflow - 输出中的节点数大于神经网络中的类数

C static main return value of 0 在使用 free(someUnrelatedPointer) 之后改变了吗?

ubuntu - 直接在ubuntu上运行kubernetes

windows - 管理中型项目的软件

c# - 如何在 Windows 10 中运行在 ubuntu 中创建的 c# Visual Studio 项目

windows - 如何在 Windows Phone 7 中绑定(bind)来自 xml 文件的动态多列表数据?

windows - 在 Windows 批处理脚本中重命名文件