【发布时间】:2018-07-24 16:11:21
【问题描述】:
当尝试使用固定估计器测试我的数据集时,我收到此错误:
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 为训练和验证图像创建张量流数据集。我很确定我的数据集工作正常,因为我能够初始化一个迭代器,循环整个集合,并打印出相关数据。
我认为问题出在罐装估算器的特征列 arg 上,但我不确定我能做些什么来解决它。我也尝试在我的train_input_fn 和test_input_fn 中返回iterator.get_next(),但这并没有改变错误。
任何帮助将不胜感激,我在网上找到的有关估算器的唯一示例是那些处理已经制作的数据集的示例,例如 tensorflow mnist 数据集,而不是某人从头开始创建的数据集(使用数据集 api)。谢谢!
【问题讨论】:
-
我认为抱怨是
input_fn应该返回 feature_name: feature_value 字典(包括“tr_data.train_imgs”键),而是返回单个Tensor。
标签: python tensorflow