TensorFlow, изменяющийся в беспорядке CNNs - PullRequest
0 голосов
/ 05 апреля 2020

Я видел это сомнение несколько раз, но не получил ни одного ответа, по крайней мере, из-за моего недоразумения относительно того, как работает изменение формы и почему это необходимо. Я постараюсь быть кратким и конкретным.

Итак, я прочитал в документации TensorFlow, что, когда вы внедряете CNN, перед вводом ваших данных в слой Convolution необходимо преобразовать данные потому что слой Convolution использует 4D-тензор, а не просто список элементов (ваши загруженные обучающие данные).

Выходные данные процесса Convolution-Pooling также являются 4D-тензором. Который подается в слой Flatten. Теперь ... слой Flatten, используемый для получения тех же элементов списка, которые были необходимы для изменения формы перед передачей его в свертку. Но как получается, что любая вещь работает для слоя Flatten? Он получал список элементов (которые не могут быть переданы непосредственно в свертку) и теперь получает тензор 4D.

Так что, если свертка отсутствует, слой Flatten получает не измененные данные, если Является ли свёрточный пул, он получает 4-мерный тензор, а затем выводит ту же самую вещь? на мои сомнения.

Ура!

1 Ответ

1 голос
/ 07 апреля 2020

Входные данные в Convolution Neural Network (CNN) будут выглядеть следующим образом. Мы предполагаем, что наши данные представляют собой набор изображений.

enter image description here

Вы всегда должны указывать массив 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)
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...