Для любого слоя Keras (Layer class) может кто-нибудь объяснить, как понять разницу между input_shape, units, dim, и т.д.?

Например, в документе говорится, что единицы определяют форму вывода слоя.

На изображении нейронной сети ниже скрытый слой1 имеет 4 единицы. Преобразуется ли это напрямую в атрибут units объекта Layer? Или единиц в Keras равняется форме каждого веса в скрытом слое, умноженному на количество единиц?

Короче говоря, как понять / визуализировать атрибуты модели - в частности, слои - с изображением ниже? enter image description here

Ответы (2)

Единицы:

Количество «нейронов», или «клеток», или чего-то еще, что находится внутри слоя.

Это свойство каждого слоя, и да, оно связано с выходной формой (как мы увидим позже). На вашем изображении, за исключением входного слоя, который концептуально отличается от других слоев, у вас есть:

  • Скрытый слой 1: 4 единицы (4 нейрона)
  • Скрытый слой 2: 4 единицы
  • Последний слой: 1 шт.

Фигуры

Формы являются следствием конфигурации модели. Фигуры - это кортежи, представляющие, сколько элементов имеет массив или тензор в каждом измерении.

Пример: фигура (30,4,10) означает массив или тензор с 3 измерениями, содержащий 30 элементов в первом измерении, 4 во втором и 10 в третий, всего 30 * 4 * 10 = 1200 элементов или чисел.

Форма ввода

То, что перетекает между слоями, есть тензоры. Тензоры можно рассматривать как матрицы с формами.

В Keras входной слой сам по себе не слой, а тензор. Это начальный тензор, который вы отправляете на первый скрытый слой. Этот тензор должен иметь ту же форму, что и ваши тренировочные данные.

Пример: если у вас есть 30 изображений размером 50x50 пикселей в RGB (3 канала), форма ваших входных данных будет (30,50,50,3). Тогда ваш тензор входного слоя должен иметь эту форму (подробности см. В разделе «Фигуры в керасе»).

Каждый тип слоя требует ввода с определенным количеством измерений:

  • Плотные слои требуют ввода как (batch_size, input_size)
    • или (размер_пакета, необязательный, ..., необязательный, размер_входа)
  • Для сверточных 2D-слоев необходимы входные данные:
    • при использовании channels_last: (batch_size, imageside1, imageside2, channels)
    • при использовании channels_first: (размер_пакета, каналы, imageside1, imageside2)
  • 1D свертки и повторяющиеся слои используют (размер_пакета, длина_последовательности, функции)

Теперь входная форма - единственная, которую вы должны определить, потому что ваша модель не может ее знать. Это знаете только вы, основываясь на данных ваших тренировок.

Все остальные формы рассчитываются автоматически на основе единиц и особенностей каждого слоя.

Связь между формами и единицами - Форма вывода

Учитывая входную форму, все остальные формы являются результатом вычислений слоев.

«Единицы» каждого слоя будут определять выходную форму (форму тензора, который создается слоем и который будет входом для следующего слоя).

Каждый тип слоя работает по-своему. Плотные слои имеют форму вывода, основанную на «единицах», сверточные слои имеют форму вывода, основанную на «фильтрах». Но это всегда основано на каком-то свойстве слоя. (См. Документацию о том, что выводит каждый слой)

Давайте покажем, что происходит со слоями "Dense", тип которых показан на вашем графике.

Плотный слой имеет форму вывода (размер партии, единицы). Итак, да, единицы, свойство слоя, также определяют форму вывода.

  • Скрытый слой 1: 4 единицы, форма вывода: (batch_size, 4).
  • Скрытый слой 2: 4 единицы, форма вывода: (batch_size, 4).
  • Последний слой: 1 блок, форма вывода: (batch_size, 1).

Вес

Вес будет полностью автоматически рассчитан на основе входных и выходных форм. Опять же, каждый тип слоя работает определенным образом. Но веса будут матрицей, способной преобразовывать входную форму в выходную форму с помощью некоторой математической операции.

В плотном слое веса умножают все входные данные. Это матрица с одним столбцом на вход и одной строкой на единицу, но это часто не важно для основных работ.

На изображении, если бы на каждой стрелке было число умножения, все числа вместе составили бы матрицу весов.

Фигуры в Керасе

Ранее я приводил пример 30 изображений, 50x50 пикселей и 3 каналов, имеющих форму ввода (30,50,50,3).

Так как форма ввода - единственная, которую вам нужно определить, Keras потребует ее на первом слое.

Но в этом определении Керас игнорирует первое измерение, которым является размер пакета. Ваша модель должна иметь дело с любым размером партии, поэтому вы определяете только другие размеры:

input_shape = (50,50,3)
    #regardless of how many images I have, each image has this shape        

Необязательно или когда это требуется для определенных типов моделей, вы можете передать форму, содержащую размер партии, через batch_input_shape = (30,50,50,3) или batch_shape = (30 , 50,50,3). Это ограничивает ваши возможности обучения этим уникальным размером пакета, поэтому его следует использовать только тогда, когда это действительно необходимо.

В любом случае, тензоры в модели будут иметь размер партии.

Итак, даже если вы использовали input_shape = (50,50,3), когда keras отправляет вам сообщения или когда вы распечатываете сводку модели, будет отображаться (None, 50, 50,3).

The first dimension is the batch size, it's None because it can vary depending on how many examples you give for training. (If you defined the batch size explicitly, then the number you defined will appear instead of None)

Кроме того, в расширенных работах, когда вы фактически работаете непосредственно с тензорами (например, внутри лямбда-слоев или в функции потерь), размер пакета будет там.

  • Итак, при определении формы ввода вы игнорируете размер пакета: input_shape = (50,50,3)
  • При выполнении операций непосредственно с тензорами форма снова будет (30,50,50,3)
  • Когда keras отправляет вам сообщение, форма будет (Нет, 50,50,3) или (30,50,50,3), в зависимости от типа сообщения, которое он вам отправляет.

Тусклый

И в итоге что такое dim?

Если ваша входная фигура имеет только одно измерение, вам не нужно указывать ее как кортеж, вы указываете input_dim как скалярное число.

Итак, в вашей модели, где ваш входной слой имеет 3 элемента, вы можете использовать любой из этих двух:

  • input_shape = (3,) - Запятая необходима, когда у вас есть только одно измерение
  • input_dim = 3

Но когда мы имеем дело непосредственно с тензорами, часто dim будет относиться к тому, сколько измерений имеет тензор. Например, тензор с формой (25,10909) имеет 2 измерения.


Определение вашего изображения в Керасе

У Keras есть два способа сделать это: Последовательные модели или функциональный API Модель. Я не люблю использовать последовательную модель, позже вам все равно придется ее забыть, потому что вам понадобятся модели с ветвями.

PS: здесь я проигнорировал другие аспекты, например функции активации.

С последовательной моделью:

from keras.models import Sequential  
from keras.layers import *  

model = Sequential()    

#start from the first hidden layer, since the input is not actually a layer   
#but inform the shape of the input, with 3 elements.    
model.add(Dense(units=4,input_shape=(3,))) #hidden layer 1 with input

#further layers:    
model.add(Dense(units=4)) #hidden layer 2
model.add(Dense(units=1)) #output layer   

С функциональной моделью API:

from keras.models import Model   
from keras.layers import * 

#Start defining the input tensor:
inpTensor = Input((3,))   

#create the layers and pass them the input tensor to get the output tensor:    
hidden1Out = Dense(units=4)(inpTensor)    
hidden2Out = Dense(units=4)(hidden1Out)    
finalOut = Dense(units=1)(hidden2Out)   

#define the model's start and end points    
model = Model(inpTensor,finalOut)

Формы тензоров

Помните, что вы игнорируете размеры пакета при определении слоев:

  • inpTensor: (Нет, 3)
  • hidden1Out: (Нет, 4)
  • hidden2Out: (Нет, 4)
  • finalOut: (Нет, 1)

Уточнен входной размер:

Не прямой ответ, но я только что понял, что термин «Входное измерение» может сбивать с толку, так что будьте осторожны:

Одно только слово «измерение» может относиться к:

a) Размер входных данных (или потока), например # N осей датчика для передачи сигнала временного ряда или цветовых каналов RGB (3): предлагаемый термин = "Размер входного потока"

b) Общее количество / длина входных характеристик (или входного слоя) (28 x 28 = 784 для МИНУТИЧЕСКОГО цветного изображения) или 3000 в значениях спектра, преобразованных БПФ, или

«Размер входного слоя / входного элемента»

c) Размерность (количество измерений) входных данных (обычно 3D, как ожидается в Keras LSTM) или (количество строк образцов, количество датчиков, количество значений ..) 3 равно ответ.

«N-мерность входа»

d) КОНКРЕТНАЯ форма ввода (например, (30,50,50,3) в данных развернутого входного изображения или (30, 2500, 3) в развернутом виде Керас:

В Keras input_dim относится к размеру входного слоя / количеству входных элементов

    model = Sequential()
    model.add(Dense(32, input_dim=784))  #or 3 in the current posted example above
    model.add(Activation('relu')) 

В Keras LSTM это общее количество временных шагов

Этот термин очень сбивает с толку, мы живем в очень запутанном мире !!

• 100001 Наверное, так и в языках программирования.

2022 WebDevInsider