ValueError: Ошибка при проверке цели: ожидалось, что fc1000 будет иметь форму (30,), но получил массив с формой (1,)

Я пытался переучить модель ResNet50, чтобы классифицировать данные изображения животных на 30 различных классов. Для этого я составил список, содержащий массивы заданных изображений измерения (после расширения размеров и предварительной обработки):- (1, 224, 224, 3), таким образом, форма данного списка (после преобразования его в массив numpy) была (300, 1, 224, 224, 3), так как изначально я сделал только 300 изображений. Для Ytrain, я Label закодировал классы и один горячий кодировал потом. Для 30 классов у меня был простой массив измерений (300, 30). Затем я использовал DataGenerator для model.fit_generator, передавая Xtrain формы (1, 224, 224, 3) и Ytrain формы (30,), но получил ошибку: -

ValueError: Error when checking target: expected fc1000 to have shape (30,) but got array with shape (1,)

Вот мой код: -

inputShape = (224, 224)
preprocess = imagenet_utils.preprocess_input

df = pd.read_csv('DLBeginner/meta-data/train.csv')
df = df.head(300)
imagesData, target = [], []
c = 0

for images in df['Image_id']:
filename = args["target"] + '/' + images
image = load_img(filename, target_size = inputShape)
image = img_to_array(image)
image = np.expand_dims(image, axis = 0)
image = preprocess(image)
imagesData.append(image)
c += 1
print('Count = {}, Image > {} '.format(c, images))

imagesData = np.array(imagesData)
labelEncoder = LabelEncoder()
series = df['Animal'][0:300]
integerEncoded = labelEncoder.fit_transform(series)
Hot = OneHotEncoder(sparse = False)
integerEncoded = integerEncoded.reshape(len(integerEncoded), 1)
oneHot = Hot.fit_transform(integerEncoded)

model = ResNet50(include_top = True, classes = 30, weights = None)

model.compile(optimizer = 'Adam', loss='categorical_crossentropy', metrics = ['accuracy'])

l = len(imagesData)
def DataGenerator(Xtrain, Ytrain):
while(True):
    for i in range(l):
        arr1 = Xtrain[i]
        arr2 = Ytrain[i]
        print("arr1.shape : {}".format(arr1.shape))
        print("arr2.shape : {}".format(arr2.shape))
        yield(arr1, arr2)

и вот "подходящая часть"

generator = DataGenerator(imagesData, oneHot)

model.fit_generator(generator = generator, epochs = 5, steps_per_epoch=l)

Куда я иду не так? Заранее спасибо.

0 ответов

Переключение с 'categorical_crossentropy' к 'sparse_categorical_crossentropy' решил это за меня.

Просто хочу добавить немного больше деталей.

Если у вас есть проблема с классификацией нескольких классов и (1) если ваши цели закодированы одним горячим способом, используйте categorical_crossentropy(2) если ваши цели являются целыми числами, как в примере MNIST, используйте sparse_categorical_crossentropy. Когда вы используете это, Tensorflow под капотом, он преобразует данные в горячую кодировку и классифицирует данные.

Надеюсь, это поможет. Спасибо!

Другие вопросы по тегам