2 votes

Comment utiliser tensorflow.feature_column en dehors d'Estimator pour la prédiction ?

Je veux utiliser le feature_column et le feature de tensorflow directement avec une session, en contournant le framework Estimator. Je lis introduction de bas niveau de tensorflow sur la colonne des fonctionnalités . Le problème est que tf.feature_column.input_layer besoins de l features au moment de la construction, mais les flux de caractéristiques sont différents entre le moment de la formation et celui de la prédiction. En regardant les tf.Estimator codes, il semble que le moyen soit d'appeler à nouveau la même fonction de rappel de construction pour obtenir le graphique. J'ai trouvé l'exemple ci-dessous, mais il échoue sur la table non initialisée si je saute l'init de la table après la deuxième construction ; ou il se plaindrait de la table déjà initialisée si je lance l'init de la table. D'après leur mémoire de recherche C'est un choix délibéré puisqu'ils s'attendent toujours à ce qu'un nouveau modèle soit rechargé à partir du point de sauvegarde. Mais cela sera très inefficace dans des situations comme l'apprentissage par renforcement, où nous voulons faire des mises à jour et des inférences en même temps dans une boucle d'apprentissage. Il n'est pas clair non plus comment ils veulent faire la validation de la déviation.

Quelle est la bonne façon de construire un graphique et d'alimenter les caractéristiques pour la prédiction ?

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}))

0voto

Y. Luo Points 3801

Si vous disposez d'un ensemble de données d'apprentissage et d'un ensemble de données de test et que vous devez passer de l'un à l'autre, vous pouvez essayer d'utiliser une fonction is_training interrupteur. Pour votre exemple spécifique dans la question :

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}))

Un problème potentiel est que les deux feature_column sont lancés. Je ne pense pas qu'ils vont simplement tout charger et consommer de la mémoire. Mais ils peuvent coûter plus de mémoire que nécessaire et potentiellement vous donner quelques problèmes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X