顺序模型在每次运行中给出不同的结果
我有一个用于构建keras顺序模型的python脚本。每次我都会得到不同的结果,而且脚本中没有任何更改。请看看脚本。我错了,请帮忙。顺序模型在每次运行中给出不同的结果
thedata = pandas.read_csv("C:/User/Downloads/LSTM/data.csv", sep=', ', delimiter=',', header='infer', names=None)
np.random.seed(1337)
x = thedata['Review']
y = thedata['Polarity_Numeral']
x = x.iloc[:].values
y = y.iloc[:].values
tk = Tokenizer(num_words=40000, lower=True, split=" ")
tk.fit_on_texts(x)
x = tk.texts_to_sequences(x)
max_len = 120
x = pad_sequences(x, maxlen=max_len)
max_features = 40000
testx = x[51000:52588]
print (testx)
testy = y[51000:52588]
x = x[0:50999]
y = y[0:50999]
model = Sequential()
model.add(Embedding(max_features, 128, input_length=max_len))
model.add(SpatialDropout1D(0.3))
model.add(GaussianNoise(0.2))
model.add(LSTM(128 , dropout_W=0.3, dropout_U=0.3, return_sequences=False))
model.add(Dense(1, W_regularizer=l2(0.2)))
model.add(Activation('sigmoid'))
model.summary()
adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.00)
model.compile(loss='binary_crossentropy', optimizer=adam,metrics = ['accuracy'])
model_history = model.fit(x, y=y, batch_size=64, epochs=1, verbose=1,validation_split = 0.2)
model.save('C:/User/Downloads/model.h5')
model.save_weights('C:/User/Downloads/weight_model.h5')
predictions = model.predict(testx)
print (predictions)
在第一次运行,我得到即57% 在第二次运行.. 53% 在第三.. 55% 每次它是随机改变。 感谢您的帮助!
快速看我没有看到任何错误 你应该记住,当你编译你的模型,keras随机初始化你的模型中的所有权重(你也可以指定你想要做什么,或者如果你不希望它是随机的,但默认情况通常很好)。所以每次编译时你都会得到不同的权重和不同的结果......给出足够的时代,他们应该都会收敛到相同的结果。
感谢您的回复,我不希望它是随机的。我如何指定我的值?如何解决结果。我只是检查这是为什么我给了时代-1,它不会花太多时间来执行。一旦它得到解决,然后给予足够的时代。 – user
你可以为每一层指定你想要的初始化,请参阅文档: https://keras.io/initializers/ 你可以选择一个或零,或身份矩阵(这可能是最好的.. )如果你想..确保你设置偏差为一个常数,而不是随机的。 但我真的不知道你为什么要这样做......初始随机性很好,并将以最佳方式收敛。如果将所有权重设置为相同的常数,则可能会影响收敛。 –
感谢我将看到https://keras.io/initializers/,我想要不断的结果,因为我需要将训练有素的模型保存在一个目录中,然后将该模型加载到不同的脚本中并再次测试。它应该给出相同的结果。这只是为了节省时间。 – user
如果您正在运行“确切”该代码,请确保您完全创建了新模型。
您并未加载模型,也没有将自己的权重添加到模型中。 您只需创建一个新的模型,并带有一组全新的权重。
所以,是的,它会产生不同的结果。没有任何错误。
你也许应该使用某种形式的,如果你想保持相同的模型“负荷保存的模型”(也许是model.load_weights()
)的。 (如果您有模型的地方保存)
还是应该“set_weights()”在某些时候创建模型后(如果你知道你想要什么权重,或者如果你有你的重量保存)
或者,如果您想要一个具有已知权重的新模型,则可以在每个图层中使用初始化器(如另一个答案中所述)。
运行完全相同的代码并保存在目录中的训练模型,测试的准确性为69.269%,然后使用load_model('C:/User/Downloads/model.h5')和model.load_weights('C: /User/Downloads/weight_model.h5'),然后model.predict(testx)。我有66.6246%的测试精度。 – user
您是否使用tensorflow后端?比它可能与此[问题](https://github.com/fchollet/keras/issues/2280)有关。 – sietschie
关于'tk.fit_on_texts(x)',是否有某种训练?如果是这样,你还应该保存你的x和y,并确保它们对于新的和加载的模型都完全相同。 –
是的,用于文本预处理。我无法准确理解发生了什么。同样的数据集在训练和测试方面,同样的模型我正在加载,仍然给它不同的准确性。 – user