Caffe, operasi antar batch

Karena saya memiliki pengklasifikasi berdasarkan skor patch tunggal, saya ingin menjumlahkan prediksi yang dihasilkan jaringan untuk berbagai gambar.

Dari https://github.com/BVLC/caffe/blob/master/src/caffe/proto/caffe.proto, Reduction tidak mendukung operasi pada sumbu yang berbeda dari yang terakhir. Juga operasi pengumpulan akan menghasilkan rata-rata masukannya tetapi, tentu saja, tanpa menyentuh keseluruhan batch.

Saya telah menerapkan lapisan python, tetapi ini tidak cukup cepat untuk eksperimen skala besar.

Apakah ada cara untuk "menjumlahkan" atau, lebih umum, beroperasi pada sumbu pertama dengan alat yang sudah tersedia?


person Lemm Ras    schedule 10.08.2016    source sumber


Jawaban (2)


Ya. Kamu bisa. Jika Anda memiliki N x p x q x r gumpalan prediksi, penggunaan pertama Slice (SliceLayer), membuat N gumpalan , masing-masing berbentuk 1 x p x q x r. Kemudian gunakan N gumpalan ini sebagai N bagian bawah untuk lapisan eltwise (EltwiseLayer) untuk menghasilkan satu atas.

person Autonomous    schedule 10.08.2016
comment
Saya memikirkan hal ini, tetapi masalah dalam kasus saya adalah SliceLayer akan membutuhkan gumpalan teratas sebanyak kumpulannya (jika saya tidak salah). Karena saya memerlukan 100 ratus gumpalan teratas, saya mencoba mencari solusi lain. - person Lemm Ras; 11.08.2016
comment
Jadi, apakah Anda khawatir .prototxt Anda akan menjadi rumit, atau Anda khawatir dengan waktu eksekusi? Jika ini yang terakhir (waktu), maka Anda dapat mengatur waktunya, tanpa lapisan irisan dan dengan. Mengenai penulisan prototxt, saya biasanya menggunakan kode Python untuk menulis prototxt (terinspirasi dari kode ini). Itu membuat penulisan 100 gumpalan teratas menjadi sangat mudah. Kalau tidak, saya tidak melihat metode lain menggunakan lapisan yang ada. Tentu saja, Anda selalu dapat menulis layer Anda sendiri, yang menggabungkan Slice dan Eltwise. - person Autonomous; 11.08.2016
comment
Terima kasih atas jawaban lengkap ini. Saya lebih mementingkan waktu. Saya akan mencobanya dan melihat berapa banyak yang diperlukan. - person Lemm Ras; 11.08.2016

Jika prediksi Anda memiliki dimensi: N x c (untuk ukuran tumpukan mini saluran N dan c), Anda dapat menggabungkannya menjadi c gumpalan dengan dimensi N. Anda dapat memasukkannya ke dalam lapisan Reduction.

Misalnya, Anda menulis yang berikut ini sebagai template Jinja2:

layer {
  name: "pred-slice"
  type: "Slice"
  bottom: "pred"
{%- for num in range(10) %}
  top: "pred-{{ num }}-vector"
{%- endfor %}
  slice_param {
    slice_dim: 1
{%- for num in range(1, 10) %}
    slice_point: {{ num }}
{%- endfor %}
  }
  include {
    phase: TEST
  }
}

{%- for num in range(10) %}
layer {
  name: "pred-{{num}}"
  type: "Reduction"
  bottom: "pred-{{ num }}-vector"
  top: "pred-{{ num }}"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
{%- endfor %}

yang diperluas menjadi:

layer {
  name: "pred-slice"
  type: "Slice"
  bottom: "pred"
  top: "pred-0-vector"
  top: "pred-1-vector"
  top: "pred-2-vector"
  top: "pred-3-vector"
  top: "pred-4-vector"
  top: "pred-5-vector"
  top: "pred-6-vector"
  top: "pred-7-vector"
  top: "pred-8-vector"
  top: "pred-9-vector"
  slice_param {
    slice_dim: 1
    slice_point: 1
    slice_point: 2
    slice_point: 3
    slice_point: 4
    slice_point: 5
    slice_point: 6
    slice_point: 7
    slice_point: 8
    slice_point: 9
  }
  include {
    phase: TEST
  }
}
layer {
  name: "pred-0"
  type: "Reduction"
  bottom: "pred-0-vector"
  top: "pred-0"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-1"
  type: "Reduction"
  bottom: "pred-1-vector"
  top: "pred-1"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-2"
  type: "Reduction"
  bottom: "pred-2-vector"
  top: "pred-2"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-3"
  type: "Reduction"
  bottom: "pred-3-vector"
  top: "pred-3"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-4"
  type: "Reduction"
  bottom: "pred-4-vector"
  top: "pred-4"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-5"
  type: "Reduction"
  bottom: "pred-5-vector"
  top: "pred-5"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-6"
  type: "Reduction"
  bottom: "pred-6-vector"
  top: "pred-6"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-7"
  type: "Reduction"
  bottom: "pred-7-vector"
  top: "pred-7"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-8"
  type: "Reduction"
  bottom: "pred-8-vector"
  top: "pred-8"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-9"
  type: "Reduction"
  bottom: "pred-9-vector"
  top: "pred-9"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
person Jonathan    schedule 09.11.2016