Remodelagem de dados para aprendizado profundo usando Keras

10

Sou iniciante no Keras e comecei com o exemplo do MNIST para entender como a biblioteca realmente funciona. O trecho de código do problema MNIST na pasta de exemplo Keras é fornecido como:

import numpy as np
np.random.seed(1337)  # for reproducibility

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten  
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import np_utils

batch_size = 128
nb_classes = 10
nb_epoch = 12

# input image dimensions
img_rows, img_cols = 28, 28
# number of convolutional filters to use
nb_filters = 32
# size of pooling area for max pooling
nb_pool = 2
# convolution kernel size
nb_conv = 3

# the data, shuffled and split between train and test sets
(X_train, y_train), (X_test, y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)
X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
..........

Não consigo entender a função remodelar aqui. O que está fazendo e por que aplicamos?

enterML
fonte

Respostas:

8

mnist.load_data()fornece os dígitos MNIST com estrutura, (nb_samples, 28, 28)ou seja, com 2 dimensões por exemplo, representando uma imagem em escala de cinza 28x28.

As camadas Convolution2D no Keras, no entanto, são projetadas para trabalhar com três dimensões por exemplo. Eles têm entradas e saídas 4-dimensionais. Isso cobre imagens coloridas (nb_samples, nb_channels, width, height), mas, mais importante, cobre camadas mais profundas da rede, onde cada exemplo se tornou um conjunto de mapas de recursos, por exemplo (nb_samples, nb_features, width, height).

A imagem em escala de cinza da entrada de dígitos MNIST precisaria de um design de camada CNN diferente (ou de um parâmetro para o construtor de camadas para aceitar uma forma diferente) ou o design poderia simplesmente usar um CNN padrão e você deve expressar explicitamente os exemplos como 1 canal imagens. A equipe Keras escolheu a última abordagem, que precisa ser remodelada.

Neil Slater
fonte
Você poderia explicar a lógica por trás do "np.random.seed (1337)" usado no código? Por que 1337?
enterML 13/05
2
Nada de especial em 1337 para os propósitos do script, exceto a repetibilidade. É uma boa prática semear seu RNG para que você possa repetir seu trabalho bem-sucedido exatamente em outra ocasião. O número é um pouco de uma piada interna para hackers - urbandictionary.com/define.php?term=1337
Neil Slater