Объяснение ввода Keras: input_shape, unit, batch_size, dim и т. Д.

262

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

Например, в документе сказано unitsуказать форму вывода слоя.

На изображении нейронной сети ниже hidden layer1имеется 4 единицы. Относится ли это непосредственно к unitsатрибуту Layerобъекта? Или unitsв Керасе форма каждого веса в скрытом слое равна числу единиц?

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

чучело
источник

Ответы:

412

Единицы:

Количество «нейронов», или «клеток», или того, что слой имеет внутри.

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

  • Скрытый слой 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). Тогда ваш тензор входного слоя должен иметь эту форму (см. Подробности в разделе «формы в керасе»).

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

  • Dense слои требуют ввода как (batch_size, input_size)
    • или (batch_size, optional,...,optional, input_size)
  • 2D сверточным слоям нужны входные данные в виде:
    • при использовании channels_last:(batch_size, imageside1, imageside2, channels)
    • при использовании channels_first:(batch_size, channels, imageside1, imageside2)
  • Использование 1D сверток и повторяющихся слоев (batch_size, sequence_length, features)

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

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

Отношение между формами и единицами - выходная форма

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

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

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

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

Плотный слой имеет выходную форму (batch_size,units). Так что, да, свойство слоя, также определяющее выходную форму.

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

Веса

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

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

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

Формы в Керасе

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

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

Но в этом определении 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).

Первое измерение - это размер пакета, Noneпотому что он может варьироваться в зависимости от того, сколько примеров вы приводите для обучения. (Если вы определили размер пакета явно, вместо него появится номер, который вы определили None)

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

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

Dim

И в конце концов, что это dim?

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

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

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

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


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

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

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: (None,3)
  • hidden1Out: (None,4)
  • hidden2Out: (None,4)
  • finalOut: (None,1)
Даниэль Мёллер
источник
7
Остается один вопрос о input_shape=параметре: к какому измерению относится первое значение аргумента? Я вижу такие вещи input_shape=(728, ), так что, на мой взгляд, первый аргумент относится к столбцам (фиксированный), а второй к строкам (свободно варьировать). Но как это соотносится с порядком строк в Python?
Максим.К
17
Эта запятая не создает второго измерения. Это просто нотация Python для создания, tupleкоторая содержит только один элемент. input_shape(728,)так же, как batch_input=(batch_size,728). Это означает, что каждый образец имеет 728 значений.
Даниэль Мёллер
@ DanielMöller: не могли бы вы пояснить, в чем разница между «входными элементами» и «измерениями»? Я думаю, что на графике выше был трехмерный входной слой, поэтому dim = 3 , поэтому мне интересно, чего мне здесь не хватает, потому что я вижу, как вы пишете, что вход является 1-мерным ...
Хелен
1
Вектор имеет одно измерение, но много элементов. Он имеет форму (n,) ---- Матрица имеет два измерения, измерение 0 имеет m элементов, измерение 1 имеет n элементов, всего mxn элементов, форма (m, n). Если представить себе «куб», разделенный на маленькие кубики, каждый маленький куб с данными, это будет 3D с элементами mxnxo, shape (m, n, o).
Даниэль Мёллер
2
@ Принц, порядок имеет значение. Вы можете настроить Keras для использования data_format = 'channels_first'или data_format='channels_last'. Я рекомендую всегда использовать последние каналы (по умолчанию Keras). Это более совместимо со всеми другими слоями.
Даниэль Мёллер
11

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

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

Это (только слово измерение) может относиться к:

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

b) Общее количество / длина Входных объектов (или Входного слоя) (28 x 28 = 784 для цветного изображения MINST) или 3000 в преобразованных значениях спектра FFT, или

«Входной слой / Размер входного объекта»

c) Размерность (# размерности) ввода (обычно 3D, как и ожидалось в Keras LSTM) или (#RowofSamples, #of Senors, #of Values ​​..) 3 является ответом.

«N Размерность ввода»

d) СПЕЦИАЛЬНАЯ Форма входа (например, (30,50,50,3) в этих развернутых данных входного изображения или (30, 250, 3), если развернутые Keras:

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 это относится к общему времени.

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

Я считаю, что одной из задач машинного обучения является работа с разными языками или диалектами и терминологией (например, если у вас 5–8 разных версий английского языка, вам необходимо очень хорошее владение языком для общения с разными носителями). Возможно, то же самое относится и к языкам программирования.

г пун
источник