Tensorflow-datasets: не удается выполнить ошибку с тензорами разных форм даже после изменения размера?

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