หน่วย:
จำนวนของ "เซลล์ประสาท" หรือ "เซลล์" หรือสิ่งที่ชั้นมีอยู่ภายใน
มันเป็นคุณสมบัติของแต่ละเลเยอร์และใช่มันเกี่ยวข้องกับรูปร่างเอาต์พุต (ดังที่เราจะเห็นในภายหลัง) ในรูปภาพของคุณยกเว้นเลเยอร์อินพุทซึ่งเป็นแนวคิดที่แตกต่างจากเลเยอร์อื่นคุณมี:
- เลเยอร์ที่ซ่อนอยู่ 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")
แต่ละประเภทของเลเยอร์ต้องการอินพุตที่มีจำนวนมิติที่แน่นอน:
Dense
เลเยอร์ต้องการอินพุตเป็น (batch_size, input_size)
- หรือ
(batch_size, optional,...,optional, input_size)
- 2D ชั้น convolutional ต้องการอินพุตเป็น:
- หากใช้
channels_last
:(batch_size, imageside1, imageside2, channels)
- หากใช้
channels_first
:(batch_size, channels, imageside1, imageside2)
- การใช้ 1D convolutions และเลเยอร์ซ้ำ
(batch_size, sequence_length, features)
ขณะนี้รูปร่างอินพุตเป็นรูปแบบเดียวที่คุณต้องกำหนดเนื่องจากโมเดลของคุณไม่สามารถรู้ได้ มีเพียงคุณเท่านั้นที่รู้ว่าขึ้นอยู่กับข้อมูลการฝึกอบรมของคุณ
รูปร่างอื่น ๆ ทั้งหมดจะถูกคำนวณโดยอัตโนมัติตามหน่วยและลักษณะเฉพาะของแต่ละชั้น
ความสัมพันธ์ระหว่างรูปร่างและหน่วย - รูปร่างผลลัพธ์
เมื่อพิจารณาถึงรูปร่างอินพุตรูปร่างอื่น ๆ ทั้งหมดเป็นผลของการคำนวณเลเยอร์
"หน่วย" ของแต่ละเลเยอร์จะกำหนดรูปร่างเอาท์พุท (รูปร่างของเทนเซอร์ที่ผลิตโดยเลเยอร์และนั่นจะเป็นอินพุตของเลเยอร์ถัดไป)
เลเยอร์แต่ละประเภททำงานในวิธีเฉพาะ เลเยอร์หนาแน่นมีรูปร่างเอาต์พุตตาม "หน่วย" เลเยอร์ 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
แบบจำลองหรือ Model
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:
(None,3)
- hidden1Out:
(None,4)
- hidden2Out:
(None,4)
- finalOut:
(None,1)
input_shape=
พารามิเตอร์ยังคงอยู่: มิติแรกของค่าที่อ้างถึงคืออะไร ฉันเห็นสิ่งต่าง ๆ เช่นinput_shape=(728, )
นั้นดังนั้นในใจของฉันอาร์กิวเมนต์แรกอ้างถึงคอลัมน์ (คงที่) และที่สองถึงแถว (อิสระในการเปลี่ยนแปลง) แต่สิ่งนี้จะนั่งกับลำดับแถวหลักของ Python ได้อย่างไร