#python #tensorflow #computer-vision
#python #tensorflow #компьютерное зрение
Вопрос:
Возникли некоторые проблемы с tensorflow-datasets
модулем. Используя stanford_dogs
набор данных, я изменяю размер изображений [180,180]
, но когда модель обучена, из сообщения об ошибке появляется tensorflow
попытка загрузить изображения в их первоначальных размерах.
Что я делаю не так?
Код для репликации ошибки (и ошибки) ниже. Набор данных находится рядом 750mb
. Можно скопировать, вставить его google colab
и запустить для репликации.
import io
import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds
def _normalize_img(img, label):
img = tf.cast(img, tf.float32) / 255.
img = tf.image.resize(img,[180,180])
return (img, label)
train_dataset, test_dataset = tfds.load(name="stanford_dogs", split=['train', 'test'], as_supervised=True)
train_dataset = train_dataset.shuffle(1024).batch(32)
train_dataset = train_dataset.map(_normalize_img)
test_dataset = test_dataset.batch(32)
test_dataset = test_dataset.map(_normalize_img)
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(64,2,padding='same',activation='relu',input_shape=(180,180,3)),
tf.keras.layers.MaxPooling2D(2),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Conv2D(32,2,padding='same',activation='relu'),
tf.keras.layers.MaxPooling2D(2),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(120,activation='softmax')
])
model.compile(
optimizer=tf.keras.optimizers.Adam(0.001),
loss='sparse_categorical_crossentropy')
history = model.fit(
train_dataset,
epochs=5)
Сбой с ошибкой:
InvalidArgumentError: Cannot batch tensors with different shapes in component 0. First element had shape [278,300,3] and element 1 had shape [375,500,3].
[[node IteratorGetNext (defined at <ipython-input-29-15023f95f627>:39) ]] [Op:__inference_train_function_4908]
Ответ №1:
Вы сталкиваетесь с этой ошибкой, потому tf.data.Dataset
что API не может создать пакет тензоров с разными формами. Поскольку пакетная функция возвращает тензоры формы (batch, height, width, channels)
, значения height
, width
и channels
должны быть постоянными во всем наборе данных. Подробнее о причинах читайте во введении к руководству по тензорам.
Пакетирование после изменения размера решит вашу проблему :
train_dataset = train_dataset.shuffle(1024)
train_dataset = train_dataset.map(_normalize_img)
# we batch once every image is the same size
train_dataset = train_dataset.batch(32)