首页 > 解决方案 > ValueError:检查目标时出错:预期 PREDICTIONS 有 4 个维度,但得到的数组形状为 (20, 131) [Keras]

问题描述

我正在尝试通过使用数据集中提供的类微调模型,在 Fruits-360 数据集( https://github.com/Horea94/Fruit-Images-Dataset )上训练预训练的 MobileNet 版本 2 模型。在训练我的自定义模型时,它会为model.fit_generator() 引发以下错误:

ValueError:检查目标时出错:预期 PREDICTIONS 有 4 个维度,但得到了形状为 (20, 131) 的数组

知道我可能会出错的地方以及如何解决吗?

我的python代码包含微调模型如下:

import os
import glob
import sys

import tensorflow as tf
from tensorflow import keras

from keras.preprocessing import image
from keras.applications.mobilenet_v2 import MobileNetV2
from keras.models import Model
from keras.optimizers import SGD
from keras.applications.mobilenet_v2 import preprocess_input, decode_predictions
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import ModelCheckpoint, EarlyStopping, CSVLogger

import PIL
from PIL import Image
import requests
from io import BytesIO
from keras.layers import Dense, GlobalAveragePooling2D, GlobalMaxPooling2D, Flatten, Dropout

def list_dirs(path):
    return [os.path.basename(x) for x in filter(
        os.path.isdir, glob.glob(os.path.join(path, '*')))]

labels = list_dirs("Path_to_dataset/fruits-360/Training")
labels.sort()

epochs = 100

# Base directory of raw jpg/png images
base_dir = 'Path_to_dataset/fruits-360'

train_path = os.path.join(base_dir, 'Training')
nb_train_samples = 67692
valid_path = os.path.join(base_dir, 'Test')
nb_val_samples = 22688
test_path = os.path.join(base_dir, 'test-multiple_fruits')

batch_size = 20

train_steps = nb_train_samples // batch_size
valid_steps = nb_val_samples // batch_size

classes = labels

img_width, img_height = 224, 224

train_datagen = ImageDataGenerator(rescale=1. / 255)
val_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(train_path, target_size=(img_width, img_height),
                                                    classes=classes, class_mode='categorical',
                                                    batch_size=batch_size)
val_generator = val_datagen.flow_from_directory(valid_path, target_size=(img_width, img_height),
                                                    classes=classes, class_mode='categorical',
                                                    batch_size=batch_size)

base_model = MobileNetV2(weights='imagenet', include_top=True)

x = base_model.layers[-6].output
predictions = Dense(len(classes), activation='softmax', name='PREDICTIONS')(x)
model = Model(input=base_model.input, outputs=predictions)

for layer in model.layers[:-5]:
    layer.trainable = False

model.compile(optimizer=SGD(lr=0.0001, momentum=0.9),
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])
model.summary()

model.fit_generator(train_generator, epochs= epochs,
                                      steps_per_epoch=train_steps,
                                      validation_data = val_generator,
                                      validation_steps= valid_steps)

标签: pythontensorflowkerasoutputconv-neural-network

解决方案


问题的发生是因为“ x = base_model.layers[-6].output ”的输出与“ Dense(len(classes), activation='softmax', name='PREDICTIONS')(x) ”的输入不同. 这可以通过包含以下代码行来解决,该代码行是一个展平层,用于展平输入:

x = Flatten(name='FLATTEN')(x)

该模型的代码如下:

base_model = MobileNetV2(weights='imagenet', include_top=True)

x = base_model.layers[-6].output
x = Flatten(name='FLATTEN')(x)
predictions = Dense(len(classes), activation='softmax', name='PREDICTIONS')(x)
model = Model(input=base_model.input, outputs=predictions)

推荐阅读