Входные данные в Convolution Neural Network (CNN) будут выглядеть следующим образом. Мы предполагаем, что наши данные представляют собой набор изображений.
Вы всегда должны указывать массив 4D
в качестве входных данных для CNN. Таким образом, входные данные имеют форму (batch_size, height, width, channels)
. В случае, если изображение RGB
будет иметь канал 3
, а изображение greyscale
будет иметь канал 1
.
Выход CNN также представляет собой массив 4D
. Где размер пакета будет таким же, как и размер входной партии, но остальные 3 размера изображения могут измениться в зависимости от значений filter
, kernel size
и padding
, которые мы используем
Давайте посмотрим на следующее код
import tensorflow as tf
from tensorflow.keras.layers import Conv2D, MaxPool2D, Dense, Flatten
model=tf.keras.models.Sequential()
model.add(Conv2D(filters=64, kernel_size=1, input_shape=(10,10,3)))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(10))
model.summary()
Вывод:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 10, 10, 64) 256
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 5, 5, 64) 0
_________________________________________________________________
flatten (Flatten) (None, 1600) 0
_________________________________________________________________
dense (Dense) (None, 10) 16010
=================================================================
Total params: 16,266
Trainable params: 16,266
Non-trainable params: 0
_________________________________________________________________
Хотя это выглядит так, как будто входная форма равна 3D
, но вы должны передать массив 4D
во время подгонки данных который должен быть как (batch_size, 10, 10, 3)
. Поскольку в аргументе input_shape нет значения размера пакета, мы можем go с любым размером пакета при подборе данных.
Форма вывода для Conv2D
и MaxPool2D
: (None, 10, 10, 64)
, (None, 5, 5, 64)
соответственно. Первое измерение представляет размер партии, который на данный момент составляет None
. Потому что сеть не знает размер пакета заранее. Как только вы подгоните данные, None
будет заменен размером пакета, который вы даете при подгонке данных.
Мы можем просто добавить слой свертки в верхней части другого слоя свертки, так как выходной размер свертки равен то же самое, что и входное измерение.
Обычно мы добавляем слои Dense
вверху слоя свертки для классификации изображений. Однако для ввода данных в плотный слой 2D
массив формы (batch_size, units)
. И вывод слоя свертки представляет собой массив 4D
.
Таким образом, мы должны изменить размер вывода, полученного от слоя свертки, на массив 2D
. Мы можем сделать это, вставив слой Flatten
поверх слоя свертки. Выровняйте слой squa sh размеры 3
изображения до размера single
. Теперь у нас есть только массив 2D
формы (batch_size, squashed_size)
, который приемлем для плотных слоев.
Примечание : мы всегда должны добавлять слой Flatten
непосредственно перед Dense
слоем в сети.
В случае простой сети вы можете запустить сеть со слоем Flatten
, поскольку свертка не требуется.
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10)
])