python 无法引用 tensorflow.keras_使用Python中的Keras和TensorFlow无法重现结果

我有问题,我无法用Keras和ThensorFlow重现我的结果.

似乎最近在Keras documentation site上已经针对此问题发布了一种解决方法,但不知怎的,它对我不起作用.

我做错了什么?

我正在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: https://stackoverflow.com/questions/42022950/which-seeds-have-to-be-set-where-to-realize-100-reproducibility-of-training-res

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会话(你是通过在一个新的内核中运行它),你继续采样相同的“种子”分布.

标签:python,python-3-x,tensorflow,keras,random

来源: https://codeday.me/bug/20191001/1837994.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值