Tensorflow输入函数返回无效值(用Tensor代替Tensor dict)

时间:2018-08-28 16:32:34

标签: python dataframe tensorflow image-processing

我一直在使用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'>",)

我试图查找可能的解决方案,导致我进入tensorflow ValueError: features should be a dictionary of `Tensor`s. Given type: <class 'tensorflow.python.framework.ops.Tensor'>,并尝试了提供的解决方案。

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)}.",)

这使我相信我犯了某种根本性的错误。解析数据,分配标签等。

但是我不知道哪里出了问题。

编辑:

我更改了代码,以便估算器构造函数为

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

消除ValueError:

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

0 个答案:

没有答案