Keras 입력 설명 : input_shape, units, batch_size, dim 등


261

어떤 Keras 층 (위해 Layer클래스), 캔 누군가의 차이점을 이해하는 방법을 설명합니다 input_shape, units, dim, 등?

예를 들어 의사는 units레이어의 출력 모양을 지정 한다고 말합니다 .

아래 신경망의 이미지 hidden layer1에는 4 단위가 있습니다. 이것이 객체 의 units속성으로 직접 변환됩니까 Layer? 아니면 unitsKeras에서 숨겨진 레이어의 모든 가중치의 모양에 단위 수를 곱한 것입니까?

간단히 말해 아래 이미지를 사용하여 모델, 특히 레이어의 속성을 어떻게 이해 / 시각화합니까? 여기에 이미지 설명을 입력하십시오

답변:


412

단위 :

"뉴런"또는 "셀"의 양 또는 레이어 내부에있는 모든 것.

각 레이어의 속성이며 예, 출력 모양과 관련이 있습니다 (나중에 볼 수 있음). 다른 레이어와 개념적으로 다른 입력 레이어를 제외하고 그림에는 다음이 있습니다.

  • 숨겨진 층 1 : 4 단위 (4 뉴런)
  • 숨겨진 레이어 2 : 4 대
  • 마지막 층 : 1 개 단위

모양

모양은 모델 구성의 결과입니다. 셰이프는 배열 또는 텐서가 각 차원에있는 요소 수를 나타내는 튜플입니다.

예 : 모양 (30,4,10)은 첫 번째 차원에 30 개의 요소, 두 번째에 4, 세 번째에 10을 포함하는 3 차원 배열 또는 텐서를 의미하며 총 30 * 4 * 10 = 1200 개의 요소 또는 숫자입니다.

입력 모양

층 사이에 흐르는 것은 텐서입니다. 텐서는 모양이있는 행렬로 볼 수 있습니다.

Keras에서 입력 레이어 자체는 레이어가 아니라 텐서입니다. 첫 번째 숨겨진 레이어로 보내는 시작 텐서입니다. 이 텐서는 훈련 데이터와 모양이 같아야합니다.

예 : RGB (3 채널)로 50x50 픽셀의 30 개 이미지가있는 경우 입력 데이터의 모양은입니다 (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 개, 50x50 픽셀 및 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입니까?

입력 셰이프에 하나의 차원 만있는 경우 튜플로 제공 할 필요가없고 input_dim스칼라 숫자로 제공 됩니다.

따라서 입력 레이어에 3 개의 요소가있는 모델에서 다음 두 가지 중 하나를 사용할 수 있습니다.

  • input_shape=(3,) -차원이 하나 뿐인 경우 쉼표가 필요합니다
  • input_dim = 3

그러나 텐서를 직접 처리 할 때 종종 dim텐서의 치수를 나타냅니다. 예를 들어, 모양 (25,10909)의 텐서는 2 차원입니다.


Keras에서 이미지 정의

Keras에는 두 가지 방법, Sequential모델 또는 기능적 API가 Model있습니다. 순차적 모델을 사용하는 것을 좋아하지 않습니다. 나중에 분기가있는 모델을 원하기 때문에 어쨌든 잊어 버려야합니다.

추신 : 여기에서는 활성화 기능과 같은 다른 측면을 무시했습니다.

순차 모델의 경우 :

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, )으므로, 첫 번째 인수는 열 (고정)과 두 번째 행 (다양한 자유)을 나타냅니다. 그러나 이것이 파이썬의 주요 행 배열과 어떻게 관련이 있습니까?
Maxim.K

17
해당 쉼표는 2 차원을 작성하지 않습니다. tuple하나의 요소 만 포함 하는을 만들기위한 파이썬 표기법 일뿐 입니다. input_shape(728,)와 동일합니다 batch_input=(batch_size,728). 이는 각 샘플에 728 개의 값이 있음을 의미합니다.
Daniel Möller

@ DanielMöller : "입력 요소"와 "치수"의 차이점이 무엇인지 조금 더 자세히 설명해 주시겠습니까? 위의 그래프는 3 차원 입력 레이어를 가지고 있다고 생각합니다. 따라서 dim = 3 이므로 입력이 1 차원이라는 것을 알기 때문에 여기서 누락 된 부분이 궁금합니다.
Helen

1
벡터는 1 차원이지만 많은 요소를 가지고 있습니다. 행렬의 모양은 (n,)입니다 ---- 행렬에는 2 차원이 있고 차원 0에는 m 개의 요소가 있고 차원 1에는 n 개의 요소가 있으며 총 mxn 요소, 모양 (m, n)입니다. 작은 큐브로 나누어 진 "큐브", ​​각각의 작은 큐브에 데이터가 있다고 상상한다면, 이것은 mxnxo 요소, 모양 (m, n, o)을 가진 3D입니다.
Daniel Möller

2
@ 프린스, 주문이 중요합니다. 당신은 Keras 사용하고 구성 할 수 있습니다 data_format = 'channels_first'또는 data_format='channels_last'. 항상 채널을 마지막에 사용하는 것이 좋습니다 (Keras의 기본값). 다른 모든 레이어와 더 호환됩니다.
Daniel Möller

11

입력 치수가 명확 해짐 :

직접적인 대답은 아니지만 입력 차원이라는 단어가 충분히 혼란 스러울 수 있음을 깨달았습니다.

(단어 차원 만) 다음을 참조 할 수 있습니다.

a) 시계열 신호를 전송하기위한 센서 축 #N 또는 RGB 색상 채널 (3)과 같은 입력 데이터 (또는 스트림 ) 의 차원 : 제안 된 단어 => "InputStream 차원"

b) FFT 변환 된 스펙트럼 값에서 입력 피처 (또는 입력 레이어) (MINST 컬러 이미지의 경우 28 x 28 = 784 ) 의 총 수 / 길이 또는 3000

"입력 레이어 / 입력 기능 차원"

c) 입력의 차원 ( 치수 #) (일반적으로 Keras LSTM에서 예상되는 3D) 또는 (#RowofSamples, #of Senors, #of Values ​​..) 3이 정답입니다.

"N 차원의 입력"

d) 이 래핑되지 않은 입력 이미지 데이터 의 특정 입력 모양 (예 : (30,50,50,3) 또는 래핑되지 않은 Keras 인 경우 (30, 250, 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에서는 총 시간 단계를 나타냅니다.

이 용어는 매우 혼란스럽고 정확하며 우리는 매우 혼란스러운 세상에 살고 있습니다 !!

기계 학습의 과제 중 하나는 다른 언어 나 방언 및 용어를 다루는 것입니다 (예를 들어 5-8 개의 매우 다른 영어 버전을 사용하는 경우 다른 스피커와 대화하기 위해서는 매우 높은 숙련도가 필요함). 아마도 이것은 프로그래밍 언어에서도 동일합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.