ValueError:形状不匹配:标签的形状(接收到(200,))应等于对数的形状,但最后一个尺寸(接收到(100,2))

时间:2020-07-14 08:03:52

标签: python python-3.x tensorflow keras neural-network

使用以下方法训练模型来识别和分类图像

epochs=2
history = model.fit_generator(train_data_gen,
steps_per_epoch=int(np.ceil(total_train / float(BATCH_SIZE))),
epochs=epochs,
validation_data=val_data_gen,
validation_steps=int(np.ceil(total_validation / float(BATCH_SIZE)))
)

ValueError:形状不匹配:标签的形状(接收到(200,))应等于对数的形状,但最后一个尺寸(接收到(100,2))除外。

..此错误出现。我阅读了同一个形状不匹配问题的多个答案,但找不到正确的解决方案。

整个代码如下:

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator

import numpy as np
import os
import matplotlib.pyplot as plt

_URL = r'https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip'
zip_dir = tf.keras.utils.get_file('cats_and_dogs_filtered.zip', origin = _URL, extract = 
True)

base_dir = os.path.join(os.path.dirname(zip_dir), 'cats_and_dogs_filtered')
train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'validation')

train_cats_dir = os.path.join(train_dir, 'cats')
train_dogs_dir = os.path.join(train_dir, 'dogs')
validation_cats_dir = os.path.join(validation_dir, 'cats')
validation_dogs_dir = os.path.join(validation_dir, 'dogs')

num_cats_tr = len(os.listdir(train_cats_dir))
num_dogs_tr = len(os.listdir(train_dogs_dir))

num_cats_val = len(os.listdir(validation_cats_dir))
num_dogs_val = len(os.listdir(validation_dogs_dir))

total_train = num_cats_tr + num_dogs_tr

total_validation = num_cats_val + num_dogs_val

print('training cat images:', num_cats_tr)
print('training dog images:', num_dogs_tr)
print('validation cat images:', num_cats_val)
print('validation dog images:', num_dogs_val)

print('total training images:', total_train)
print('total validation images:', total_validation)

BATCH_SIZE = 100
IMG_SHAPE = 150

def plotImages(images_arr):
    fig, axes = plt.subplots(1,5, figsize=(20,20))
    axes = axes.flatten()
    for img, ax in zip(images_arr, axes):
        ax.imshow(img)
    plt.tight_layout()
    plt.show()

image_gen = ImageDataGenerator(rescale = 1./255, horizontal_flip = True)

train_data_gen = image_gen.flow_from_directory(batch_size=BATCH_SIZE, directory=train_dir, 
shuffle=True, target_size=(IMG_SHAPE,IMG_SHAPE))

augmented_images = [train_data_gen[0][0][0] for i in range(5)]
plotImages(augmented_images)

image_gen = ImageDataGenerator(rescale=1./255, rotation_range=45)

train_data_gen = image_gen.flow_from_directory(batch_size=BATCH_SIZE, directory=train_dir, 
shuffle=True, target_size=(IMG_SHAPE,IMG_SHAPE))

augmented_images = [train_data_gen[0][0][0] for i in range(5)]
plotImages(augmented_images)

image_gen = ImageDataGenerator(rescale=1./255, zoom_range=0.5)

train_data_gen = image_gen.flow_from_directory(batch_size=BATCH_SIZE, directory=train_dir, 
shuffle=True, target_size=(IMG_SHAPE,IMG_SHAPE))

image_gen_train = ImageDataGenerator(rescale=1./255, rotation_range=40, 
                  width_shift_range=0.2, height_shift_range=0.2, 
                  shear_range=0.2, zoom_range=0.2, horizontal_flip=True, 
                  fill_mode='nearest')

train_data_gen = image_gen_train.flow_from_directory(batch_size=BATCH_SIZE, 
                 directory=train_dir, shuffle=True, 
                 target_size=(IMG_SHAPE,IMG_SHAPE))

augmented_images = [train_data_gen[0][0][0] for i in range(5)]
plotImages(augmented_images)

image_gen_val = ImageDataGenerator(rescale=1./255)

val_data_gen = image_gen_val.flow_from_directory(batch_size=BATCH_SIZE, 
               directory=validation_dir, 
               target_size=(IMG_SHAPE,IMG_SHAPE), 
               class_mode='binary')

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150,150,3)),
    tf.keras.layers.MaxPooling2D(2,2),
    
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    
    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    
    tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(2)
])

model.compile(optimizer='adam', 
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
     metrics=['accuracy'])

model.summary()

epochs=2
history = model.fit_generator(
    train_data_gen,
    steps_per_epoch=int(np.ceil(total_train / float(BATCH_SIZE))),
    epochs=epochs,
    validation_data=val_data_gen,
    validation_steps=int(np.ceil(total_validation / float(BATCH_SIZE)))
)

1 个答案:

答案 0 :(得分:1)

您还需要在class_mode='binary'中定义image_gen_train.flow_from_directory

此处为运行代码:https://colab.research.google.com/drive/1tisXyQFLHet0vrLdmyAxKNOwHMmCayXu?usp=sharing