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 под капотом, он преобразует данные в горячую кодировку и классифицирует данные.
Надеюсь, это поможет. Спасибо!