Se quiser copiar o código do PIX:
00020126580014BR.GOV.BCB.PIX013643c5f950-535b-4658-b91f-1f1d135fe4105204000053039865802BR5925Antonio Cavalcante de Pau6009SAO PAULO61080540900062070503***6304946B
Aula 30 - CIFAR-10 - VGG 3 - Dropout - Data Augmentation
CIFAR-10
Recapitulando o que já fizemos
Partimos de um
modelo base, um
base line, que é a arquitetura
VGG3.
Depois aplicamos as técnicas de regularização:
Dropout na
aula 27,
Weight Decay na aula 28 e
Data Augmentation na
aula 29.
Resultados:
VGG3 +
Weight Decay -
74,84%
VGG3 +
Dropout -
82,33%
VGG3 +
Data Augmentation -
84,77%
Nessa aula iremos misturar duas técnicas:
Dropout + Data Augmentation.
Dropout + Data Augmentation
Nas aulas anterior, descobrimos que tanto o
abandono(
Dropout) quanto o
aumento de dados(
Data Augmentation) resultaram em uma melhoria significativa no desempenho do modelo.
Agora vamos experimentar a combinação dessas duas técnicas no modelo, para ver se o uso de ambas regularizações juntas, resultam em um melhor desempenho do modelo.
O código abaixo, do notebook dessa aula, completa do código de um modelo com
dropout.
# define cnn model
def define_model():
model = Sequential()
#bloco 1
model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(32, 32, 3)))
model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.2))
#bloco 2
model.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.3))
#bloco 3
model.add(Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.4))
model.add(Flatten())
model.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
# compile model
opt = SGD(learning_rate=0.001, momentum=0.9)
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
return model
Aumento de dados
# constrói o gerador de imagem de treinamento para aumento de dados
aug = ImageDataGenerator(
rotation_range = 20,
zoom_range = 0.15,
width_shift_range = 0.1,
height_shift_range = 0.1,
shear_range = 0.15,
horizontal_flip = True,
fill_mode = "nearest"
)
Dessa vez vamos rodar o treinamento com 200 épocas.
Usaremos o
aug,
EPOCHS e
BS no treinamento, isto é, no
model.fit().
Vamos passar o
aug para a função
model.fit(), chamando o método
flow().
O método
flow() cria um
iterador.
Podemos facilmente iterar e gerar os lotes de dados através dele.
model.fit(
aug.flow(
trainX, trainY, batch_size = BS
),
validation_data = (testX, testY),
steps_per_epoch = len(trainX) // BS,
epochs = EPOCHS
)
Definiremos o
batch_size como
32 e o
número de épocas 200.
Lembrando que
batch_size é o
número de
amostras que serão propagadas pela rede.
# initialize the number of epochs and batch size
EPOCHS = 200
BS = 32
Anaconda
O código dessa aula, eu rodei o código usando meu processamento local, já que o
colab impõe limites de processamento e tempo em seu
plano free.
Para isso, usei o
jupyter notebook do
Anaconda, criei um ambiente chamado
tensorflow, instalei tudo que precisamos nele: o
jupyter, o
CMD.exe, o
matplotlib, o
tensorflow, o
tensorboard...
Antes de executar o notebook localmente
Antes de rodar o notebook localmente, no painel do anaconda:
Abra o
prompt no ambiente que você criou, no meu caso, o ambiente
tensorflow, e rode na mesma pasta do notebook, o seguinte comando:
tensorboard --logdir logs --port 6006
O comando acima cria a pasta
logs na pasta do
notebook, e é onde serão colocados os dados gerados durante o treinamento da rede, dados relativos a como a rede evoluiu durante o treinamento, baseado nas precisões nos dados de treino e validação.
É onde o
tensorboard vai ler os dados para plotar os gráficos, e também definimos a
porta como
6006.
Conclusões
Lembre-se que os resultados podem variar devido à natureza estocástica do algoritmo ou procedimento de avaliação, ou por diferenças na precisão numérica.
Considere executar o exemplo algumas vezes e compare o resultado médio.
Neste caso, vemos não houve uma melhoria no desempenho do modelo, acabou ficando muito parecido com o que vimos com o
VGG3 + Data Augmentation.
A precisão foi de:
83,79%.
Os gráficos mostram que o modelo chegou a
85% na época
197, mas depois caiu.
Por essa aula é só.
Meu github:
Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook
Link do código fluente no Pinterest
Novamente deixo meus link de afiliados:
Obrigado, até a próxima e bons estudos. ;)