Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Modelo treinado com menos imagens que o exemplo do exercicio

Olá, durante todo o curso, eu notei que toda vez que treinei minha rede, ela não processava as 48mil imagens, e sim 1500 quando eu não utilizava
batch_size, e ainda menos imagens ao utilizar o batch_size. Quando eu rodo o shape de imagens_treino, existem 60mil imagens: (60000, 28, 28).

Mas quando rodo o treinamento do modelo:

modelo = keras.Sequential([
    keras.layers.Flatten(input_shape=(28,28)),
    keras.layers.Dense(256,activation=tensorflow.nn.relu),
    keras.layers.Dropout(0.2),
    #keras.layers.Dense(128,activation=tensorflow.nn.relu),
    #keras.layers.Dense(64,activation=tensorflow.nn.relu),
    keras.layers.Dense(10,activation=tensorflow.nn.softmax),
])

adam = keras.optimizers.Adam(learning_rate=0.002)

parando_cedo = [keras.callbacks.EarlyStopping(monitor='val_loss')]

modelo.compile(optimizer=adam , loss='sparse_categorical_crossentropy',
               metrics=['accuracy'])
historico = modelo.fit(imagens_treino,identificacoes_treino, batch_size=150 ,epochs=5, validation_split = 0.2 , callbacks=parando_cedo)

Só são processadas pouquíssimas imagens:

Epoch 1/5
320/320 ━━━━━━━━━━━━━━━━━━━━ 7s 18ms/step - accuracy: 0.7345 - loss: 0.7503 - val_accuracy: 0.8499 - val_loss: 0.4100
Epoch 2/5
320/320 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.8523 - loss: 0.4144 - val_accuracy: 0.8638 - val_loss: 0.3750
Epoch 3/5
320/320 ━━━━━━━━━━━━━━━━━━━━ 5s 8ms/step - accuracy: 0.8660 - loss: 0.3663 - val_accuracy: 0.8711 - val_loss: 0.3576
Epoch 4/5
320/320 ━━━━━━━━━━━━━━━━━━━━ 6s 11ms/step - accuracy: 0.8758 - loss: 0.3400 - val_accuracy: 0.8751 - val_loss: 0.3447
Epoch 5/5
320/320 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.8807 - loss: 0.3194 - val_accuracy: 0.8736 - val_loss: 0.3411

Alguém pode me ajudar a entender?

Abraço

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
2 respostas
solução!

Olá Glauber, tudo bem?

Esse número que aparece nos logs durante o treinamento, como 320/320 ou 1500/1500, não mostra a quantidade de imagens processadas, mas sim a quantidade de batches (lotes) em cada época.

O conjunto MNIST tem 60 mil imagens. Quando você utiliza o parâmetro validation_split=0.2, o Keras separa 20% delas, ou seja, 12 mil, para validação, e restam 48 mil para o treinamento. Essas 48 mil imagens são divididas em lotes de acordo com o valor definido em batch_size. Se você não passa nada, o valor padrão é 32, e as 48 mil imagens acabam formando aproximadamente 1500 lotes. É por isso que o log mostra 1500/1500. Já quando você define batch_size=150, o conjunto de treino é dividido em 320 lotes, e o log mostra 320/320.

Ou seja, todas as 48 mil imagens estão sendo usadas em cada época, mas não de uma vez só. O modelo as processa em blocos menores, atualizando os pesos a cada lote. Quanto menor o lote, mais vezes os pesos são atualizados dentro de uma época. Quanto maior, menos atualizações, mas cada uma leva em conta mais imagens de uma só vez. Essa é uma prática comum em deep learning, porque seria inviável processar todas as imagens de uma vez só na memória.

Portanto, pode ficar tranquilo: o modelo não está ignorando imagens. Ele está aproveitando todas elas a cada época, apenas organizadas em lotes de acordo com o batch_size que você escolheu.

Espero ter esclarecido sua dúvida. Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Entendi. Sim o processo da separação dos dados em batchs pra mim ja estava claro. O que não estava compreendendo era porque aparecia 1500 processamentos mesmo quando eu não determinava tamanho de batch_size na arquitetura do meu modelo, mas na sua resposta ficou claro o motivo, quando eu não defino, por padrão ele atribui 32 ao batch_size. Obrigado pelo esclarecimento