我有问题,我无法用Keras和ThensorFlow重现我的结果.
似乎最近在Keras文档站点上发布了针对此问题的解决方法,但不知何故,它对我不起作用.
我做错了什么?
我正在MBP Retina上使用Jupyter笔记本(没有Nvidia GPU).
# ** Workaround from Keras Documentation ** import numpy as np import tensorflow as tf import random as rn # The below is necessary in Python 3.2.3 onwards to # have reproducible behavior for certain hash-based operations. # See these references for further details: # https://docs.python.org/3.4/using/cmdline.html#envvar-PYTHONHASHSEED # https://github.com/fchollet/keras/issues/2280#issuecomment-306959926 import os os.environ['PYTHONHASHSEED'] = '0' # The below is necessary for starting Numpy generated random numbers # in a well-defined initial state. np.random.seed(42) # The below is necessary for starting core Python generated random numbers # in a well-defined state. rn.seed(12345) # Force TensorFlow to use single thread. # Multiple threads are a potential source of # non-reproducible results. # For further details, see: /sf/ask/17360801/ session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1) from keras import backend as K # The below tf.set_random_seed() will make random number generation # in the TensorFlow backend have a well-defined initial state. # For further details, see: https://www.tensorflow.org/api_docs/python/tf/set_random_seed tf.set_random_seed(1234) sess = tf.Session(graph=tf.get_default_graph(), config=session_conf) K.set_session(sess) # ** Workaround end ** # ** Start of my code ** # LSTM and CNN for sequence classification in the IMDB dataset from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from keras.layers.embeddings import Embedding from keras.preprocessing import sequence from sklearn import metrics # fix random seed for reproducibility #np.random.seed(7) # ... importing data and so on ... # create the model embedding_vecor_length = 32 neurons = 91 epochs = 1 model = Sequential() model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length)) model.add(LSTM(neurons)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='mean_squared_logarithmic_error', optimizer='adam', metrics=['accuracy']) print(model.summary()) model.fit(X_train, y_train, epochs=epochs, batch_size=64) # Final evaluation of the model scores = model.evaluate(X_test, y_test, verbose=0) print("Accuracy: %.2f%%" % (scores[1]*100))
二手Python版:
Python 3.6.3 |Anaconda custom (x86_64)| (default, Oct 6 2017, 12:04:38) [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)]
解决方法已包含在代码中(无效).
每次我做训练部分时都会得到不同的结果.
重置Jupyter笔记本的内核时,第一次对应第一次,第二次对应第二次.
因此,在重置之后,我将始终0.7782
在第一次运行,0.7732
第二次运行等时获得.
但是每次运行时没有内核重置的结果总是不同的.
我会对任何建议有所帮助!
我遇到了完全相同的问题,并在每次运行模型时通过关闭并重新启动tensorflow会话设法解决了这个问题。在您的情况下,它应如下所示:
#START A NEW TF SESSION np.random.seed(0) tf.set_random_seed(0) sess = tf.Session(graph=tf.get_default_graph()) K.set_session(sess) embedding_vecor_length = 32 neurons = 91 epochs = 1 model = Sequential() model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length)) model.add(LSTM(neurons)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='mean_squared_logarithmic_error', optimizer='adam', metrics=['accuracy']) print(model.summary()) model.fit(X_train, y_train, epochs=epochs, batch_size=64) # Final evaluation of the model scores = model.evaluate(X_test, y_test, verbose=0) print("Accuracy: %.2f%%" % (scores[1]*100)) #CLOSE TF SESSION K.clear_session()
我运行了以下代码,并使用GPU和tensorflow后端获得了可重复的结果:
print datetime.now() for i in range(10): np.random.seed(0) tf.set_random_seed(0) sess = tf.Session(graph=tf.get_default_graph()) K.set_session(sess) n_classes = 3 n_epochs = 20 batch_size = 128 task = Input(shape = x.shape[1:]) h = Dense(100, activation='relu', name='shared')(task) h1= Dense(100, activation='relu', name='single1')(h) output1 = Dense(n_classes, activation='softmax')(h1) model = Model(task, output1) model.compile(loss='categorical_crossentropy', optimizer='Adam') model.fit(x_train, y_train_onehot, batch_size = batch_size, epochs=n_epochs, verbose=0) print(model.evaluate(x=x_test, y=y_test_onehot, batch_size=batch_size, verbose=0)) K.clear_session()
并获得此输出:
2017-10-23 11:27:14.494482 0.489712882132 0.489712893813 0.489712892765 0.489712854426 0.489712882132 0.489712864011 0.486303713004 0.489712903398 0.489712892765 0.489712903398
我的理解是,如果不关闭tf会话(通过在新内核中运行来完成),则将继续采样相同的“种子”分发。