Как получить инициализацию воспроизводимых весов в Керасе?

  1. Я установил случайные числа numpy и tensorflow как предложенный
  2. Сгенерируйте некоторые данные - эта часть воспроизводима, всегда дает одинаковые результаты
  3. Создайте простую сеть и сделайте прогноз (без обучения, только со случайными весами) - прогноз каждый раз разный
import numpy as np
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras import Sequential, optimizers
import tensorflow as tf

np.random.seed(32)
tf.set_random_seed(33)

random_data = np.random.rand(10, 2048)
print(random_data[:,0])

def make_classifier():
    model = Sequential()
    model.add(Dense(1024, activation='relu', input_dim=2048))
    model.add(Dropout(0.5))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(optimizer=optimizers.RMSprop(lr=2e-4),
              loss='binary_crossentropy')
    return model
model = make_classifier()
# model.summary()
model.predict(random_data)

Когда я повторно запускаю всю ячейку, оператор печати всегда выводит [0.85888927 0.23846818 0.17757634 0.07244977 0.71119893 0.09223853 0.86074647 0.31838194 0.7568638 0.38197083]. Однако прогноз каждый раз разный:

array([[0.5825965 ],
       [0.8677979 ],
       [0.70151913],
       [0.64572096],
       [0.78101623],
       [0.76483005],
       [0.7946336 ],
       [0.6281612 ],
       [0.8208673 ],
       [0.8273002 ]], dtype=float32)
array([[0.51012236],
       [0.6562015 ],
       [0.5593666 ],
       [0.686155  ],
       [0.6488372 ],
       [0.5966359 ],
       [0.6236731 ],
       [0.58099884],
       [0.68447435],
       [0.58886844]], dtype=float32)

И так далее.

  1. Как получить воспроизводимый прогноз для только что инициализированной сети?
  2. Когда точно происходит инициализация весов? когда я компилирую модель или? ..

person Dmitry Toda    schedule 19.01.2021    source источник
comment
Отвечает ли это на ваш вопрос? Как получить воспроизводимые результаты в keras   -  person Sycorax    schedule 19.01.2021


Ответы (2)


tf.keras.initializers объекты имеют seed аргумент для воспроизводимой инициализации.

import tensorflow as tf
import numpy as np

initializer = tf.keras.initializers.GlorotUniform(seed=42)

for _ in range(10):
    print(np.round(initializer((4,)), 3))
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]

В слое Keras вы можете использовать его так:

tf.keras.layers.Dense(1024, 
                      activation='relu', 
                      input_dim=2048,
                      kernel_initializer=tf.keras.initializers.GlorotUniform(seed=42))
person Nicolas Gervais    schedule 19.01.2021
comment
Спасибо! Это помогло, хотя пришлось писать как glorot_uniform: Dense(1024, activation='relu', input_dim=2048, kernel_initializer=tf.keras.initializers.glorot_uniform(seed=42)) - person Dmitry Toda; 19.01.2021

Какую версию тензорного потока вы используете (python3 -c 'import tensorflow; print(tensorflow.__version__)')

Я использую 2.3.1, устанавливаю начальное число с tf.random.set_seed() и получаю воспроизводимые результаты.

person Franz    schedule 19.01.2021