Функция ввода Tensorflow возвращает недопустимые значения (Tensor вместо Tensor dict) - PullRequest
0 голосов
/ 28 августа 2018

Я работал над стандартной проблемой классификации изображений с Tensorflow. Большая часть кода взята из учебных пособий на www.tensorflow.org, единственное существенное изменение заключается в том, что я использую свои собственные данные.

Изображения уже обработаны, имеют одинаковый размер, кодировку и т. Д. И отсортированы в соответствующие папки, называемые groupA и groupB. Хотя большая часть кода работала без проблем (изображения загружаются с диска и декодируются, назначаются метки и т. Д.), Я столкнулся с неожиданным препятствием.

labels = tf.constant([1.0 if 'groupA' in filename else 0.1 for filename in training_data])

file_names = tf.constant(training_data)

dataset = tf.data.Dataset.from_tensor_slices((file_names, labels))

  def _parse_function(filename, label):

      image_string = tf.read_file(filename)
      image = tf.image.decode_png(filename)
      return image, label

dataset = dataset.map(_parse_function)

def create_input_fn_train(dataset):
    def input_fn():
        ds = dataset.shuffle(buffer_size=10000)
        ds = ds.batch(16)
        ds = ds.repeat()

        iterator = ds.make_one_shot_iterator()
        images, labels = iterator.get_next()

        return images, labels
    return input_fn

input_fn_train = create_input_fn_train(dataset)
model = tf.estimator.DNNClassifier(feature_columns=[construct_feature_columns(150,150)],
                        hidden_units=[1024,100],
                        optimizer=tf.train.AdamOptimizer(1e-4),
                        n_classes=2,
                        dropout=0.1,
                        model_dir="./tmp/fon_model")

Функция ввода возвращает неверный тип данных, вызывая следующую ошибку.

ValueError("features should be a dictionary of `Tensor`s. Given type: <class 'tensorflow.python.framework.ops.Tensor'>",)

Я попытался найти возможные решения, что привело меня к tenorflow ValueError: функции должны быть словарем `Tensor`s. Данный тип: и пробовал предоставленное решение.

def _parse_function(filename, label):

        image_string = tf.read_file(filename)
        image = tf.image.decode_png(filename)
        features = {}
        features['pixels'] = image
        return features, label

Но на этот раз я получил еще одно сообщение об ошибке:

ValueError("Items of feature_columns must be a _FeatureColumn. Given (type <class 'set'>): {_NumericColumn(key='pixels', shape=(22500,), default_value=None, dtype=tf.float32, normalizer_fn=None)}.",)

Что заставляет меня верить, что я совершил какую-то фундаментальную ошибку. Либо при разборе данных, назначении меток и т. Д.

Но я не могу понять, где я ошибся.

EDIT:

Я изменил код так, чтобы конструктор оценки был

model = tf.estimator.DNNClassifier(feature_columns=construct_feature_columns(150,150),
                    hidden_units=[1024,100],
                    optimizer=tf.train.AdamOptimizer(1e-4),
                    n_classes=2,
                    dropout=0.1,
                    model_dir="./tmp/fon_model")

и construct_feature_columns в:

def construct_feature_columns(image_height, image_width):
    return set([tf.feature_column.numeric_column('pixels', shape=[image_height*image_width])])  

Устранение ошибки Value:

ValueError("Items of feature_columns must be a _FeatureColumn. Given (type <class 'set'>): {_NumericColumn(key='pixels', shape=(22500,), default_value=None, dtype=tf.float32, normalizer_fn=None)}.",)

Я также переписал функцию ввода в:

def input_fn():
        ds = dataset.shuffle(buffer_size=len(training_data))
        ds = ds.batch(16)
        ds = ds.repeat()

        iterator = ds.make_one_shot_iterator()
        images, labels = iterator.get_next()
        images = {'pixels':images}
        return images, labels

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

UnimplementedError (see above for traceback): Cast string to float is not supported
     [[Node: dnn/input_from_feature_columns/input_layer/pixels/ToFloat = Cast[DstT=DT_FLOAT, SrcT=DT_STRING, _device="/job:localhost/replica:0/task:0/device:CPU:0"](dnn/input_from_feature_columns/input_layer/pixels/ExpandDims)]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...