ฉันพยายามที่จะเข้าใจบทบาทของFlatten
ฟังก์ชั่นใน Keras ด้านล่างนี้คือรหัสของฉันซึ่งเป็นเครือข่ายสองชั้นที่เรียบง่าย ใช้ข้อมูล 2 มิติของรูปร่าง (3, 2) และส่งออกข้อมูลรูปร่าง 1 มิติ (1, 4):
model = Sequential()
model.add(Dense(16, input_shape=(3, 2)))
model.add(Activation('relu'))
model.add(Flatten())
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')
x = np.array([[[1, 2], [3, 4], [5, 6]]])
y = model.predict(x)
print y.shape
สิ่งนี้จะพิมพ์ออกมาที่y
มีรูปร่าง (1, 4) อย่างไรก็ตามถ้าฉันลบFlatten
เส้นมันก็จะพิมพ์ออกมาที่y
มีรูปร่าง (1, 3, 4)
ฉันไม่เข้าใจเรื่องนี้ จากความเข้าใจของฉันเกี่ยวกับโครงข่ายประสาทเทียมmodel.add(Dense(16, input_shape=(3, 2)))
ฟังก์ชันนี้กำลังสร้างเลเยอร์ที่เชื่อมต่อเต็มรูปแบบที่ซ่อนอยู่โดยมี 16 โหนด แต่ละโหนดเหล่านี้เชื่อมต่อกับแต่ละองค์ประกอบอินพุต 3x2 ดังนั้นโหนด 16 โหนดที่เอาต์พุตของเลเยอร์แรกนี้จึง "แบน" อยู่แล้ว ดังนั้นรูปร่างผลลัพธ์ของเลเยอร์แรกควรเป็น (1, 16) จากนั้นเลเยอร์ที่สองจะใช้สิ่งนี้เป็นอินพุตและเอาต์พุตข้อมูลของรูปร่าง (1, 4)
ดังนั้นหากผลลัพธ์ของเลเยอร์แรกเป็น "แบน" และมีรูปร่างอยู่แล้ว (1, 16) ทำไมฉันจึงต้องทำให้แบนลงอีก?
Dense(16, input_shape=(5,3)
เซลล์ประสาทเอาต์พุตแต่ละชุดจากชุด 16 (และสำหรับเซลล์ประสาททั้ง 5 ชุด) จะเชื่อมต่อกับเซลล์ประสาทอินพุตทั้งหมด (3 x 5 = 15) หรือไม่? หรือเซลล์ประสาทแต่ละชุดใน 16 ชุดแรกจะเชื่อมต่อกับเซลล์ประสาท 3 ชุดในชุดแรกของเซลล์ประสาทอินพุต 5 ชุดจากนั้นเซลล์ประสาทแต่ละเซลล์ในชุดที่สองของ 16 จะเชื่อมต่อกับเซลล์ประสาท 3 เซลล์ในชุดที่สองของ 5 อินพุตเท่านั้น เซลล์ประสาท ฯลฯ .... งงว่ามันคืออะไร!