Как получить воспроизводимый результат в Amazon SageMaker с помощью TensorFlow Estimator? - PullRequest
1 голос
/ 01 августа 2020

В настоящее время я использую AWS SageMaker Python SDK для обучения модели Efficien tNet (https://github.com/qubvel/efficientnet) моим данным. В частности, я использую оценщик TensorFlow, как показано ниже. Этот код находится в экземпляре записной книжки SageMaker

import sagemaker
from sagemaker.tensorflow.estimator import TensorFlow
### sagemaker version = 1.50.17, python version = 3.6

estimator = TensorFlow("train.py", py_version = "py3", framework_version = "2.1.0",
                       role = sagemaker.get_execution_role(), 
                       train_instance_type = "ml.m5.xlarge", 
                       train_instance_count = 1,
                       image_name = 'xxx.dkr.ecr.xxx.amazonaws.com/xxx',
                       hyperparameters = {list of hyperparameters here: epochs, batch size},
                       subnets = [xxx], 
                       security_group_ids = [xxx]
estimator.fit({
   'class_1': 's3_path_class_1',
   'class_2': 's3_path_class_2'
})

Код для train.py содержит обычную процедуру обучения, получение изображения и меток из S3, преобразование их в правильную форму массива для ввода Efficien tNet, и разделены на набор для обучения, проверки и тестирования. Чтобы получить воспроизводимый результат, я использую следующую функцию reset_random_seeds ( Если результаты Keras не воспроизводятся, как лучше всего сравнивать модели и выбирать гиперпараметры? ) перед вызовом самой модели Efficien tNet.

### code of train.py

import os
os.environ['PYTHONHASHSEED']=str(1)
import numpy as np
import tensorflow as tf
import efficientnet.tfkeras as efn
import random

### tensorflow version = 2.1.0
### tf.keras version = 2.2.4-tf
### efficientnet version = 1.1.0

def reset_random_seeds():
   os.environ['PYTHONHASHSEED']=str(1)
   tf.random.set_seed(1)
   np.random.seed(1)
   random.seed(1)

if __name__ == "__main__":

   ### code for getting training data
   ### ... (I have made sure that the training input is the same every time i re-run the code)
   ### end of code

   reset_random_seeds()
   model = efn.EfficientNetB5(include_top = False, 
      weights = 'imagenet', 
      input_shape = (80, 80, 3),
      pooling = 'avg',
      classes = 3)
   model.compile(optimizer = 'Adam', loss = 'categorical_crossentropy')
   model.fit(X_train, Y_train, batch_size = 64, epochs = 30, shuffle = True, verbose = 2)

   ### Prediction section here

Однако каждый раз, когда я запускаю экземпляр ноутбука, я всегда получаю результат, отличный от предыдущего. Когда я переключил train_instance_type на "local", я всегда получаю один и тот же результат при каждом запуске ноутбука. Следовательно, не является ли невоспроизводимый результат результатом выбранного мной типа обучающего экземпляра? этот экземпляр (ml.m5.xlarge) имеет 4 виртуальных процессора, 16 памяти (ГиБ) и не имеет графического процессора. Если да, то как получить воспроизводимые результаты в этом обучающем примере?

1 Ответ

0 голосов
/ 07 августа 2020

Возможно ли, что ваш несогласованный результат получен из

tf.random.set_seed ()

Здесь наткнулся на сообщение: Tensorflow: Различные результаты с одним и тем же случайным начальным числом

...