Большое спасибо !! попробовав все решения в интернете, твое сработало отлично

я проблема в том, что я не могу воспроизвести свои результаты с Keras и ThensorFlow.

Кажется, что недавно был опубликован обходной путьСайт документации Keras для этого вопроса, но почему-то это не работает для меня.

Что я делаю не так?

Я использую ноутбук Jupyter на MBP Retina (без графического процессора Nvidia).

# ** 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 1-й раз соответствует первому, а 2-й - 2-му.

Так что после сброса я всегда получу например0.7782 при первом запуске,0.7732 на второй запуск и т. д.

Но результаты без перезагрузки ядра всегда разные при каждом запуске.

Я был бы полезен для любого предложения!

 blue-phoenox22 окт. 2018 г., 12:09
@PoeteMaudit Спасибо за этот ответ. Я хотел ответить на ваш ответ, но потом его уже не было :) Этот вопрос здесь довольно старый, на самом деле я уже наткнулся на эту запись в документе, которую вы разместили (но забыл сообщить об этом здесь). Он действительно преуспел в получении воспроизводимых результатов, однако он очень медленный только с одним потоком, также для того, чтобы он работал в ноутбуках Jupyter, необходимо было каждый раз перезапускать ядро ​​(я не нашел способа сбросить начальное число вручную без перезагрузки всех данных, но я не знаю, изменилось ли это с тех пор). Просто хотел упомянуть эти два момента. Еще спасибо!
 Poete Maudit22 окт. 2018 г., 12:29
Спасибо за ваш комментарий! Это очень хорошо, что вы упоминаете все эти вещи. Я собираюсь иметь их в виду. В моем случае это было совсем не медленноPython 3.6 а такжеPyCharm, В любом случае, мне было очень приятно видеть, что я получаю точно такие же результаты ... ха-ха ... увидимся!
 Poete Maudit22 окт. 2018 г., 11:56
Пожалуйста, посмотрите на мой ответ здесь (stackoverflow.com/a/52897216/9024698) для использования процессора.
 Maxim20 окт. 2017 г., 18:48
Вы можете добавитьnp.random.get_state() а такжеrn.getstate() на выход? Вы используете GPU или CPU? Можете ли вы попробовать скрипт вpython?

Ответы на вопрос(1)

и мне удалось ее решить, закрывая и перезапуская сеанс tenorflow при каждом запуске модели. В вашем случае это должно выглядеть так:

#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()

Я запустил следующий код и получил воспроизводимые результаты с использованием графического процессора и бэкэнда тензорного потока:

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 (вы делаете это, запустив новое ядро), вы продолжаете делать выборки того же самого «затравленного» дистрибутива.

 user23945724 янв. 2019 г., 19:41
Большое спасибо !! попробовав все решения в интернете, твое сработало отлично
 blue-phoenox23 окт. 2017 г., 22:09
Похоже, что по-прежнему есть некоторые различия в счете, хотя он близок. Прямо сейчас мне нужно сделать ранжирование в зависимости от вероятности, поэтому даже небольшие различия имеют значение (поэтому я переключился на бэкэнд Theano для этой цели). Но спасибо! Я попробую, какие результаты я получу.

Ваш ответ на вопрос