Ошибка в форме ввода / вывода для классификации изображений в TensorFlow - PullRequest
1 голос
/ 10 февраля 2020

Я получаю следующую ошибку:

ValueError: Ошибка при проверке ввода: ожидалось, что flatten_input имеет 4 измерения, но получил массив с формой (80, 80, 3)

Traceback (most recent call last):
  File "/home/ubuntu/capstone/TFcaps.py", line 163, in <module>
    validation_steps=total_val // batch_size
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training.py", line 819, in fit
    use_multiprocessing=use_multiprocessing)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training_v2.py", line 235, in fit
    use_multiprocessing=use_multiprocessing)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training_v2.py", line 593, in _process_training_inputs
    use_multiprocessing=use_multiprocessing)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training_v2.py", line 706, in _process_inputs
    use_multiprocessing=use_multiprocessing)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/data_adapter.py", line 702, in __init__
    x = standardize_function(x)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training_v2.py", line 684, in standardize_function
    return dataset.map(map_fn, num_parallel_calls=dataset_ops.AUTOTUNE)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/data/ops/dataset_ops.py", line 1591, in map
    self, map_func, num_parallel_calls, preserve_cardinality=True)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/data/ops/dataset_ops.py", line 3926, in __init__
    use_legacy_function=use_legacy_function)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/data/ops/dataset_ops.py", line 3147, in __init__
    self._function = wrapper_fn._get_concrete_function_internal()
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/eager/function.py", line 2395, in _get_concrete_function_internal
    *args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/eager/function.py", line 2389, in _get_concrete_function_internal_garbage_collected
    graph_function, _, _ = self._maybe_define_function(args, kwargs)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/eager/function.py", line 2703, in _maybe_define_function
    graph_function = self._create_graph_function(args, kwargs)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/eager/function.py", line 2593, in _create_graph_function
    capture_by_value=self._capture_by_value),
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/framework/func_graph.py", line 978, in func_graph_from_py_func
    func_outputs = python_func(*func_args, **func_kwargs)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/data/ops/dataset_ops.py", line 3140, in wrapper_fn
    ret = _wrapper_helper(*args)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/data/ops/dataset_ops.py", line 3082, in _wrapper_helper
    ret = autograph.tf_convert(func, ag_ctx)(*nested_args)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/autograph/impl/api.py", line 237, in wrapper
    raise e.ag_error_metadata.to_exception(e)
ValueError: in converted code:

    /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training_v2.py:677 map_fn
        batch_size=None)
    /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training.py:2410 _standardize_tensors
        exception_prefix='input')
    /usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training_utils.py:573 standardize_input_data
        'with shape ' + str(data_shape))

    ValueError: Error when checking input: expected flatten_input to have 4 dimensions, but got array with shape (80, 80, 3)

Моя модель выглядит следующим образом:

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(80, 80, 3)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(4)])

А вот мои изображения:

Image shape:  (80, 80, 3)
Label:  [False False  True False]
<TakeDataset shapes: ((80, 80, 3), (4,)), types: (tf.float32, tf.bool)>

Вот как я собираю модель:

model.compile(optimizer=tf.keras.optimizers.Adam(lr=LR), loss=tf.keras.losses.CategoricalCrossentropy(), metrics=["accuracy"])

И вот как я приспосабливаюсь:

history = model.fit(
    train_data,
    steps_per_epoch=total_train // batch_size,
    epochs=epochs,
    validation_data=val_data,
    validation_steps=total_val // batch_size
)

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 10 февраля 2020

Перед выполнением model.fit() преобразуйте 3-мерные входные изображения поезда train_data[0] в 4-размеры следующим образом:

train_data[0] = np.reshape(train_data[0], ((-1, 80, 80, 3)))

Аналогично, преобразуйте входные метки поезда train_data[1] также в 2-х измерениях следующим образом:

train_data[1] = np.reshape(train_data[1], ((-1, 4)))

Аналогичные операции также необходимо выполнить для проверочных данных val_data входных изображений и меток.

PS: Приведенные выше решения предполагают, что train_data[0] & train_data[1] может использоваться для индексации входных изображений поездов и меток поездов соответственно. Если нет, измените индексирование / срезы, чтобы получить доступ к этим элементам и при необходимости измените их в 4-х измерениях (или 2-х измерениях). Кроме того, я замечаю, что для представления целевых значений True / False используются логические значения. Однако для обучения моделей требуется числовое представление этих меток c. Поэтому вы можете использовать Keras 'to_categorical() ( ссылка здесь ), чтобы преобразовать логические метки в закодированное представление в горячем виде перед тренировкой.

Надеюсь, это поможет! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...