Я работал над стандартной проблемой классификации изображений с 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)]]