顺序模型在每次运行时给出不同的结果

时间:2017-06-01 11:00:30

标签: python keras lstm

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

3 个答案:

答案 0 :(得分:2)

如果你正在跑步"确切地说"该代码,知道您完全创建新模型

您没有加载模型,您没有将自己的权重添加到模型中。 您只需创建一个新模型,并使用全新的随机权重集。

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

你可能应该使用某种"加载保存的模型" (如果你想要保留相同的模型,可能model.load_weights())。 (如果您将模型保存在某处)

或者你应该" set_weights()"在创建模型后的某个时刻(如果你知道你想要什么样的重量,或者你是否保存了你的重量)

或者,如果您想要一个具有已知权重的新模型,您可以在每个图层中使用初始值设定项(如另一个答案中所述)。

答案 1 :(得分: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 :(得分:0)

快看,我没有看到任何错误.. 你应该记住,当你编译你的模型时,keras会随机初始化你模型中的所有权重(你也可以指定你希望如何完成它,或者如果你不希望它是随机的,但默认情况下通常是精细)。因此,每次编译时,您将得到不同的权重和不同的结果......给定足够的时期,它们都应该收敛到相同的结果。