tf.keras.слои.Использование Conv2D

#python #tensorflow #machine-learning #keras #conv-neural-network

#python #тензорный поток #машинное обучение #keras #conv-нейронная сеть

Вопрос:

Я новичок в CNN и tensorflow. Прошло около 2 дней с момента работы с практической книгой Geron по TF. Я был бы признателен, если кто-нибудь сможет мне помочь.

Цель: понять, как и почему официальная документация keras (https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv2D ) использует Conv2D (m,n...) обозначения.

Проблема: я написал два набора кода. Я понял первый, который использует явный набор объявлений для числа filters и kernel_size .

Версия TF и Python:

 sys.version
Out: '3.7.9 (default, Aug 31 2020, 17:10:11) [MSC v.1916 64 bit (AMD64)]'
tf.__version__
Out: '2.3.0'
 

Код 1:

 import tensorflow as tf

input_shape = (4, 30, 60, 3) #Sample 30x60 images with RGB channel. `batch_size` = 4

a1=tf.keras.layers.Conv2D(filters=10,kernel_size=(3,3), input_shape=input_shape[1:])
a1(tf.random.normal(input_shape)).shape
a1.filters
a1.kernel_size

model = tf.keras.Sequential()
model.add(a1)
model.output_shape
model.summary()
 

Вывод:

 Out[99]: TensorShape([4, 28, 58, 10]) #we are not using padding. So, the shape of tensor is 4 batch x 28x58 x 10 filters
Out[99]: 10 # number of filters
Out[99]: (3, 3) #kernel size 
Out[99]: (None, 28, 58, 10) #this is the feature map for one image
Model: "sequential_24"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_34 (Conv2D)           (None, 28, 58, 10)        280       
=================================================================
Total params: 280
Trainable params: 280
Non-trainable params: 0
_________________________________________________________________
 

Я согласен с приведенным выше выводом. Я добавил свои мысли выше.

Код 2: Теперь я изменил приведенный выше код, чтобы явно не упоминать kernel_size и filters в соответствии с официальной документацией выше.

 a2=tf.keras.layers.Conv2D(10,3,3, input_shape=input_shape[1:]) #here's the change.
a2(tf.random.normal(input_shape)).shape
a2.filters
a2.kernel_size

model = tf.keras.Sequential()
model.add(a2)
model.output_shape
model.summary()
 

Вывод:

 Out[100]: TensorShape([4, 10, 20, 10])
Out[100]: 10
Out[100]: (3, 3)
Out[100]: (None, 10, 20, 10)
Model: "sequential_25"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_35 (Conv2D)           (None, 10, 20, 10)        280       
=================================================================
Total params: 280
Trainable params: 280
Non-trainable params: 0
_________________________________________________________________
 

Как мы можем видеть, единственное различие заключается в том, что код 1 использует Conv2D(filters=10,kernel_size=(3,3),... , а код 2 использует Conv2D(10,3,3,... . Более filters того, и kernel_size также совпадают. Однако output_shape они совершенно разные.

Почему это так? Может кто-нибудь, пожалуйста, объяснить? Я ничего не смог найти в официальной документации keras (https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv2D ).

Ответ №1:

При использовании tf.keras.слои.Conv2D() вы должны передать второй параметр (kernel_size) в виде кортежа (3, 3) , в противном случае вы присваиваете второй параметр, kernel_size=3, а затем третий параметр, который равен stride=3. Используя шаг 3, вы видите input_shape, который составляет 1/3 от исходной формы ввода, округленной до ближайшего целого числа.

Итак, измените свой код на:

 a2=tf.keras.layers.Conv2D(10, (3,3), input_shape=input_shape[1:])