Процедурная генерация столбцов объектов для использования с экземпляром Sagemaker Tensorflow - PullRequest
0 голосов
/ 30 августа 2018

Я исчерпал себя на этом, поэтому любая помощь будет оценена.

Я пытаюсь настроить хостинг модели тензорного потока с помощью Amazon Sagemaker и следую приведенному примеру здесь .

В этом примере используются жестко закодированные столбцы объектов с известной размерностью.

feature_columns = [tf.feature_column.numeric_column(INPUT_TENSOR_NAME, shape=[4])]

Мне нужно избегать этого, так как мой набор данных часто меняется.

Настройка локальной машины

Теперь на моем локальном компьютере я определяю список столбцов

my_feature_columns = []

При следующей стратегии

#Define placeholder nodes based on datatype being inserted

for key in train_x.keys():

Где train_x - набор данных без меток.

«ОБЪЕКТЫ» становятся хэшированными сегментами, поскольку существует много возможных категорий

    if train_x[key].dtypes == 'object':

        categorical_column = tf.feature_column.categorical_column_with_hash_bucket(
                key = key,
                hash_bucket_size = len(train_x[key].unique()))

        my_feature_columns.append(tf.feature_column.embedding_column(
                categorical_column=categorical_column,
                dimension=5))

«INT64» становятся категориальными столбцами, поскольку существует только две возможные категории (я переименовал логические значения в 0/1)

    elif train_x[key].dtypes == 'int64':

        categorical_column = tf.feature_column.categorical_column_with_identity(
                key=key,
                num_buckets=2)

        my_feature_columns.append(tf.feature_column.indicator_column(categorical_column))

«ПЛАВЫ» становятся непрерывными столбцами

    elif train_x[key].dtypes == 'float':
        my_feature_columns.append(
        tf.feature_column.numeric_column(
        key=key))

На локальном компьютере это дает хороший список всех моих функций, которые могут быть предоставлены в качестве аргумента при создании экземпляра tf.estimator.DNNClassifier. Поскольку в каждый столбец OBJECT добавляется больше категорий, это обрабатывается

hash_bucket_size = len(train_x[key].unique())

Sagemaker

Из Документов

Подготовка учебного сценария TensorFlow Ваш учебный скрипт TensorFlow должен быть исходным файлом Python 2.7. Образ докера SageMaker TensorFlow использует этот сценарий, вызывая функции с определенными именами из этого сценария.

Учебный скрипт должен содержать следующее:

Точно одно из следующего: model_fn: определяет модель, которая будет обучаться. keras_model_fn: определяет модель tf.keras, которая будет обучаться. estimator_fn: определяет tf.estimator.Estimator, который будет обучать модель.

train_input_fn: данные предварительной обработки и загрузки.

eval_input_fn: данные предварительной обработки и оценки загрузки.

Опять же, из примера

def train_input_fn(training_dir, params):
"""Returns input function that would feed the model during training"""
return _generate_input_fn(training_dir, 'iris_training.csv')

Эта функция вызывается образом докера sagemaker, который добавляет собственный аргумент для training_dir , это не глобальный параметр.

Когда я пытаюсь получить доступ к моим данным обучения из estimator_fn, чтобы создать список my_feature_columns

NameError: global name 'training_dir' is not defined

Я бы хотел сделать что-то подобное.

def estimator_fn(run_config, params):

my_feature_columns = []

train_x , _ , _ , _ = datasplitter(os.path.join(training_dir, 'leads_test_frame.csv'))

for key in train_x.keys():
    if train_x[key].dtypes == 'object':

        categorical_column = tf.feature_column.categorical_column_with_hash_bucket(
                key = key,
                hash_bucket_size = len(train_x[key].unique()))

        my_feature_columns.append(tf.feature_column.embedding_column(
                categorical_column=categorical_column,
                dimension=5))

    elif train_x[key].dtypes == 'int64':

        categorical_column = tf.feature_column.categorical_column_with_identity(
                key=key,
                num_buckets=2)

        my_feature_columns.append(tf.feature_column.indicator_column(categorical_column))

    elif train_x[key].dtypes == 'float':
        my_feature_columns.append(
        tf.feature_column.numeric_column(
        key=key))

return tf.estimator.DNNClassifier(feature_columns=my_feature_columns,
                                  hidden_units=[10, 20, 10],
                                  n_classes=2,
                                  config=run_config)

Спасибо всем, кто может помочь любым способом. С радостью предоставит больше информации, если это необходимо, но, вероятно, 4 страниц вполне достаточно: -S

Ура! Клем

1 Ответ

0 голосов
/ 25 сентября 2018

training_dir указывает на ваш обучающий канал, т.е. / opt / ml / input / data / training . Вы можете жестко закодировать это местоположение внутри вашей оценка_фн .

Когда начинается обучение, SageMaker делает данные для канала доступными в каталоге / opt / ml / input / data / имя_канала в контейнере Docker.

Вы можете найти больше информации здесь https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo.html#your-algorithms-training-algo-running-container.

...