Форма вывода слоя Keras Dense

Я не могу понять логику получения выходной формы первого скрытого слоя. Я взял несколько следующих произвольных примеров;

Пример 1:

model.add(Dense(units=4,activation='linear',input_shape=(784,)))  
model.add(Dense(units=10,activation='softmax'))
model.summary()

Model: "sequential_4"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_7 (Dense)              (None, 4)                 3140      
_________________________________________________________________
dense_8 (Dense)              (None, 10)                50        
=================================================================
Total params: 3,190
Trainable params: 3,190
Non-trainable params: 0

Пример 2:

model.add(Dense(units=4,activation='linear',input_shape=(784,1)))   
model.add(Dense(units=10,activation='softmax'))
model.summary()
Model: "sequential_6"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_11 (Dense)             (None, 784, 4)            8         
_________________________________________________________________
dense_12 (Dense)             (None, 784, 10)           50        
=================================================================
Total params: 58
Trainable params: 58
Non-trainable params: 0

Пример 3:

model.add(Dense(units=4,activation='linear',input_shape=(32,28)))    
model.add(Dense(units=10,activation='softmax'))
model.summary()
Model: "sequential_8"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_15 (Dense)             (None, 32, 4)             116       
_________________________________________________________________
dense_16 (Dense)             (None, 32, 10)            50        
=================================================================
Total params: 166
Trainable params: 166
Non-trainable params: 0

Пример 4:

model.add(Dense(units=4,activation='linear',input_shape=(32,28,1)))    
model.add(Dense(units=10,activation='softmax'))
model.summary()
Model: "sequential_9"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_17 (Dense)             (None, 32, 28, 4)         8         
_________________________________________________________________
dense_18 (Dense)             (None, 32, 28, 10)        50        
=================================================================
Total params: 58
Trainable params: 58
Non-trainable params: 0

Пожалуйста, помогите мне понять логику.

Кроме того, я думаю, что ранги input_shape=(784,) и input_shape=(784,1) одинаковы, тогда почему их Output Shape разные?


person Navdeep    schedule 02.05.2020    source источник
comment
Этот вопрос уже задавался здесь (правда, в другой формулировке).   -  person today    schedule 02.05.2020


Ответы (6)


Согласно официальной документации Keras, для плотного слоя, когда вы вводите как input_shape=(input_units,), модальный принимает как входные массивы формы (*, input_units) и выводит массивы формы (*, output_units) [в вашем случае input_shape=(784,) обрабатывается как input shape=(*, 784), а вывод - _6 _] < / em>

Обычно для входного размера (batch_size, ..., input_dim) модальное окно дает выходной размер (batch_size, ..., units).

Поэтому, когда вы вводите ввод как input_shape=(784,), модальный принимает как входные массивы формы (*, 784), где * - размер пакета, а 784 как input_dim, давая выходную форму как (*, 4).

Когда вход (784,1), модальный принимает его как (*, 784, 1), где * - размер пакета, 784 - ..., а 1 - это input_dim => _ 20_ и выводится как (*, 784, 4) => (batch_size, ..., units).

То же самое касается input_shape=(32,28)=>(*,32,28), давая выход (*,32,4) и для ввода с input_shape=(32,28,1)=>(*,32,28,1), где снова * - размер партии, 32,28 - ... и 1 - вход_dim => _ 30_

Что означает "Нет", проверьте What что означает Нет в модели. краткое изложение KERAS?

person Charul Giri    schedule 02.05.2020

Логика очень проста: плотный слой применяется независимо к последнему измерению предыдущего слоя. Следовательно, ввод формы (d1, ..., dn, d) через плотный слой с m единицами приводит к выходу формы (d1, ..., dn, m), а слой имеет d*m+m параметров (m смещения).

Обратите внимание, что одни и те же веса применяются независимо, поэтому ваш пример 4 работает следующим образом:

for i in range(32):
    for j in range(28):
        output[i, j, :] = input[i, j, :] @ layer.weights + layer.bias

Где @ - матричное умножение. input[i, j] - вектор формы (1,), layer.weights имеет размер (1,4), а layer.bias - вектор (1,).

Это также объясняет, почему (784,) и (784,1) дают разные результаты: их последние измерения разные, 784 и 1.

person BlackBear    schedule 02.05.2020

Плотный слой требует ввода как (batch_size, input_size), большую часть времени мы пропускаем batch_size и определяем его во время обучения.

если ваша входная форма одномерная, в вашем первом случае (784,) модель будет принимать в качестве входных массивов shape (~, 784) и выходного массива shape (~, 4). По умолчанию добавляется смещение, равное 4 (так как 4 единицы). Таким образом, общие параметры будут

parameters -> 784*4 + 4 = 3140

если ваша входная форма является двумерной, во втором случае (784,1) модель будет принимать как входные массивы формы (784,1) и выходной массив формы (None, 784,4). _ 2_ - размер партии. По умолчанию добавляется смещение, равное 4 (так как 4 единицы). Таким образом, общие параметры будут

parameters -> 4(output units) + 4(bias) = 8
person Rajith Thennakoon    schedule 02.05.2020

Форма вывода слоя зависит от типа используемого слоя. Например, форма вывода слоя Dense основана на units, заданном в слое, где форма вывода слоя Conv зависит от filters.

Еще одна вещь, о которой следует помнить, по умолчанию, последнее измерение любого входа рассматривается как номер канала. В процессе оценки формы вывода количество каналов заменяется на units, определенное в слое. Для одномерного ввода, такого как input_shape=(784,), в конце важно использовать ,.

Пример 1 (одномерный), пример 2 (двухмерный, канал = 1), пример 3 (двухмерный, канал = 28) и пример 4 (трехмерный, канал = 1). Как упоминалось выше, последнее измерение заменяется на units, определенное в слое Dense.

Более подробная информация о размере, оси, канале, input_dim и т. Д. Очень четко упоминается в этом stackoverflow ответ.

person Vishnuvardhan Janapati    schedule 02.05.2020

По словам Кераса

Dense layer is applied on the last axis independently. [1]

https://github.com/keras-team/keras/issues/10736#issuecomment-406589140

Первый пример:

input_shape=(784,)
model.add(Dense(units=4,activation='linear',input_shape=(784,)))

В нем указано, что на входе всего 784 строки. И первый уровень модели состоит из 4 единиц. Каждая единица в плотном слое связана со всеми 784 рядами.

Поэтому

Output shape=  (None, 4) 

None представляет batch_size, который здесь не известен.

Второй пример

Здесь вводится тензор ранга 2.

input_shape=(784,1)
Units = 4

Итак, теперь на входе 784 строки и 1 столбец. Теперь каждая единица плотного слоя связана с 1 элементом из каждого из 784 рядов. Форма вывода = (Нет, 784, 4)
Нет для размера пакета.

Третий пример

 input_shape=(32,28)

Теперь каждая единица плотного слоя связана с 28 элементами из каждого 32 ряда. Так

output_shape=(None,32,4)

Последний пример

model.add(Dense(units=4,activation='linear',input_shape=(32,28,1)))   

снова плотный слой наносится на последнюю ось, и выходная форма становится

Output Shape =(None,32,28,4)

Примечание

ранг равен 1 в (784,), запятая не представляет другое измерение. ранг 2 в (784,1)

Схема в сообщении stackcoverflow может помочь вам в дальнейшем.

person Hafsa habib    schedule 02.05.2020

keras - это высокоуровневый API, который заботится о большом количестве абстракций. Следующий пример может помочь вам лучше понять. Это ближайший возможный необработанный эквивалент тензорного потока абстракции keras в вашем вопросе:

import tensorflow as tf
from pprint import pprint


for shape in [(None,784,), (None, 784,1), (None, 32,28), (None, 32,28,1)]:
    shapes_list = []

    input_layer_1 = tf.compat.v1.placeholder(dtype=tf.float32, shape=shape, name=None)
    shapes_list.append(input_layer_1.shape)
    d1 = tf.compat.v1.layers.dense(
        inputs=input_layer_1, units=4, activation=None, use_bias=True, kernel_initializer=None,
        bias_initializer=tf.zeros_initializer(), kernel_regularizer=None,
        bias_regularizer=None, activity_regularizer=None, kernel_constraint=None,
        bias_constraint=None, trainable=True, name=None, reuse=None
    )
    shapes_list.append(d1.shape)
    d2 = tf.compat.v1.layers.dense(
        inputs=d1, units=10, activation=tf.compat.v1.nn.softmax, use_bias=True, kernel_initializer=None,
        bias_initializer=tf.zeros_initializer(), kernel_regularizer=None,
        bias_regularizer=None, activity_regularizer=None, kernel_constraint=None,
        bias_constraint=None, trainable=True, name=None, reuse=None
    )
    shapes_list.append(d2.shape)
    print('++++++++++++++++++++++++++')
    pprint(shapes_list)
    print('++++++++++++++++++++++++++')

Функция Dense используется для создания плотно связанного слоя или Perceptron.

Согласно вашему фрагменту кода, похоже, вы создали многослойный перцептрон (с линейной функцией активации f (x) = x) со скрытым слоем 1, имеющим 4 нейрона, и выходным слоем, настроенным для прогнозирования 10 классов / меток.

Количество нейронов в каждом слое определяется аргументом units. Форма каждого нейрона в слое_L определяется выходными данными предыдущего слоя_L-1.

если вход в плотный слой (BATCH_SIZE, N, l), тогда форма выхода будет (BATCH_SIZE, N, value_passed_to_argument_units_in_Dense)

и если вход (BATCH_SIZE, N, M, l), то форма выхода (BATCH_SIZE, N, M, value_passed_to_argument_units_in_Dense) и так далее.

ПРИМЕЧАНИЕ.

это происходит только в случае Dense нейрона, потому что он не изменяет промежуточные размеры между batch_size и last_channel.

однако в случае других нейронов, таких как Conv2D -> (Max / Avg) pooling, промежуточные измерения могут (в зависимости от переданных аргументов) также измениться, поскольку эти нейроны действуют и на эти измерения.

person Pratik Kumar    schedule 02.05.2020