Là các lớp gộp được thêm trước hoặc sau các lớp bỏ học?


35

Tôi đang tạo một mạng nơ ron tích chập (CNN), trong đó tôi có một lớp chập theo sau là một lớp gộp và tôi muốn áp dụng bỏ học để giảm quá mức. Tôi có cảm giác rằng lớp bỏ học nên được áp dụng sau lớp gộp, nhưng tôi thực sự không có gì để sao lưu nó. Đâu là nơi thích hợp để thêm lớp bỏ học? Trước hay sau lớp gộp?

Câu trả lời:


18

Chỉnh sửa: Như @Toke Faurby đã chỉ ra một cách chính xác, việc triển khai mặc định trong tenorflow thực sự sử dụng một phần tử bỏ qua phần tử. Những gì tôi mô tả trước đây áp dụng cho một biến thể bỏ học cụ thể trong CNN, được gọi là bỏ không gian :

Trong một CNN, mỗi nơ-ron tạo ra một bản đồ đặc trưng. Vì bỏ học không gian bỏ học hoạt động theo mỗi nơ-ron, nên bỏ một nơ-ron có nghĩa là bản đồ đặc trưng tương ứng bị bỏ - ví dụ: mỗi vị trí có cùng một giá trị (thường là 0). Vì vậy, mỗi bản đồ tính năng được loại bỏ hoàn toàn hoặc không bị bỏ đi.

Pooling thường hoạt động riêng biệt trên mỗi bản đồ tính năng, do đó, nó sẽ không tạo ra bất kỳ sự khác biệt nào nếu bạn áp dụng bỏ học trước hoặc sau khi gộp. Ít nhất đây là trường hợp cho các hoạt động gộp như maxpooling hoặc trung bình.

Chỉnh sửa: Tuy nhiên, nếu bạn thực sự sử dụng bỏ học theo phần tử (dường như được đặt làm mặc định cho dòng chảy căng thẳng), thì nó thực sự tạo ra sự khác biệt nếu bạn áp dụng bỏ học trước hoặc sau khi gộp. Tuy nhiên, không nhất thiết là một cách làm sai . Xem xét hoạt động gộp trung bình: nếu bạn áp dụng bỏ học trước khi gộp, bạn có hiệu quả mở rộng quy mô kích hoạt nơ-ron bằng cách 1.0 - dropout_probability, nhưng hầu hết các nơ-ron sẽ khác không (nói chung). Nếu bạn áp dụng bỏ học sau khi gộp chung, bạn thường kết thúc với một phần (1.0 - dropout_probability)kích hoạt nơ-ron "không định mức" và một phần dropout_probabilitykhông có nơ-ron. Cả hai dường như khả thi với tôi, không phải là hoàn toàn sai.


1
Tôi không chắc đây là cách tiêu chuẩn để thực hiện bỏ học. Ví dụ: trong tf.nn.dropout có ghi "Theo mặc định, mỗi phần tử được giữ hoặc loại bỏ độc lập". Bạn có một nguồn sao lưu này?
Toke Faurby

1
Oh! Những gì tôi mô tả bây giờ được gọi là bỏ không gian : arxiv.org/pdf/1411.4280.pdf . Vì vậy, @TokeFaurby đã đúng khi nghi ngờ yêu cầu của tôi. Tuy nhiên, như bạn cũng có thể đọc trong bài báo được liên kết, việc thả toàn bộ bản đồ tính năng theo cách bỏ qua không gian sẽ cải thiện hiệu suất. Điều này không có gì đáng ngạc nhiên, vì các kích hoạt liền kề có mối tương quan cao và bỏ đi một yếu tố cụ thể thực sự không làm giảm thông tin mà yếu tố đó mang theo (vì rất khó có thể làm rơi "lỗ hổng" liên tục trong bản đồ tính năng khi thực hiện nó yếu tố khôn ngoan). Tôi sẽ chỉnh sửa câu trả lời của mình để phản ánh sự khác biệt này.
schreon

10

Hướng dẫn này sử dụng gộp trước khi bỏ học và nhận được kết quả tốt.

Điều đó không nhất thiết có nghĩa là thứ tự khác không hoạt động. Kinh nghiệm của tôi còn hạn chế, tôi chỉ sử dụng chúng trên các lớp dày đặc mà không gộp.


5

Ví dụ về mạng lưới giống như VGG từ Keras (bỏ học được sử dụng sau khi gộp):

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.