Пояснення введення Keras: вхідна форма, одиниці, batch_size, затемнення тощо


261

Для будь-якого шару 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 елементів чи чисел.

Форма введення

Течія між шарами - це тензори. Тензори можна розглядати як матриці, з формами.

У Кераса сам вхідний шар - це не шар, а тензор. Це початковий тензор, який ви надсилаєте до першого прихованого шару. Цей тензор повинен мати таку ж форму, як і ваші дані про навчання.

Приклад: якщо у вас є 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).

Оскільки форма введення є єдиною, яку вам потрібно визначити, Керас вимагатиме її в першому шарі.

Але в цьому визначенні Керас ігнорує перший вимір, який є розміром партії. Ваша модель повинна мати можливість справлятися з будь-яким розміром партії, тому ви визначаєте лише інші розміри:

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), коли керас надсилає вам повідомлення або коли ви друкуєте резюме моделі, воно відображатиметься (None,50,50,3).

Перший вимір - це розмір партії, Noneтому що він може змінюватися залежно від кількості прикладів, які ви даєте для тренувань. (Якщо ви чітко визначили розмір партії, то замість вас з'явиться визначене вами число None)

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

  • Отже, визначаючи форму введення, ви ігноруєте розмір партії: input_shape=(50,50,3)
  • Виконуючи операції безпосередньо на тензорах, форма буде знову (30,50,50,3)
  • Коли керас надсилає вам повідомлення, форма буде (None,50,50,3)або (30,50,50,3), залежно від того, який тип повідомлення він вам надсилає.

Дим

І врешті-решт, що таке 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 значень.
Daniel Möller

@ DanielMöller: Ви можете, будь ласка, детальніше розібратися, у чому різниця між "вхідними елементами" та "розмірами"? Я б подумав, що на наведеному вище графіку був тривимірний вхідний шар, таким чином роблячи dim = 3 , тому мені цікаво, чого мені тут не вистачає, тому що я бачу, як ви пишете, що вхід одновимірний ...
Хелен

1
Вектор має один вимір, але багато елементів. Він має форму (n,) ---- Матриця має два виміри, розмірність 0 має m елементів, розмірність 1 має n елементів, загальна кількість mxn елементів, форма (m, n). Якщо ви уявляєте "кубик", розділений на маленькі кубики, кожен маленький кубик з даними, це був би 3D, з елементами mxnxo, формою (m, n, o).
Даніель Мьоллер

2
@Prince, порядок має значення. Ви можете налаштувати Keras на використання data_format = 'channels_first'або data_format='channels_last'. Рекомендую завжди використовувати останні канали (за замовчуванням Keras). Він більш сумісний з усіма іншими шарами.
Даніель Мьоллер

11

Розмір уточненого вводу:

Це не пряма відповідь, але я щойно зрозумів, що слово Input Dimension може бути досить заплутаним, тому будьте обережні:

Це (лише вимір слова) може стосуватися:

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

b) загальна кількість / довжина вхідних функцій (або вхідного шару) (28 x 28 = 784 для кольорового зображення MINST) або 3000 у значеннях спектра, перетворених FFT, або

"Вхідний шар / параметр вводу"

в) розмірність (# розмірності) вводу (як правило, 3D, як очікується, у Keras LSTM) або (#RowofSamples, #of Senors, #of Values ​​..) 3 - це відповідь.

"N розмірність введення"

d) СПЕЦИФІЧНА Вхідна форма (наприклад, (30,50,50,3) у цьому нерозгорнутому вхідному зображенні даних, або (30, 250, 3), якщо розпакований Керас:

Керас має свій 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 сильно різних версій англійської мови, то вам потрібно дуже високо вміти спілкуватися з різними носіями мови). Можливо, це теж саме і в мовах програмування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.