tenorflow feature_column пытается изменить форму пространственных объектов

Я пытаюсь реализовать сеть для набора данных MNIST с использованием пользовательских оценщиков.
Вот моя функция ввода:

def input_train_fn():
  train, test = tf.keras.datasets.mnist.load_data()
  mnist_x, mnist_y = train
  mnist_y = tf.cast(mnist_y, tf.int32)
  mnist_x = tf.cast(mnist_x, tf.int32)
  features = {'image': mnist_x}
  labels = mnist_y
  dataset = tf.data.Dataset.from_tensor_slices((features, labels))
  return dataset

Вот как я определяю свою модель:

def my_model(features, labels, mode, params):
    # create net
    net = tf.feature_column.input_layer(features, params['feature_columns'])
    # create hidden layers
    for unit in params['hidden_units']:
        net = tf.layers.dense(net, unit, tf.nn.relu)
    # create output layer
    legits = tf.layers.dense(net, params['n_classes'], activation=None)
    # predict (if in predict mode)
    predicted_classes = tf.arg_max(legits, 1)
    if mode == tf.estimator.ModeKeys.PREDICT:
        predictions = {
            'class_ids': predicted_classes,
            'probabilities': tf.nn.softmax(legits),
            'logits': legits
        }
        return tf.estimator.EstimatorSpec(mode, predictions=predictions)
    # define loss function
    loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=legits)
    # evaluation metrics
    accuracy = tf.metrics.accuracy(labels=labels,
                                   predictions=predicted_classes,
                                   name='acc_op')
    metrics = {'accuracy': accuracy}
    tf.summary.scalar('accuracy', accuracy[1])
    if mode == tf.estimator.ModeKeys.EVAL:
        return tf.estimator.EstimatorSpec(mode, loss=loss, eval_metric_ops=metrics)

    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
    train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())
    return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)

И вот как я называю функцию поезда:

feature_columns = [tf.feature_column.numeric_column('image', shape=[28, 28], dtype=tf.int32), ]
classifier = tf.estimator.Estimator(model_fn=my_model,
                       params={
                           'feature_columns': feature_columns,
                           'hidden_units': [10, 10],
                           'n_classes': 10,
                       }, model_dir='/model')
classifier.train(input_fn=input_train_fn, steps=10)

Насколько я понимаю, я делаю все по правилам как для оценщиков, так и для feature_columns, но я получаю сообщение об ошибке:

ValueError: невозможно изменить форму тензора с 784 элементами в форму [28,784] (21952 элемента) для 'input_layer / image / Reshape' (op: 'Reshape') с входными формами: [28,28], 2 и с входными тензорами, вычисленными как частичные формы: input 1 = [28 784].

Что-то мне не хватает?
заранее спасибо, и любая помощь приветствуется.


person Bahman Rouhani    schedule 09.03.2019    source источник
comment
Почему вы используете столбцы функций вместе с API набора данных?   -  person Sharky    schedule 09.03.2019
comment
В руководстве @Sharky tensorflows это делается в tensorflow.org/guide/custom_estimators, если я не использую столбцы функций ?   -  person Bahman Rouhani    schedule 09.03.2019
comment
Не с изображениями. Что здесь происходит # create net?   -  person Sharky    schedule 09.03.2019
comment
@Sharky Я определяю свои сетевые слои, первый - это входной слой, и именно здесь происходит ошибка, я не помещал остальные коды, так как это казалось несущественным. но за ним следуют два плотных слоя. Как мне тогда определить входной слой без столбца объектов? в каждом примере, который я видел, они есть.   -  person Bahman Rouhani    schedule 09.03.2019
comment
Добавьте код вашей модели   -  person Sharky    schedule 09.03.2019
comment
@Sharky только что сделал.   -  person Bahman Rouhani    schedule 09.03.2019


Ответы (1)


Во-первых, вам нужно производить партии. Подробнее см. https://www.tensorflow.org/guide/datasets.

...
dataset = tf.data.Dataset.from_tensor_slices((features, labels))
dataset = dataset.batch(size)
  return dataset

Затем измените форму вашего изображения и примените к float. -1 для batch_size, он будет заменен во время обучения. Приведение меток к float необязательно в зависимости от предоставленного типа данных.

    net = tf.cast(tf.reshape(features, [-1, 28*28]), tf.float32)
    labels = tf.cast(labels, tf.int64)
    net = tf.layers.dense(net, 10, tf.nn.relu)
    legits = tf.layers.dense(net, 10, activation=None)
    predicted_classes = tf.arg_max(legits, 1)
    if mode == tf.estimator.ModeKeys.PREDICT:
        predictions = {
            'class_ids': predicted_classes,
            'probabilities': tf.nn.softmax(legits),
            'logits': legits
        }
        return tf.estimator.EstimatorSpec(mode, predictions=predictions)

    loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=legits)

    if mode == tf.estimator.ModeKeys.EVAL:
        return tf.estimator.EstimatorSpec(mode, loss=loss)

    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
    train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())
    return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)

classifier = tf.estimator.Estimator(model_fn=my_model)

classifier.train(input_fn=lambda: input_train_fn(), steps=10)
person Sharky    schedule 09.03.2019
comment
Это решило проблему, хотя я также изменил функции, добавив в первую строку ['изображение'] (для будущих читателей). Огромное спасибо. - person Bahman Rouhani; 10.03.2019