【问题标题】:sequential model give a different result at every run顺序模型在每次运行时给出不同的结果
【发布时间】:2017-06-01 11:00:30
【问题描述】:

我有一个用于构建 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% 每次都是随机变化的。 感谢您的帮助!

【问题讨论】:

  • 你在使用 tensorflow 后端吗?比它可能与这个issue有关。
  • 关于tk.fit_on_texts(x),这是一种培训吗?如果是这样,您还应该保存您的 x 和 y,并确保它们对于新模型和加载的模型完全相同。
  • 是的,用于文本预处理。我无法准确理解正在发生的事情。训练和测试方面的数据集相同,我加载的模型相同,但其准确性仍然不同。
  • @user 这是因为权重是随机初始化的,试试我下面的代码。

标签: python keras lstm


【解决方案1】:

此代码用于 TensorFlow 后端

这是因为权重是使用随机数初始化的,因此每次都会得到不同的结果。这是预期的行为。要获得可重现的结果,您需要将随机种子设置为:

import tensorflow as tf
import random as rn

os.environ['PYTHONHASHSEED'] = '0'

# Setting the seed for numpy-generated random numbers
np.random.seed(37)

# Setting the seed for python random numbers
rn.seed(1254)

# Setting the graph-level random seed.
tf.set_random_seed(89)

from keras import backend as K

session_conf = tf.ConfigProto(
      intra_op_parallelism_threads=1,
      inter_op_parallelism_threads=1)

#Force Tensorflow to use a single thread
sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)

K.set_session(sess)

# Rest of the code follows from here on ...

【讨论】:

    【解决方案2】:

    如果您正在“完全”运行该代码,请知道您完全在创建一个新模型

    您不是在加载模型,也不是在模型中添加自己的权重。 您只是在创建一个新模型,具有一组全新的随机权重。

    所以,是的,它会产生不同的结果。没有任何错误。


    如果您希望保留相同的模型,您可能应该使用某种“加载保存模型”(可能是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% 的测试准确率。
    • @MR.Robot,问题已被删除,确实是含糊其辞。不过,我想有一个关于神经网络做什么以及如何回答这个问题的基本教程。
    • @DanielMöller 这是问题stackoverflow.com/questions/62926155/… 非常感谢先生
    【解决方案3】:

    快速浏览一下,我没有发现任何问题.. 您应该记住,当您编译模型时,keras 会随机初始化模型中的所有权重(您也可以指定您希望如何完成,或者如果您不希望它是随机的,但默认值通常是美好的)。因此,每次编译时,您都会得到不同的权重和不同的结果……给定足够多的 epoch,它们应该都收敛到相同的结果。

    【讨论】:

    • 感谢您的回复,我不希望它是随机的。我如何指定我的价值观?如何修复结果。我只是在检查这就是我给出 epochs-1 的原因,它不会花费太多时间来执行。一旦它得到修复,然后给出足够的时期。
    • 您可以为每一层指定所需的初始化,请参阅文档:keras.io/initializers 您可以将其设置为 1 或 0,或者单位矩阵(那个可能是最好的..)如果你想要..确保将偏差设置为常数而不是随机的。但我真的不知道你为什么要这样做......初始随机性很好,并且会以最好的方式收敛。如果将所有权重设置为相同的常数,则可能会干扰收敛。
    • 您可以通过简单地保存和加载模型来实现这一点,而无需在第二个脚本中重新编译它。如果您加载相同的模型(相同的编译!没有另一个编译!)它应该这样做。
    • 它没有按预期工作?如果您对保存和加载模型有疑问,您应该为此创建一个单独的问题。
    • 感谢丹尼尔的更正。无论哪种方式 - 你不应该每次都创建一个全新的模型,只需 model = load_model('my_model.h5') 并且你有你的旧模型。它还包括权重..所以你不需要单独加载它们......如果你加载相同的模型两次并在相同的数据上运行它应该会给你完全相同的结果......
    猜你喜欢
    • 2017-11-24
    • 2016-07-31
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2018-05-02
    • 2021-08-12
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多