【问题标题】:Tensorflow-datasets: Cannot batch tensors of different shapes error even after resize?Tensorflow-datasets:即使调整大小后也无法批量处理不同形状的张量错误?
【发布时间】:2020-11-02 12:20:05
【问题描述】:

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]

【问题讨论】:

    标签: python tensorflow computer-vision


    【解决方案1】:

    您遇到此错误是因为tf.data.Dataset API 无法创建一批具有不同形状的张量。由于批处理函数将返回形状为(batch, height, width, channels) 的张量,因此heightwidthchannels 的值必须在整个数据集中保持不变。您可以在Introduction to Tensors guide 中阅读更多有关原因的信息。

    调整大小后进行批处理将解决您的问题:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-06
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多