คำอธิบายอินพุต Keras: input_shape, หน่วย, batch_size, dim, ฯลฯ


261

สำหรับการใด ๆ ชั้น Keras ( Layerclass), คนที่สามารถอธิบายวิธีการที่จะเข้าใจความแตกต่างระหว่างinput_shape, units, dimฯลฯ ?

ตัวอย่างเช่น doc says unitsระบุรูปร่างผลลัพธ์ของเลเยอร์

ในภาพของโครงข่ายประสาทด้านล่างhidden layer1มี 4 หน่วย สิ่งนี้แปลโดยตรงกับunitsคุณสมบัติของLayerวัตถุหรือไม่ หรือunitsใน Keras มีรูปร่างเท่ากันทุกน้ำหนักในเลเยอร์ที่ซ่อนอยู่คูณด้วยจำนวนของหน่วย?

ในระยะสั้นหนึ่งจะเข้าใจ / แสดงคุณลักษณะของโมเดล - โดยเฉพาะเลเยอร์ - ด้วยภาพด้านล่างได้อย่างไร ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:


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)รูปร่างของการป้อนข้อมูลของคุณเป็น จากนั้นเทนเซอร์เลเยอร์อินพุตของคุณจะต้องมีรูปร่างนี้ (ดูรายละเอียดในส่วน "รูปร่างใน keras")

แต่ละประเภทของเลเยอร์ต้องการอินพุตที่มีจำนวนมิติที่แน่นอน:

ขณะนี้รูปร่างอินพุตเป็นรูปแบบเดียวที่คุณต้องกำหนดเนื่องจากโมเดลของคุณไม่สามารถรู้ได้ มีเพียงคุณเท่านั้นที่รู้ว่าขึ้นอยู่กับข้อมูลการฝึกอบรมของคุณ

รูปร่างอื่น ๆ ทั้งหมดจะถูกคำนวณโดยอัตโนมัติตามหน่วยและลักษณะเฉพาะของแต่ละชั้น

ความสัมพันธ์ระหว่างรูปร่างและหน่วย - รูปร่างผลลัพธ์

เมื่อพิจารณาถึงรูปร่างอินพุตรูปร่างอื่น ๆ ทั้งหมดเป็นผลของการคำนวณเลเยอร์

"หน่วย" ของแต่ละเลเยอร์จะกำหนดรูปร่างเอาท์พุท (รูปร่างของเทนเซอร์ที่ผลิตโดยเลเยอร์และนั่นจะเป็นอินพุตของเลเยอร์ถัดไป)

เลเยอร์แต่ละประเภททำงานในวิธีเฉพาะ เลเยอร์หนาแน่นมีรูปร่างเอาต์พุตตาม "หน่วย" เลเยอร์ convolutional มีรูปร่างเอาต์พุตตาม "ตัวกรอง" แต่มันก็ขึ้นอยู่กับคุณสมบัติของเลเยอร์ (ดูเอกสารประกอบสำหรับแต่ละเลเยอร์ที่ส่งออก)

มาแสดงสิ่งที่เกิดขึ้นกับเลเยอร์ "หนาแน่น" ซึ่งเป็นประเภทที่แสดงในกราฟของคุณ

(batch_size,units)ชั้นหนาแน่นมีรูปร่างที่การส่งออกของ ดังนั้นใช่หน่วยคุณสมบัติของเลเยอร์ยังกำหนดรูปร่างเอาท์พุท

  • ชั้นซ่อน 1: 4 (batch_size,4)หน่วยรูปร่างเอาท์พุท:
  • ชั้นซ่อน 2: 4 (batch_size,4)หน่วยรูปร่างเอาท์พุท:
  • เลเยอร์สุดท้าย: 1 หน่วย, รูปร่างขาออก: (batch_size,1).

น้ำหนัก

น้ำหนักจะถูกคำนวณโดยอัตโนมัติทั้งหมดขึ้นอยู่กับอินพุตและรูปร่างของผลลัพธ์ อีกครั้งเลเยอร์แต่ละประเภททำงานในวิธีที่แน่นอน แต่น้ำหนักจะเป็นเมทริกซ์ที่สามารถเปลี่ยนรูปร่างอินพุตเป็นรูปร่างเอาต์พุตโดยการดำเนินการทางคณิตศาสตร์บางอย่าง

ในชั้นที่มีความหนาแน่นสูงน้ำหนักจะเพิ่มอินพุตทั้งหมด มันเป็นเมทริกซ์ที่มีหนึ่งคอลัมน์ต่ออินพุตและหนึ่งแถวต่อหน่วย แต่นี่มักจะไม่สำคัญสำหรับงานพื้นฐาน

ในภาพถ้าลูกศรแต่ละตัวมีหมายเลขคูณอยู่ด้วยตัวเลขทั้งหมดจะรวมกันเป็นเมทริกซ์น้ำหนัก

รูปร่างใน Keras

ก่อนหน้านี้ผมยกตัวอย่าง 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)

นอกจากนี้ในงานขั้นสูงเมื่อคุณทำงานโดยตรงกับเทนเซอร์ (ภายในเลเยอร์แลมบ์ดาหรือในฟังก์ชั่นการสูญเสีย) ขนาดของแบทช์จะอยู่ที่นั่น

  • ดังนั้นเมื่อกำหนดรูปร่างอินพุตคุณจะไม่สนใจขนาดแบทช์: input_shape=(50,50,3)
  • เมื่อดำเนินการโดยตรงกับเทนเซอร์รูปร่างจะกลับมาอีกครั้ง (30,50,50,3)
  • เมื่อ keras ส่งข้อความถึงคุณรูปร่างจะเป็น(None,50,50,3)หรือ(30,50,50,3)ขึ้นอยู่กับประเภทของข้อความที่ส่งถึงคุณ

ติ่ม

และในท้ายที่สุดมันคือdimอะไร?

หากรูปร่างการป้อนข้อมูลของคุณมีเพียงหนึ่งมิติคุณไม่จำเป็นต้องให้มันเป็น tuple คุณให้input_dimเป็นจำนวนสเกลาร์

ดังนั้นในโมเดลของคุณที่เลเยอร์อินพุตของคุณมี 3 องค์ประกอบคุณสามารถใช้สองสิ่งต่อไปนี้:

  • input_shape=(3,) - จุลภาคเป็นสิ่งจำเป็นเมื่อคุณมีมิติเดียว
  • input_dim = 3

แต่เมื่อจัดการกับเทนเซอร์โดยตรงมักdimจะอ้างถึงจำนวนมิติที่เทนเซอร์มี เช่นเมตริกซ์ที่มีรูปร่าง (25,10909) มี 2 มิติ


กำหนดภาพของคุณใน Keras

Keras มีสองวิธีการทำมันSequentialแบบจำลองหรือ ModelAPI ฉันไม่ชอบใช้แบบจำลองตามลำดับหลังจากนั้นคุณจะต้องลืมมันต่อไปเพราะคุณจะต้องการแบบจำลองที่มีสาขา

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 ได้อย่างไร
Maxim.K

17
เครื่องหมายจุลภาคนั้นไม่ได้สร้างมิติที่สอง มันเป็นเพียงสัญลักษณ์ของหลามสำหรับการสร้างองค์ประกอบtupleที่มีเพียงองค์ประกอบเดียว เป็นเช่นเดียวกับinput_shape(728,) batch_input=(batch_size,728)ซึ่งหมายความว่าแต่ละตัวอย่างมีค่า 728
Daniel Möller

@ DanielMöller: คุณช่วยอธิบายเพิ่มเติมหน่อยได้ไหมว่า "องค์ประกอบการป้อนข้อมูล" กับ "มิติ" แตกต่างกันอย่างไร ฉันคิดว่ากราฟด้านบนมีเลเยอร์สามมิติดังนั้นจึงทำให้สลัว = 3ดังนั้นฉันสงสัยว่าฉันหายไปตรงนี้เพราะฉันเห็นคุณเขียนว่าอินพุตเป็น 1 มิติ ...
เฮเลน

1
เวกเตอร์มีหนึ่งมิติ แต่มีหลายองค์ประกอบ มันมีรูปร่าง (n,) ---- เมทริกซ์มีสองมิติ, มิติ 0 มีองค์ประกอบ m, มิติที่ 1 มีองค์ประกอบ n, รวมองค์ประกอบ mxn, รูปร่าง (m, n) ถ้าคุณจินตนาการว่า "คิวบ์" แบ่งเป็นลูกบาศก์เล็ก ๆ แต่ละลูกบาศก์เล็ก ๆ ที่มีข้อมูลนี่จะเป็น 3D พร้อมองค์ประกอบ mxnxo รูปร่าง (m, n, o)
Daniel Möller

2
@ ปรินซ์ลำดับสำคัญ คุณสามารถกำหนดค่า Keras ใช้หรือdata_format = 'channels_first' data_format='channels_last'ฉันแนะนำให้ใช้ช่องล่าสุดเสมอ (ค่าเริ่มต้นของ Keras) มันเข้ากันได้กับเลเยอร์อื่นทั้งหมด
Daniel Möller

11

ชี้แจงมิติข้อมูลเข้า:

ไม่ใช่คำตอบโดยตรง แต่ฉันเพิ่งรู้ว่าคำว่า Input Dimension อาจสร้างความสับสนมากพอดังนั้นโปรดระวัง:

มัน (มิติคำเดียว) สามารถอ้างถึง:

a) มิติข้อมูลอินพุต (หรือสตรีม)เช่น # N ของแกนเซ็นเซอร์เพื่อส่งสัญญาณสัญญาณอนุกรมเวลาหรือช่องสี RGB (3): word word => "ขนาดอินพุตสตรีม "

b) จำนวนรวม / ความยาวของฟีเจอร์อินพุต (หรือเลเยอร์อินพุต) (28 x 28 = 784 สำหรับภาพสี MINST) หรือ 3000 ในค่าสเปกตรัมแปลง FFT หรือ

"ขนาดเลเยอร์ / คุณสมบัติส่วนข้อมูลอินพุท"

c) มิติข้อมูล (# ของมิติ) ของอินพุต (โดยทั่วไปคือ 3D ตามที่คาดไว้ใน Keras LSTM) หรือ (#RowofSamples, #of Senors, #of Values ​​.. ) 3 คือคำตอบ

"ไม่มีมิติของอินพุต"

d) รูปแบบอินพุตเฉพาะ (เช่น (30,50,50,3) ในข้อมูลภาพอินพุตที่ไม่ได้เปิดนี้หรือ (30, 250, 3) หากไม่ได้เปิด Keras:

Keras มี input_dim ของมันหมายถึง Dimension ของ Input Layer / จำนวนของ Input Feature

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.