Charam P - разве batch_size = 1 не означает 1 пример обучения на пакет, а не 1 пакет на набор тренировок?

аюсь преобразовать учебник Iris (https://www.tensorflow.org/get_started/estimator) читать данные обучения из файлов .png вместо .csv. Работает с использованиемnumpy_input_fn но не когда я делаю это изDataset, думаюinput_fn() возвращает неправильный тип, но не совсем понимаю, что это должно быть и как это сделать. Ошибка:

  File "iris_minimal.py", line 27, in <module>
    model_fn().train(input_fn(), steps=1)
    ...
    raise TypeError('unsupported callable') from ex
TypeError: unsupported callable

Версия TensorFlow 1.3. Полный код:

import tensorflow as tf
from tensorflow.contrib.data import Dataset, Iterator

NUM_CLASSES = 3

def model_fn():
    feature_columns = [tf.feature_column.numeric_column("x", shape=[4])]
    return tf.estimator.DNNClassifier([10, 20, 10], feature_columns, "tmp/iris_model", NUM_CLASSES)

def input_parser(img_path, label):
    one_hot = tf.one_hot(label, NUM_CLASSES)
    file_contents = tf.read_file(img_path)
    image_decoded = tf.image.decode_png(file_contents, channels=1)
    image_decoded = tf.image.resize_images(image_decoded, [2, 2])
    image_decoded = tf.reshape(image_decoded, [4])
    return image_decoded, one_hot      

def input_fn():
    filenames = tf.constant(['images/image_1.png', 'images/image_2.png'])
    labels = tf.constant([0,1])
    data = Dataset.from_tensor_slices((filenames, labels))
    data = data.map(input_parser)
    iterator = data.make_one_shot_iterator()
    features, labels = iterator.get_next()
    return features, labels

model_fn().train(input_fn(), steps=1)
 Aaditya Ura07 сент. 2018 г., 14:18
Вот подробный пример с последней версией tenorflow 1.7stackoverflow.com/a/52222383/5904928

Ответы на вопрос(1)

Решение Вопроса

train метод принимает входные данныефункциятак и должно бытьinput_fnнеinput_fn().Функции ожидаются как словарь, например{'x': features}.DNNClassifier использованияSparseSoftmaxCrossEntropyWithLogits функция потери.редкий означает, что он предполагает представление порядкового класса, а не один горячий, поэтому ваше преобразование не требуется (этот вопрос объясняет разницу между кросс-энтропийными потерями в тс).

Попробуйте этот код ниже:

import tensorflow as tf
from tensorflow.contrib.data import Dataset

NUM_CLASSES = 3

def model_fn():
    feature_columns = [tf.feature_column.numeric_column("x", shape=[4], dtype=tf.float32)]
    return tf.estimator.DNNClassifier([10, 20, 10], feature_columns, "tmp/iris_model", NUM_CLASSES)

def input_parser(img_path, label):
    file_contents = tf.read_file(img_path)
    image_decoded = tf.image.decode_png(file_contents, channels=1)
    image_decoded = tf.image.resize_images(image_decoded, [2, 2])
    image_decoded = tf.reshape(image_decoded, [4])
    label = tf.reshape(label, [1])
    return image_decoded, label

def input_fn():
    filenames = tf.constant(['input1.jpg', 'input2.jpg'])
    labels = tf.constant([0,1], dtype=tf.int32)
    data = Dataset.from_tensor_slices((filenames, labels))
    data = data.map(input_parser)
    data = data.batch(1)
    iterator = data.make_one_shot_iterator()
    features, labels = iterator.get_next()
    return {'x': features}, labels

model_fn().train(input_fn, steps=1)
 user131849906 нояб. 2017 г., 01:13
Работает после добавления data = data.batch (1) после строки data.map ().
 Charan P22 мар. 2018 г., 20:37
model_fn (). train (input_fn = lambda: input_fn ()) должен это сделать. data.batch (1) просто ограничивает размер batch_size одним пакетом, который будет содержать весь обучающий набор, если только вам не нужно такое поведение.
 user131849909 июл. 2018 г., 04:57
Charam P - разве batch_size = 1 не означает 1 пример обучения на пакет, а не 1 пакет на набор тренировок?
 Maxim06 нояб. 2017 г., 15:28
@ user1318499 вы правы, я обновил код

Ваш ответ на вопрос