Обеспечение воспроизводимости обучения нейронной сети с помощью интерфейса RStudio Keras

Я пытаюсь воспроизвести обучение нейронной сети с помощью интерфейса RStudio Keras. Установка начального числа в R-скрипте (set.seed(42)), похоже, не работает. Можно ли передать раздачу в качестве аргумента layer_dense()? Я могу выбрать RandomUniform в качестве инициализатора, но у меня возникают трудности с передачей вместе с ним аргумента заполнения. Следующая строка выдает ошибку:

model %>% layer_dense(units = 12, activation = 'relu', input_shape = c(8), kernel_initializer = "RandomUniform(seed=1)")

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

model %>% layer_dense(units = 12, activation = 'relu', input_shape = c(8), kernel_initializer = "RandomUniform")

Предполагается, что RandomUniform принимает начальный аргумент в соответствии с документами инициализатора Keras.


person SANBI samples    schedule 16.06.2017    source источник
comment
Я использую keras в python, и, похоже, он работает, когда я делаю set.seed(42) и import tensorflow, tensorflow.set_seed(42). Можете ли вы явно импортировать тензорный поток в R и попробовать это? Кроме того, он работает только при работе с процессорами, а не с графическими процессорами.   -  person regina_fallangi    schedule 16.06.2017
comment
Я думаю, что мне следует попытаться использовать библиотеку R Tensorflow вместо библиотеки R Keras, потому что Keras интегрирован в Tensorflow 1.2.   -  person SANBI samples    schedule 17.06.2017


Ответы (2)


Синтаксис аргумента инициализатора ядра должен быть таким. kernel_initializer=initializer_random_uniform(minval = -0.05, maxval = 0.05, seed = 104)

Попробуйте эти шаги.

1) Установите начальное значение для среды R перед импортом keras/tensorflow.

2) Установите конфигурацию сеанса tensorflow для использования одного потока.

3) Установите случайное начальное число тензорного потока

4) Создайте сеанс тензорного потока с этим семенем и назначьте его бэкэнду keras.

5) Наконец, в ваших слоях модели, если вы используете случайные инициализаторы, такие как random_uniform (это значение по умолчанию) или random_normal, вам придется изменить начальный аргумент на некоторое целое число. Ниже приведен пример.

# Set R random seed
set.seed(104)
library(keras)
library(tensorflow)

# TensorFlow session configuration that uses only a single thread. Multiple threads are a 
# potential source of non-reproducible results, 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 = 1L, 
#                               inter_op_parallelism_threads = 1L)

# Set TF random seed (see: https://www.tensorflow.org/api_docs/python/tf/set_random_seed)
tf$set_random_seed(104)

# Create the session using the custom configuration
sess <- tf$Session(graph = tf$get_default_graph(), config = session_conf)

# Instruct Keras to use this session
K <- backend()
K$set_session(sess)


#Then in your model architecture, set seed to all random initializers.

model %>% 
    layer_dense(units = n_neurons, activation = 'relu', input_shape = c(100),kernel_initializer=initializer_random_uniform(minval = -0.05, maxval = 0.05, seed = 104)) %>% 
    layer_dense(units = n_neurons, activation = 'relu',kernel_initializer=initializer_random_uniform(minval = -0.05, maxval = 0.05, seed = 104)) %>%
    layer_dense(units =c(100) ,kernel_initializer=initializer_random_uniform(minval = -0.05, maxval = 0.05, seed = 104))

Ссылки: https://rstudio.github.io/keras/articles/faq.html#how-can-i-obtain-reproducible-results-using-keras-during-development https://rstudio.github.io/keras/reference/initializer_random_normal.html#arguments

person Narahari B M    schedule 21.08.2017

library(keras)
use_session_with_seed(42)

Функция use_session_with_seed() устанавливает общее случайное начальное число для R, Python, Numpy и Tensorflow. Для получения дополнительной информации см. https://keras.rstudio.com/articles/faq.html

person BRCN    schedule 09.05.2020