尝试使用固定估计器测试我的数据集时,出现以下错误:

Traceback (most recent call last):
  File "estimator.py", line 61, in <module>
    model.train(input_fn=train_input_fn, steps=20000)
  File "/home/sid/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/estimator/estimator.py", line 314, in train
    loss = self._train_model(input_fn, hooks, saving_listeners)
  File "/home/sid/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/estimator/estimator.py", line 743, in _train_model
    features, labels, model_fn_lib.ModeKeys.TRAIN, self.config)
  File "/home/sid/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/estimator/estimator.py", line 725, in _call_model_fn
    model_fn_results = self._model_fn(features=features, **kwargs)
  File "/home/sid/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/estimator/canned/dnn.py", line 324, in _model_fn
    config=config)
  File "/home/sid/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/estimator/canned/dnn.py", line 153, in _dnn_model_fn
    'Given type: {}'.format(type(features)))
ValueError: features should be a dictionary of `Tensor`s. Given type: <class 'tensorflow.python.framework.ops.Tensor'>


我在在线here上发现了相同的错误,但似乎在Tensorflow 1.5中已解决。但是,我仍然收到相同的错误,并且正在使用tensorflow 1.5(CUDA 9.0和最新的cuDNN)。这表明问题很可能与我使用新的数据集api创建数据集的方式有关。

estimator.py:

import tensorflow as tf
import numpy as np
from input_pipe import tr_data, val_data

# Parameters
learning_rate = 1e-4
num_epochs = 2000
batch_size = 128
display_step = 100

# We know that the images are 128x128
img_size = 128

# Images are stored in one-dimensional arrays of this length.
img_size_flat = img_size * img_size

# Tuple with height and width of images used to reshape arrays.
img_shape = (img_size, img_size)

# Number of colour channels for the images: 1 channel for gray-scale.
num_channels = 3

# Number of classes, Dogs and Cats
num_classes = 2

# We import our Dataset objects from input_pipe because we need to be
# able to access them from within our input functions
train_dataset = tr_data
val_dataset = val_data

def train_input_fn():
        tr_data = train_dataset.batch(batch_size)
        tr_data = tr_data.repeat(num_epochs)
        # iterator = tr_data.make_one_shot_iterator()
        iterator = tf.data.Iterator.from_structure(tr_data.output_types, tr_data.output_shapes)

        features, labels = iterator.get_next()

        return features, labels

def test_input_fn():
        #iterator = val_dataset.make_one_shot_iterator()
        iterator = tf.data.Iterator.from_structure(tr_data.output_types, tr_data.output_shapes)

        features, labels = iterator.get_next()

        return features, labels


feature_x = tf.feature_column.numeric_column('tr_data.train_imgs',img_shape)


num_hidden_units = [512, 256, 128]

model = tf.estimator.DNNClassifier(feature_columns=[feature_x],
                hidden_units=num_hidden_units,
                activation_fn=tf.nn.relu,
                n_classes=num_classes,
                model_dir="./checkpoints")

model.train(input_fn=train_input_fn, steps=20000)


input_pipe.py为火车和val图像创建张量流数据集。我很确定我的数据集可以正常工作,因为我能够初始化一个迭代器,循环遍历整个集合,并打印出相关数据。

我认为问题出在固定估算器的功能列arg上,但不确定如何解决。我也尝试过在iterator.get_next()train_input_fn中返回一个test_input_fn,但这并没有改变错误。

我们将不胜感激任何帮助,我在网上发现的有关估计量的唯一例子是那些已经处理过的数据集,例如tensorflow mnist,而不是有人从头开始创建的数据集(使用数据集api)。谢谢!

最佳答案

Allen Lavoie是正确的,我将train_input_fn函数更改为:

def train_input_fn():
    train_dataset = tr_data.batch(batch_size)
    # train_dataset = train_dataset.repeat()
    # train_dataset = train_dataset.shuffle(buffer_size=batch_size)

    iterator = train_dataset.make_one_shot_iterator()
    features, labels = iterator.get_next()
    x = {'image': features}
    y = labels

    return x, y


而且有效。我需要返回一个图像字典,其特征值与我在功能列实例化中使用的键值相同:

feature_image = tf.feature_column.numeric_column('image', shape=[16384*3], dtype=tf.float32)
num_hidden_units = [512, 256, 128]
model = tf.estimator.DNNClassifier(feature_columns=[feature_image],
                hidden_units=num_hidden_units,
                activation_fn=tf.nn.relu,
                n_classes=num_classes,
                model_dir="./checkpoints")


希望这对某人有所帮助!

关于python - Tensorflow估算器:功能列大小误差在1.5,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48781230/

10-14 19:22
查看更多