มีการรวมกำไรเลเยอร์ก่อนหรือหลังเลเยอร์การออกกลางคันหรือไม่


35

ฉันกำลังสร้างโครงข่ายประสาทเทียม (CNN) ที่ฉันมีเลเยอร์คู่ตามด้วยชั้นรวมกำไรและฉันต้องการใช้การออกกลางคันเพื่อลดการล้น ฉันมีความรู้สึกเช่นนี้ว่าควรจะใช้เลเยอร์การออกกลางคันหลังจากเลเยอร์รวม แต่ฉันไม่มีอะไรที่จะสำรอง สถานที่ที่เหมาะสมในการเพิ่มเลเยอร์กลางคันคืออะไร ก่อนหรือหลังเลเยอร์ร่วมกัน?

คำตอบ:


18

แก้ไข:เนื่องจาก @Toke Faurby มีการชี้ให้เห็นอย่างถูกต้องการใช้งานเริ่มต้นใน tensorflow จะใช้การออกกลางคันอย่างชาญฉลาด สิ่งที่ฉันอธิบายก่อนหน้านี้นำไปใช้กับตัวแปรเฉพาะของการออกกลางคันใน CNN ที่เรียกว่าการออกกลางคัน :

ใน CNN แต่ละเซลล์ประสาทสร้างแผนที่คุณลักษณะเดียว เนื่องจากdropout spatial dropoutทำงานต่อเซลล์ประสาทการดรอปเซลล์จึงหมายความว่าการแมปคุณสมบัติที่สอดคล้องกันนั้นถูกลบ - เช่นแต่ละตำแหน่งมีค่าเท่ากัน (ปกติคือ 0) ดังนั้นแต่ละฟีเจอร์แมพจะถูกดร็อปเต็มที่หรือไม่ดร็อปเลย

การรวมกำไรมักจะทำงานแยกกันในแต่ละแผนที่คุณลักษณะดังนั้นจึงไม่ควรสร้างความแตกต่างหากคุณใช้การออกกลางคันก่อนหรือหลังการรวมกำไร อย่างน้อยก็ในกรณีนี้สำหรับการดำเนินการรวมกำไรเช่น maxpooling หรือค่าเฉลี่ย

แก้ไข:อย่างไรก็ตามถ้าคุณใช้การออกกลางคันที่ชาญฉลาดขององค์ประกอบ (ซึ่งดูเหมือนว่าจะถูกตั้งค่าเป็นค่าเริ่มต้นสำหรับ TOROROR) มันจะสร้างความแตกต่างถ้าคุณใช้การออกกลางคันก่อนหรือหลังรวมกำไร อย่างไรก็ตามไม่จำเป็นต้องมีวิธีที่ผิดในการทำเช่นนั้น พิจารณาการดำเนินการรวมกำไรโดยรวม: หากคุณใช้การออกกลางคันก่อนรวมกำไรคุณปรับขนาดการเปิดใช้งานของเซลล์ประสาทที่เกิดขึ้นอย่างมีประสิทธิภาพ1.0 - dropout_probabilityแต่เซลล์ประสาทส่วนใหญ่จะไม่ใช่ศูนย์ (โดยทั่วไป) หากคุณใช้การออกกลางคันหลังจากรวมกำไรโดยทั่วไปคุณมักจะได้รับการ(1.0 - dropout_probability)เปิดใช้งานของเซลล์ประสาทแบบ "ไม่ปรับ" ส่วนที่ไม่ใช่ศูนย์และเศษส่วนของdropout_probabilityเซลล์ประสาทที่เป็นศูนย์ ทั้งคู่ดูเหมือนว่าใช้ได้กับฉันไม่ผิดเลย


1
ฉันไม่แน่ใจว่านี่เป็นวิธีมาตรฐานในการออกกลางคัน เช่นในtf.nn.dropoutจะระบุว่า "โดยค่าเริ่มต้นแต่ละองค์ประกอบจะถูกเก็บไว้หรือดร็อปอย่างอิสระ" คุณมีแหล่งข้อมูลสำรองหรือไม่
Toke Faurby

1
Oh! สิ่งที่ผมอธิบายไว้เรียกว่าตอนนี้การออกกลางคันอวกาศ : arxiv.org/pdf/1411.4280.pdf ดังนั้น @TokFaurby ถูกต้องในการสงสัยสิทธิของฉัน อย่างไรก็ตามในขณะที่คุณสามารถอ่านในกระดาษที่เชื่อมโยงได้การวางการแมปคุณสมบัติทั้งหมดในลักษณะการออกกลางคันจะช่วยเพิ่มประสิทธิภาพ นี้มาในไม่แปลกใจขณะที่การเปิดใช้งานที่อยู่ติดกันมีความสัมพันธ์อย่างมากและร่วงลงมาจากองค์ประกอบเฉพาะอย่างใดอย่างหนึ่งจริงไม่ได้วางข้อมูลที่ดำเนินการโดยองค์ประกอบที่ที่ทุกคน (ในขณะที่มันเป็นไปได้ยากมากที่จะลดลง "หลุม" อย่างต่อเนื่องในแผนที่คุณลักษณะเมื่อทำมัน องค์ประกอบที่ชาญฉลาด) ฉันจะแก้ไขคำตอบของฉันเพื่อสะท้อนความแตกต่างนี้
schreon

10

บทช่วยสอนนี้ใช้การรวมกำไรก่อนออกกลางคันและได้รับผลลัพธ์ที่ดี

นั่นไม่ได้แปลว่าคำสั่งซื้ออื่นไม่ได้ผลแน่นอน ประสบการณ์ของฉันมี จำกัด ฉันใช้มันในชั้นที่มีความหนาแน่นสูงเท่านั้นโดยไม่รวมกำไร


5

ตัวอย่าง Convnet ที่เหมือน VGG จาก Keras (ดรอปเอาต์ที่ใช้หลังจากรวมกำไร):

import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import SGD

# Generate dummy data
x_train = np.random.random((100, 100, 100, 3))
y_train = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)
x_test = np.random.random((20, 100, 100, 3))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(20, 1)), num_classes=10)

model = Sequential()
# input: 100x100 images with 3 channels -> (100, 100, 3) tensors.
# this applies 32 convolution filters of size 3x3 each.
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)

model.fit(x_train, y_train, batch_size=32, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=32)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.