почему я получаю ошибку при переносе обучения?

Я обучаю модель оптического распознавания символов гуджарати. Входное изображение - это изображение персонажа. Я прошел 37 классов. Всего обучающих образов составляет 22200 (600 на класс), а тестовых образов - 5920 (160 на класс). Мои входные изображения - 32x32

Ниже мой код:

model = tf.keras.applications.DenseNet121(include_top=False, weights='imagenet', pooling='max')
base_inputs = model.layers[0].input
base_outputs = model.layers[-1].output # NOTICE -1 not -2
prefinal_outputs = layers.Dense(1024)(base_outputs)
final_outputs = layers.Dense(37)(prefinal_outputs)
new_model = keras.Model(inputs=base_inputs, outputs=base_outputs)
    
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    
    train_datagen = ImageDataGenerator(
                                       shear_range=0.2,
                                       zoom_range=0.2,
                                       
                                       
                                       horizontal_flip=False)
    
    test_datagen = ImageDataGenerator(horizontal_flip = False)
    
    training_set = train_datagen.flow_from_directory('C:/Users/shweta/Desktop/characters/train',
                                                     target_size = (32, 32),
                                                     batch_size = 64,
                                                     class_mode = 'categorical')
    
    test_set = test_datagen.flow_from_directory('C:/Users/shweta/Desktop/characters/test',
                                                target_size = (32, 32),
                                                batch_size = 64,
                                                class_mode = 'categorical')
    
    new_model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
    
    new_model.fit_generator(training_set,
                            
                             epochs = 25,
                             validation_data = test_set, shuffle=True)
    new_model.save('alphanumeric.mod')

Я получаю следующий результат:

Вывод кода

Заранее благодарим!


person Community    schedule 04.10.2020    source источник
comment
см. мой измененный ответ. Я думаю, вы выбрали неправильный слой в качестве выходного   -  person Gerry P    schedule 05.10.2020
comment
Привет! Я попробовал ваш измененный код, указав форму ввода. Но все равно возникает та же ошибка !!   -  person    schedule 06.10.2020
comment
Я смущен. Какой должна быть точная строка кода? !!!   -  person    schedule 06.10.2020
comment
см. исправленный ответ   -  person Gerry P    schedule 06.10.2020
comment
OK! Код разобрался. Но точность насыщена на 0,027. Я добавил свой вывод в вопрос. посмотри!   -  person    schedule 07.10.2020
comment
не уверен, что не так. Похоже, это вообще не тренировка. Придется увидеть набор данных, чтобы понять, что происходит. ЕСЛИ вы используете kaggle, разместите его там и поместите ссылку в комментарий   -  person Gerry P    schedule 07.10.2020
comment
UGH забыл включить код для компиляции модели. См. Исправленный ответ   -  person Gerry P    schedule 08.10.2020
comment
Да, я включил это в свой код ..!   -  person    schedule 08.10.2020


Ответы (2)


Во-первых, очень хорошо написанный код. Вот некоторые из вещей, которые я заметил, просматривая код и tf, keras docs.

Я хотел бы спросить, какие у вас ярлыки, потому что вы знаете, что categoryorical_crossentropy ожидает ОДИН ярлык с горячим кодом. (Отметьте это). Итак, если ваши ярлыки являются целыми числами, используйте sparsecategoricalentropy.

Похожая проблема Была запись, в которой кто-то пытался классифицировать на 2 и использовать категориальную вместо бинарной кроссэнтропии. Если хотите посмотреть.

Ура, дайте мне знать, как дела!

PS: @gerry сделал очень хорошее замечание, и если метки являются одними горячим кодированием, используйте категориальную кроссентропию!

person Seth P    schedule 04.10.2020
comment
Метки представляют собой имена каталогов классов и являются категориальными, но я столкнулся с этой ошибкой !!! Ошибка связана со вторым последним слоем, я думаю, с 1024 единицами! - person ; 05.10.2020
comment
Думаю, вы взяли предпоследний слой. Взгляните на картинку по этой ссылке kaggle.com/pytorch/densenet121. измените выходной слой на [-1], возможно, также сделайте обертывание слоев densenet121, чтобы вы могли использовать [-neg] index? дайте мне знать, как это происходит - person Seth P; 05.10.2020
comment
что вы имеете в виду под DenseNet121 wraparound? [-1] означает, что я рассматриваю последний слой DenseNet121. и [-2] означает второй последний слой, если я не ошибаюсь. - person ; 05.10.2020
comment
Я только что видел настраиваемый вами предфинальный слой. Также попробуйте новый код @jerry, который включает изменение индекса на -1. Я считаю, что ошибка кроется в финале и предфинале. поэтому я бы порекомендовал вам использовать другую предварительно обученную модель и попробовать ее. с таким же успехом ты мог бы найти себя. Я мог бы попробовать на своем ПК, но у меня нет набора данных! - person Seth P; 06.10.2020
comment
Я могу отправить вам свой набор данных в zip-файле, если вы можете попробовать код! - person ; 06.10.2020
comment
конечно, если у вас ссылка на привод lmk - person Seth P; 06.10.2020
comment
Спасибо за ссылку, которую я только что увидел. позволь мне разобраться в этом - person Seth P; 07.10.2020
comment
Хорошо! Вернись ко мне после того, как пройдешь! - person ; 08.10.2020
comment
Я просмотрел код. Неважно что я делаю. Это не узнает. Я предполагаю, что набор данных разорван. Я серьезно думаю, что изображения в наборе данных имеют слишком много шума или что-то не так. Вы знаете кого-нибудь, кто действительно заставляет его работать с этим набором данных. Также ImageDataGen заставляет это вращаться и редактировать. Я искренне верю, что на данный момент это набор данных. попробуйте получить другой набор данных и попробуйте train_test_split () и, возможно, создайте один набор данных с помощью python. Извините, что вернулся поздно !. - person Seth P; 10.10.2020

Код должен быть:

model = tf.keras.applications.DenseNet121(include_top=False, weights='imagenet, pooling='max', input_shape=(32,32,3))
base_outputs = model.layers[-1].output 
prefinal_outputs = layers.Dense(1024)(base_outputs)
final_outputs = layers.Dense(37)(prefinal_outputs)
new_model = keras.Model(inputs=model.input, outputs=final_outputs)
new_model.compile(Adam(), loss='categorical_crossentropy', metrics=['accuracy'])  

Также в будущем вам следует использовать model.fit. Model.fit теперь может работать с генераторами, а model.fit_generator будет обесценен в будущих версиях tensorflow. Я столкнулся с вашим набором данных и получил точные результаты примерно за 10 эпох. Вот еще несколько советов. Лучше всего использовать и регулируемую скорость обучения. Обратный вызов keras ReduceLROnPlateau упрощает это. Документация находится здесь. Настройте ее для отслеживания потери проверки. Мое использование показано ниже.

lr_adjust=tf.keras.callbacks.ReduceLROnPlateau( monitor="val_loss", factor=0.5, patience=1, verbose=1, mode="auto",
        min_delta=0.00001,  cooldown=0,  min_lr=0)

Также я рекомендую использовать обратный вызов ModelCheckpoint. Документация находится здесь. Настройте ее для отслеживания потерь при проверке, и она сохранит достигнутые веса самая низкая потеря проверки. Моя реализация показана ниже.

sav_loc=r'c:\Temp' # set this to the path where you want to save the weights
checkpoint=tf.keras.callbacks.ModelCheckpoint(filepath=save_loc, monitor='val_loss', verbose=1, save_best_only=True,
        save_weights_only=True, mode='auto', save_freq='epoch', options=None)
callbacks=[checkpoint, lr_adjust]

В model.fit включить обратные вызовы = обратные вызовы. По завершении обучения вы хотите загрузить эти сохраненные веса в модель, а затем сохранить модель. Вы можете использовать сохраненную модель, чтобы делать прогнозы. Код ниже.

model.load_weights(save_loc)  
model.save(save_loc)
person Gerry P    schedule 04.10.2020
comment
Привет ! Я запустил этот код и получил ожидаемый результат. Так что нет никаких расхождений в папках поезд и тест. Так в чем же может быть еще одна причина получения указанной выше ошибки ?! - person ; 05.10.2020
comment
Я запустил ваш отредактированный код, но получил сообщение об ошибке. Я отредактировал вопрос и полученную ошибку. Пожалуйста, посмотрите !!! - person ; 06.10.2020