Как использовать tensorflow.feature_column вне Estimator для прогнозирования?

Я хочу использовать tensorflow feature_column и функцию непосредственно с сеансом, минуя инфраструктуру Estimator. Я прочитал низкоуровневое введение tensorflow в колонку функций. Проблема в том, что tf.feature_column.input_layer требуется фид features при построении, но фиды функций различаются между временем обучения и прогнозирования. Глядя на коды tf.Estimator, кажется, что нужно снова вызвать ту же функцию обратного вызова построения, чтобы получить график. Я придумал приведенный ниже пример, но он терпит неудачу на неинициализированной таблице, если я пропущу инициализацию таблицы после второй конструкции; или он будет жаловаться на уже инициализированную таблицу, если я запущу таблицу init. Согласно их исследовательская работа, так задумано, поскольку они всегда ожидают перезагрузки новой модели из точки сохранения. Но это будет очень неэффективно для таких ситуаций, как обучение с подкреплением, когда мы хотим делать обновления и выводы одновременно в цикле обучения. Также неясно, как они хотят проводить проверку разработки.

Как правильно построить график и фид-функции для прогнозирования?

training_features = {
    'sales' : [[5], [10], [8], [9]],
    'department': ['sports', 'sports', 'gardening', 'gardening']}

test_features = {
    'sales' : [[10], [20], [16], [18]],
    'department': ['sports', 'sports', 'gardening', 'gardening']}

department_column = tf.feature_column.categorical_column_with_vocabulary_list(
        'department', ['sports', 'gardening'])
department_column = tf.feature_column.indicator_column(department_column)

columns = [
    tf.feature_column.numeric_column('sales'),
    department_column
]

# similar to a tf.Estimator's model_fn callback
def mkgraph(features):
    with tf.variable_scope('feature_test', reuse=tf.AUTO_REUSE):
        inputs = tf.feature_column.input_layer(features, columns)
        alpha = tf.placeholder(tf.float32, name='alpha')
        output = inputs * alpha
        return output, alpha

with tf.Graph().as_default() as g:
    output, alpha = mkgraph(training_features)
    print('output', output)
    print('alpha', alpha)
    var_init = tf.global_variables_initializer()
    table_init = tf.tables_initializer()
    with tf.Session(graph=g) as sess:
        sess.run([var_init, table_init])
        print(sess.run(output, feed_dict={alpha: 100.0})) # works here

        print('testing')
        output, alpha = mkgraph(test_features)
        print('output', output)
        print('alpha', alpha)
        table_init = tf.tables_initializer()
        # sess.run([table_init]) # with this, it fails on 'table already initialized'
        # without table_init run, it fails on 'table not initialized'
        print(sess.run(output, feed_dict={alpha: 200.0}))

person teddy    schedule 14.03.2018    source источник
comment
Привет, я столкнулся с похожей дилеммой с feature_column. Вы решили эту проблему? Поможет ли добавление переключателя для переключения между обучением и тестированием?   -  person Y. Luo    schedule 20.05.2018
comment
Что касается части проверки разработки, я думаю, что цикл обучения уже выполняет перекрестную проверку, поэтому нам не нужно делать это снаружи. Но нет ответа на общую проблему итеративной подачи обучающих данных и данных вывода в ситуации типа RL.   -  person teddy    schedule 30.05.2018
comment
Думаю, у меня был более простой случай, чем у вас с РЛ. Но в целом мне нужно переключаться между набором поездов и набором тестов, используя feature_column. Добавление переключателя помогло мне, хотя я не уверен, что это лучший способ. Надеюсь, мой ответ ниже поможет вам.   -  person Y. Luo    schedule 30.05.2018


Ответы (1)


Если у вас есть один набор данных для обучения и один набор данных для тестирования, и вам нужно переключаться между ними вперед и назад, вы можете попробовать использовать переключатель is_training. Для вашего конкретного примера в вопросе:

import tensorflow as tf

training_features = {
    'sales' : [[5], [10], [8], [9]],
    'department': ['sports', 'sports', 'gardening', 'gardening']}
test_features = {
    'sales' : [[10], [20], [16], [18]],
    'department': ['sports', 'sports', 'gardening', 'gardening']}

department_column = tf.feature_column.categorical_column_with_vocabulary_list(
        'department', ['sports', 'gardening'])
department_column = tf.feature_column.indicator_column(department_column)
columns = [
    tf.feature_column.numeric_column('sales'),
    department_column
]

with tf.variable_scope('feature_test', reuse=tf.AUTO_REUSE):
    alpha = tf.placeholder(tf.float32, name='alpha')
    is_training = tf.placeholder(tf.bool, name='is_training')
    training_inputs = tf.feature_column.input_layer(training_features, columns)
    test_inputs = tf.feature_column.input_layer(test_features, columns)
    output = tf.cond(is_training,
                     lambda: training_inputs * alpha,
                     lambda: test_inputs * alpha)

var_init = tf.global_variables_initializer()
table_init = tf.tables_initializer()

with tf.Session() as sess:
    sess.run([var_init, table_init])

    print('training')
    print(sess.run(output, feed_dict={alpha: 100.0, is_training: True}))

    print('testing')
    print(sess.run(output, feed_dict={alpha: 200.0, is_training: False}))

Одна потенциальная проблема заключается в том, что инициируются оба feature_column. Я не думаю, что они просто так все загрузят и съедят память. Но они могут занимать больше памяти, чем необходимо, и потенциально доставлять вам некоторые проблемы.

person Y. Luo    schedule 30.05.2018