Home › Fóruns › Fórum Deep Learning com Python de A a Z: O Curso Completo › Classificação de imagens errando muito
- Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 1 ano, 9 meses atrás por Denny Ceccon.
- AutorPosts
- 27 de fevereiro de 2023 às 00:46 #39716
Olá!
Estou tentando fazer um modelo para identificar três pessoas em um conjuntos de fotos, mas por algum motivo está dando muita divergência.
Ao realizar o treinamento, vejo a precisão apontar no máximo 0.4643 no “val_accuracy”, que inclusive fica sempre no mesmo número e não aumenta mais. E ao rodar os testes manuais com o model.predict(), ele quase sempre retorna o mesmo resultado, seja 0, 1 ou 2 (pois são três classes). Alguém poderia apontar onde estou errando?Código:
import os import numpy as np from keras import Sequential from keras.layers import Conv2D, BatchNormalization, MaxPooling2D, Flatten, Dense, Dropout from keras.preprocessing.image import ImageDataGenerator from keras.utils import image_utils image_size = 128 images_dir = 'resources/images/' train_set_dir = images_dir + '/train_set' test_set_dir = images_dir + '/test_set' model = Sequential() model.add(Conv2D(128, (3, 3), input_shape=(image_size, image_size, 3), activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(128, (3, 3), input_shape=(image_size, image_size, 3), activation='relu')) model.add(BatchNormalization()) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(512, activation='relu')) model.add(Dropout(0.2)) model.add(Dense(512, activation='relu')) model.add(Dropout(0.2)) model.add(Dense(3, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) train_image_generator = ImageDataGenerator(rescale=1. / 255, rotation_range=7, horizontal_flip=True, shear_range=0.2, height_shift_range=0.07, zoom_range=0.2) test_image_generator = ImageDataGenerator(rescale=1. / 255) updated_train_images = train_image_generator.flow_from_directory(train_set_dir, target_size=(image_size, image_size)) updated_test_images = test_image_generator.flow_from_directory(test_set_dir, target_size=(image_size, image_size)) model.fit(updated_train_images, steps_per_epoch=1, epochs=15, validation_data=updated_test_images, validation_steps=1) # Teste manual images_dir = 'resources\\images\\test_set\\' images_dir_classes = ['class1', 'class2', 'class3'] for c in images_dir_classes: images_found = os.listdir(images_dir + c) images = [] for img_name in images_found: path = images_dir + c + '\\' + img_name imagem_teste = image_utils.load_img(path=path, target_size=(image_size, image_size)) imagem_teste = image_utils.img_to_array(imagem_teste) imagem_teste /= 255 imagem_teste = np.expand_dims(imagem_teste, axis=0) previsao = model.predict(imagem_teste) previsao = (previsao > 0.5) print('Img: {}, result: {}'.format(path, previsao.argmax()))
Nas imagens de treino, tenho 34 da “class1”, 22 da “class2” e 14 da “class3”.
Nas imagens de teste, tenho 16 da “class1”, 13 da “class2” e 7 da “class3”.Esse é o último teste que fiz:
Found 55 images belonging to 3 classes.
Found 28 images belonging to 3 classes.
Epoch 1/15
1/1 [==============================] – 8s 8s/step – loss: 2.7526 – accuracy: 0.2174 – val_loss: 4.0583 – val_accuracy: 0.4643
Epoch 2/15
1/1 [==============================] – 6s 6s/step – loss: 31.8275 – accuracy: 0.5000 – val_loss: 4.1187 – val_accuracy: 0.2500
Epoch 3/15
1/1 [==============================] – 6s 6s/step – loss: 23.6612 – accuracy: 0.3750 – val_loss: 4.5897 – val_accuracy: 0.2500
Epoch 4/15
1/1 [==============================] – 6s 6s/step – loss: 8.9260 – accuracy: 0.5625 – val_loss: 4.2077 – val_accuracy: 0.4643
Epoch 5/15
1/1 [==============================] – 6s 6s/step – loss: 9.6433 – accuracy: 0.6562 – val_loss: 4.6132 – val_accuracy: 0.4643
Epoch 6/15
1/1 [==============================] – 5s 5s/step – loss: 5.2914 – accuracy: 0.6522 – val_loss: 4.2309 – val_accuracy: 0.4643
Epoch 7/15
1/1 [==============================] – 6s 6s/step – loss: 9.2544 – accuracy: 0.4375 – val_loss: 4.9251 – val_accuracy: 0.2857
Epoch 8/15
1/1 [==============================] – 6s 6s/step – loss: 6.0937 – accuracy: 0.6875 – val_loss: 4.5431 – val_accuracy: 0.4286
Epoch 9/15
1/1 [==============================] – 5s 5s/step – loss: 1.4614 – accuracy: 0.7826 – val_loss: 4.9873 – val_accuracy: 0.4286
Epoch 10/15
1/1 [==============================] – 6s 6s/step – loss: 4.7670 – accuracy: 0.8125 – val_loss: 5.2148 – val_accuracy: 0.4643
Epoch 11/15
1/1 [==============================] – 6s 6s/step – loss: 4.3927 – accuracy: 0.7188 – val_loss: 5.2612 – val_accuracy: 0.4643
Epoch 12/15
1/1 [==============================] – 6s 6s/step – loss: 6.5084 – accuracy: 0.7500 – val_loss: 5.2081 – val_accuracy: 0.4286
Epoch 13/15
1/1 [==============================] – 5s 5s/step – loss: 3.9349 – accuracy: 0.8696 – val_loss: 5.7533 – val_accuracy: 0.4643
Epoch 14/15
1/1 [==============================] – 6s 6s/step – loss: 1.6328 – accuracy: 0.8438 – val_loss: 6.1089 – val_accuracy: 0.4643
Epoch 15/15
1/1 [==============================] – 5s 5s/step – loss: 2.4676 – accuracy: 0.7826 – val_loss: 6.3981 – val_accuracy: 0.464327 de fevereiro de 2023 às 14:34 #39720Olá Mateus,
É difícil dizer sem debugar o código, mas nós não costumamos debugar implementações pessoais. As partes mais evidentes (configuração da última camada, função de custo) me parecem estar OK. Eu te recomendo rodar seu código em uma IDE que te permita debugar, assim você executa linha por linha, isso ajuda a encontrar problemas.
27 de fevereiro de 2023 às 19:13 #39722Denny,
Agradeço pelo retorno.
É possível ver como os pixels mais importantes estão sendo detectados em cada época do treino? Gostaria de saber que tipo de coisa o modelo está identificando para poder ter uma ideia do que está acontecendo de errado.27 de fevereiro de 2023 às 19:23 #39723Não tem como, lembre-se que as redes neurais são conhecidas como “caixas pretas” porque não é possível entender como funciona seu processo de decisão. Mas mesmo assim, eu desconfio que o problema não seja relacionado ao funcionamento da rede mas sim à formatação dos dados, seria importante observar se a rede está recebendo os rótulos corretos por exemplo.
- AutorPosts
- Você deve fazer login para responder a este tópico.