13

Tôi đang xem qua Caffe prototxt for deep residual networks và đã nhận thấy sự xuất hiện của một lớp "Scale".Lớp tỷ lệ trong Caffein

layer { 
    bottom: "res2b_branch2b" 
    top: "res2b_branch2b" 
    name: "scale2b_branch2b" 
    type: "Scale" 
    scale_param { 
     bias_term: true 
    } 
} 

Tuy nhiên, lớp này không có sẵn trong Caffe layer catalogue. Ai đó có thể giải thích các chức năng của lớp này và ý nghĩa của các tham số hoặc trỏ đến một tài liệu cập nhật cho Caffe?

Trả lời

15

Bạn có thể tìm thấy tài liệu chi tiết về caffe here.

Cụ thể, đối "Scale" lớp doc reads:

Tính toán một sản phẩm của hai đầu vào Blobs, với hình dạng của Blob sau "phát sóng" để phù hợp với hình dạng của các cựu. Tương đương với ốp lát Blob sau đó, sau đó tính toán sản phẩm theo nguyên tố.
Dữ liệu đầu vào thứ hai có thể được bỏ qua, trong trường hợp đó nó được học như một tham số của lớp.

Có vẻ như, trong trường hợp của bạn, (đơn "dưới cùng"), lớp này tìm hiểu hệ số tỷ lệ để nhân "res2b_branch2b". Hơn nữa, kể từ scale_param { bias_term: true } có nghĩa là lớp học không chỉ là một yếu tố nhân rộng, mà còn là một thuật ngữ không đổi. Vì vậy, vượt qua phía trước tính:

res2b_branch2b <- res2b_branch2b * \alpha + \beta 

Trong đào tạo cố gắng net để tìm hiểu những giá trị của \alpha\beta.

+0

Shai, Sau đó, nó tương đương với việc đặt một lớp co giãn với kích thước bộ lọc 1x1 sau res2b_branch2b. Nếu chúng ta làm điều này cũng đầu ra sẽ là y = W * x + b, và nó sẽ tìm hiểu W và b phải không? Vì vậy, điều này tương đương với lớp Scale khi chúng tôi không cung cấp lớp dưới cùng? – Dharma

+0

@Dharma chỉ tương đương nếu 'x' là 1D.Không nhầm lẫn giữa sản phẩm bên trong và nhân vô hướng. – Shai

+0

oh ok. Sau đó, nó chỉ biết hai tham số alpha và beta, thay vì toàn bộ ma trận W trong trường hợp này. tôi có đúng không – Dharma

7

Ngoài ra còn có một số tài liệu về nó trong caffe.proto file, bạn có thể tìm kiếm 'ScaleParameter'.

Cảm ơn một đống cho bài đăng của bạn :) Lớp quy mô chính xác là những gì tôi đang tìm kiếm. Trong trường hợp bất cứ ai muốn một ví dụ cho một lớp chia tỷ lệ theo một vô hướng (0.5) và sau đó "thêm" -2 (và những giá trị không nên thay đổi):

layer { 
    name: "scaleAndAdd" 
    type: "Scale" 
    bottom: "bot" 
    top: "scaled" 
    param { 
    lr_mult: 0 
    decay_mult: 0 
    } 
    param { 
    lr_mult: 0 
    decay_mult: 0 
    } 
    scale_param { 
    filler { 
     value: 0.5 } 
    bias_term: true 
    bias_filler { 
     value: -2 
    } 
    } 
} 

(Có lẽ, của decay_mult là không cần thiết ở đây mặc dù .. Nhưng dunno Xem ý kiến ​​) ngoài ra:

  • lr_mult:. 0 - tắt học tập cho "param mà" - tôi nghĩ rằng đầu tiên "param {" luôn() đề cập đến trọng lượng, không? thứ hai đến độ lệch (lr_mult không phải là cụ thể của ScaleLayer)
  • filler: một "FillerParameter" [see caffe.proto] cho biết cách điền vào đốm màu thứ hai. Mặc định là một giá trị "hằng số: ...".
  • bias_filler: tham số nói như thế nào để điền vào một tùy chọn thiên vị blob
  • bias_term: liệu có một sự thiên vị blob

Tất cả lấy từ caffe.proto. Và: Tôi chỉ kiểm tra lớp ở trên với cả hai giá trị phụ = 1,2.

+1

dasWesen. Bạn đã cung cấp trọng số và thuật ngữ thiên vị. Vì vậy, bạn đặt lr_mult = 0 để bạn không cần phải học chúng và decay_mult = 0 để bạn không cần phải xử phạt các trọng số là tốt. – Dharma

+0

@Dharma: Đợi đã, tôi đang chỉnh sửa rồi, nhưng: Tôi nghĩ rằng decay_mult là không cần thiết sau khi tất cả. Ít nhất các thuật ngữ chuẩn hóa bổ sung như vậy sẽ không thay đổi hướng của độ dốc (loss-). Đó là vì các điều khoản này là hằng số, vì các biến liên quan (= tỷ lệ và độ lệch) không được phép thay đổi. - Nhưng nó có thể chạy nhanh hơn với decay_mult = 0. – dasWesen

+0

Dù sao, Pháp tốt bạn đã đề cập đến vai trò của decay_mult. – dasWesen