Изменение формы данных для глубокого обучения с использованием Keras

10

Я новичок в Keras, и я начал с примера MNIST, чтобы понять, как на самом деле работает библиотека. Фрагмент кода проблемы MNIST в папке примера Keras имеет вид:

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')
..........

Я не могу понять функцию изменения формы здесь. Что он делает и почему мы его применили?

enterML
источник

Ответы:

8

mnist.load_data()снабжает цифры MNIST структурой, (nb_samples, 28, 28)то есть двумя измерениями на пример, представляющими изображение в оттенках серого 28x28.

Слои Convolution2D в Keras, однако, предназначены для работы с 3-мя измерениями для каждого примера. Они имеют 4-х мерные входы и выходы. Это включает цветные изображения (nb_samples, nb_channels, width, height), но что более важно, она охватывает более глубокие слои сети, где каждый пример стал набор функции карты ИЭ (nb_samples, nb_features, width, height).

Для изображения в градациях серого для ввода цифр MNIST может потребоваться другой дизайн слоя CNN (или параметр конструктора слоя для принятия другой формы), или дизайн может просто использовать стандартный CNN, и вы должны явно выразить примеры как 1-канальный картинки. Команда Keras выбрала последний подход, который нуждается в доработке.

Нил Слэйтер
источник
Не могли бы вы объяснить логику «np.random.seed (1337)», использованного в коде? Почему 1337?
enterML
2
Ничего особенного в 1337 году для целей сценария, кроме повторяемости. Хорошей практикой является посев вашего RNG, чтобы вы могли повторить свою успешную работу именно в другой раз. Этот номер - внутренняя шутка для хакеров - urbandictionary.com/define.php?term=1337
Нейл Слэйтер