Saya menemukan di banyak kode jaringan neural yang tersedia yang diimplementasikan menggunakan TensorFlow bahwa istilah regularisasi sering diterapkan dengan menambahkan istilah tambahan ke nilai kerugian secara manual.
Pertanyaan saya adalah:
Apakah ada cara regularisasi yang lebih elegan atau disarankan daripada melakukannya secara manual?
Saya juga menemukan bahwa
get_variable
ada argumenregularizer
. Bagaimana cara menggunakannya? Menurut pengamatan saya, jika kita meneruskan pengatur ke dalamnya (sepertitf.contrib.layers.l2_regularizer
, tensor yang mewakili istilah yang diatur akan dihitung dan ditambahkan ke kumpulan grafik bernamatf.GraphKeys.REGULARIZATOIN_LOSSES
. Apakah koleksi tersebut akan digunakan secara otomatis oleh TensorFlow (misalnya, digunakan oleh pengoptimal saat pelatihan)? Atau apakah saya diharapkan menggunakan koleksi itu sendiri?
sumber
S = tf.get_variable(name='S', regularizer=tf.contrib.layers.l2_regularizer )
?Jawaban:
Seperti yang Anda katakan di poin kedua, menggunakan
regularizer
argumen adalah cara yang disarankan. Anda dapat menggunakannya diget_variable
, atau mengaturnya sekali divariable_scope
dan mengatur semua variabel Anda.Kerugian dikumpulkan dalam grafik, dan Anda perlu menambahkannya secara manual ke fungsi biaya seperti ini.
Semoga membantu!
sumber
reg_constant
mungkin tidak diperlukan, karena regulator di TensorFlow memiliki argumenscale
dalam konstruktornya sehingga dampak istilah reg dapat dikontrol dengan cara yang lebih terperinci. Dan (2) menggunakantf.add_n
mungkin sedikit lebih baik daripadasum
, saya kira menggunakan jumlah mungkin membuat banyak tensor dalam grafik untuk menyimpan hasil antara.S = tf.get_variable(name='S', regularizer=tf.contrib.layers.l2_regularizer )
, lalu apakah saya kode yang Anda sarankan? Seperti disum(tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES))
?tf.reduce_sum
harus digunakan, bukansum
?Beberapa aspek dari jawaban yang ada tidak segera jelas bagi saya, jadi berikut adalah panduan langkah demi langkah:
Tentukan regulator. Di sinilah konstanta regularisasi dapat disetel, misalnya:
Buat variabel melalui:
Dengan kata lain, variabel dapat dibuat melalui
weights = tf.Variable(...)
konstruktor reguler , diikuti olehtf.add_to_collection(tf.GraphKeys.REGULARIZATION_LOSSES, weights)
.Definisikan beberapa
loss
istilah dan tambahkan istilah regularisasi:Catatan: Sepertinya
tf.contrib.layers.apply_regularization
diimplementasikan sebagaiAddN
, jadi kurang lebih sama dengansum(reg_variables)
.sumber
apply_regularization
seharusnya tidak diperlukan jika Anda sudah menentukan pengatur saat membuat variabel.REGULARIZATION_LOSSES
kerugian total yang dikembalikan dari regulator, jadi pada dasarnya Anda meneleponregularizer(regularizer(weight))
.Saya akan memberikan jawaban yang benar sederhana karena saya tidak menemukannya. Anda membutuhkan dua langkah sederhana, sisanya dilakukan dengan sihir tensorflow:
Tambahkan regulator saat membuat variabel atau lapisan:
Tambahkan istilah regularisasi saat menentukan kerugian:
sumber
Opsi lain untuk melakukan ini dengan
contrib.learn
pustaka adalah sebagai berikut, berdasarkan tutorial Deep MNIST di situs web Tensorflow. Pertama, dengan asumsi Anda telah mengimpor pustaka yang relevan (sepertiimport tensorflow.contrib.layers as layers
), Anda dapat menentukan jaringan dalam metode terpisah:Kemudian, dalam metode utama, Anda dapat menggunakan cuplikan kode berikut:
Agar ini berfungsi, Anda harus mengikuti tutorial MNIST yang saya tautkan sebelumnya dan mengimpor library yang relevan, tetapi mempelajari TensorFlow adalah latihan yang bagus dan mudah untuk melihat bagaimana regularisasi memengaruhi output. Jika Anda menerapkan regularisasi sebagai argumen, Anda dapat melihat yang berikut ini:
Perhatikan bahwa bagian regularisasi memberi Anda tiga item, berdasarkan item yang tersedia.
Dengan regularisasi 0, 0,0001, 0,01, dan 1,0, saya mendapatkan nilai akurasi uji masing-masing 0,9468, 0,9476, 0,9183, dan 0,1135, yang menunjukkan bahaya istilah regularisasi tinggi.
sumber
Jika ada yang masih melihat, saya hanya ingin menambahkannya di tf.keras Anda dapat menambahkan regularisasi bobot dengan meneruskannya sebagai argumen di lapisan Anda. Contoh menambahkan regularisasi L2 yang diambil secara grosir dari situs Tutorial Tensorflow Keras:
Tidak perlu menambahkan secara manual kerugian regularisasi dengan metode ini sejauh yang saya tahu.
Referensi: https://www.tensorflow.org/tutorials/keras/overfit_and_underfit#add_weight_regularization
sumber
Saya menguji
tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
dantf.losses.get_regularization_loss()
dengan satul2_regularizer
di grafik, dan menemukan bahwa mereka mengembalikan nilai yang sama. Dengan mengamati kuantitas nilai, saya kira reg_constant sudah memahami nilainya dengan menetapkan parametertf.contrib.layers.l2_regularizer
.sumber
Jika Anda memiliki CNN, Anda dapat melakukan hal berikut:
Dalam fungsi model Anda:
Dalam fungsi kerugian Anda:
sumber
Beberapa jawaban membuat saya semakin bingung. Disini saya berikan dua cara untuk membuatnya dengan jelas.
Kemudian, dapat ditambahkan ke dalam kerugian total
sumber
sumber
tf.GraphKeys.REGULARIZATION_LOSSES
tidak akan ditambahkan secara otomatis, tetapi ada cara sederhana untuk menambahkannya:tf.losses.get_regularization_loss()
digunakantf.add_n
untuk menjumlahkan entri daritf.GraphKeys.REGULARIZATION_LOSSES
elemen-bijaksana.tf.GraphKeys.REGULARIZATION_LOSSES
biasanya berupa daftar skalar, dihitung menggunakan fungsi pengatur. Ia mendapat entri dari panggilan ketf.get_variable
yang memilikiregularizer
parameter yang ditentukan. Anda juga dapat menambahkan ke koleksi itu secara manual. Itu akan berguna saat menggunakantf.Variable
dan juga saat menentukan pengatur aktivitas atau pengatur kustom lainnya. Misalnya:(Dalam contoh ini mungkin akan lebih efektif untuk mengatur x, karena y benar-benar mendatar untuk x besar.)
sumber