Rangkaian Siam ialah model rangkaian saraf yang digunakan untuk pembelajaran metrik, yang dapat mempelajari cara mengira persamaan atau ukuran perbezaan antara dua input. Disebabkan fleksibilitinya, ia popular dalam pelbagai aplikasi seperti pengecaman muka, pengiraan persamaan semantik dan padanan teks. Walau bagaimanapun, rangkaian Siam mungkin menghadapi masalah apabila berurusan dengan set data yang tidak seimbang, kerana ia mungkin terlalu menumpukan pada sampel daripada beberapa kelas dan mengabaikan sebahagian besar sampel. Untuk menyelesaikan masalah ini, beberapa teknik boleh digunakan. Satu pendekatan ialah mengimbangi set data melalui pensampelan terkurang atau pensampelan berlebihan. Pensampelan terkurang bermaksud mengalih keluar secara rawak beberapa sampel daripada kelas majoriti supaya ia menyamai bilangan sampel daripada kelas minoriti. Persampelan berlebihan meningkatkan bilangan sampel dalam kelas minoriti dengan menyalin atau menjana sampel baharu supaya ia sama dengan bilangan sampel dalam kelas majoriti. Ini mengimbangi set data dengan berkesan, tetapi mungkin membawa kepada kehilangan maklumat atau isu overfitting. Kaedah lain ialah menggunakan pelarasan berat. Dengan memberikan pemberat yang lebih tinggi kepada sampel kelas minoriti, perhatian rangkaian Siam kepada kelas minoriti boleh ditingkatkan. Ini meningkatkan prestasi model dengan memfokuskan pada beberapa kelas tanpa mengubah set data. Selain itu, beberapa algoritma pembelajaran metrik lanjutan juga boleh digunakan untuk meningkatkan prestasi rangkaian Siam, seperti Generative Adversarial Networks (GAN) berdasarkan rangkaian generatif adversarial
1. Teknologi pensampelan semula
Dalam set data yang tidak seimbang Bilangan sampel kategori sangat berbeza. Untuk mengimbangi set data, teknik pensampelan semula boleh digunakan. Yang biasa termasuk pensampelan kurang dan pensampelan berlebihan untuk mengelakkan tumpuan berlebihan pada beberapa kategori.
Undersampling adalah untuk mengimbangi saiz sampel kategori majoriti dan kategori minoriti dengan memadam beberapa sampel kategori majoriti supaya ia mempunyai bilangan sampel yang sama dengan kategori minoriti. Pendekatan ini boleh mengurangkan tumpuan model pada kategori majoriti, tetapi mungkin juga kehilangan beberapa maklumat berguna.
Oversampling adalah untuk mengimbangi masalah ketidakseimbangan sampel dengan menyalin sampel kelas minoriti supaya kelas minoriti dan kelas majoriti mempunyai bilangan sampel yang sama. Walaupun pensampelan berlebihan boleh meningkatkan bilangan sampel kelas minoriti, ia juga boleh menyebabkan masalah overfitting.
2. Teknik Berat Contoh
Cara lain untuk menangani set data yang tidak seimbang ialah menggunakan teknik berat sampel. Kaedah ini boleh memberikan pemberat yang berbeza kepada sampel kategori yang berbeza untuk menggambarkan kepentingannya dalam set data.
Pendekatan biasa ialah menggunakan frekuensi kelas untuk mengira berat sampel. Secara khusus, berat setiap sampel boleh ditetapkan sebagai $$
w_i=frac{1}{n_ccdot n_i}
di mana n_c ialah bilangan sampel dalam kategori c dan n_i ialah kategori yang mana sampel i tergolong dalam bilangan sampel. Kaedah ini boleh mengimbangi set data dengan memberikan pemberat yang lebih tinggi kepada sampel kelas minoriti.
3. Tukar fungsi kehilangan
Rangkaian Siam biasanya menggunakan fungsi kehilangan kontras untuk melatih model, seperti fungsi kehilangan tiga kali ganda atau fungsi kehilangan kosinus. Apabila berurusan dengan set data yang tidak seimbang, fungsi kehilangan kontrastif yang lebih baik boleh digunakan untuk menjadikan model memberi lebih perhatian kepada sampel daripada kelas minoriti.
Pendekatan biasa ialah menggunakan fungsi kehilangan kontrastif berwajaran, di mana sampel daripada kelas minoriti mempunyai wajaran yang lebih tinggi. Khususnya, fungsi kehilangan boleh ditukar kepada bentuk berikut:
L=frac{1}{N}sum_{i=1}^N w_icdot L_i
di mana N ialah bilangan sampel dan w_i ialah sampel i Berat L_i ialah kehilangan kontras sampel i.
4. Gabungkan pelbagai kaedah
Akhir sekali, untuk menangani set data yang tidak seimbang, pelbagai kaedah boleh digabungkan untuk melatih rangkaian Siam. Contohnya, seseorang boleh menggunakan teknik pensampelan semula dan teknik pemberat sampel untuk mengimbangi set data, dan kemudian menggunakan fungsi kehilangan kontrastif yang lebih baik untuk melatih model. Kaedah ini boleh menggunakan sepenuhnya kelebihan pelbagai teknik dan memperoleh prestasi yang lebih baik pada set data yang tidak seimbang.
Untuk set data yang tidak seimbang, penyelesaian biasa ialah menggunakan fungsi kehilangan wajaran, di mana kelas yang kurang kerap diberikan wajaran yang lebih tinggi. Berikut ialah contoh mudah yang menunjukkan cara melaksanakan rangkaian Siam dengan fungsi kehilangan wajaran dalam Keras untuk mengendalikan set data tidak seimbang:
from keras.layers import Input, Conv2D, Lambda, Dense, Flatten, MaxPooling2D from keras.models import Model from keras import backend as K import numpy as np # 定义输入维度和卷积核大小 input_shape = (224, 224, 3) kernel_size = 3 # 定义共享的卷积层 conv1 = Conv2D(64, kernel_size, activation='relu', padding='same') pool1 = MaxPooling2D(pool_size=(2, 2)) conv2 = Conv2D(128, kernel_size, activation='relu', padding='same') pool2 = MaxPooling2D(pool_size=(2, 2)) conv3 = Conv2D(256, kernel_size, activation='relu', padding='same') pool3 = MaxPooling2D(pool_size=(2, 2)) conv4 = Conv2D(512, kernel_size, activation='relu', padding='same') flatten = Flatten() # 定义共享的全连接层 dense1 = Dense(512, activation='relu') dense2 = Dense(512, activation='relu') # 定义距离度量层 def euclidean_distance(vects): x, y = vects sum_square = K.sum(K.square(x - y), axis=1, keepdims=True) return K.sqrt(K.maximum(sum_square, K.epsilon())) # 定义Siamese网络 input_a = Input(shape=input_shape) input_b = Input(shape=input_shape) processed_a = conv1(input_a) processed_a = pool1(processed_a) processed_a = conv2(processed_a) processed_a = pool2(processed_a) processed_a = conv3(processed_a) processed_a = pool3(processed_a) processed_a = conv4(processed_a) processed_a = flatten(processed_a) processed_a = dense1(processed_a) processed_a = dense2(processed_a) processed_b = conv1(input_b) processed_b = pool1(processed_b) processed_b = conv2(processed_b) processed_b = pool2(processed_b) processed_b = conv3(processed_b) processed_b = pool3(processed_b) processed_b = conv4(processed_b) processed_b = flatten(processed_b) processed_b = dense1(processed_b) processed_b = dense2(processed_b) distance = Lambda(euclidean_distance)([processed_a, processed_b]) model = Model([input_a, input_b], distance) # 定义加权损失函数 def weighted_binary_crossentropy(y_true, y_pred): class1_weight = K.variable(1.0) class2_weight = K.variable(1.0) class1_mask = K.cast(K.equal(y_true, 0), 'float32') class2_mask = K.cast(K.equal(y_true, 1), 'float32') class1_loss = class1_weight * K.binary_crossentropy(y_true, y_pred) * class1_mask class2_loss = class2_weight * K.binary_crossentropy(y_true, y_pred) * class2_mask return K.mean(class1_loss + class2_loss) # 编译模型,使用加权损失函数和Adam优化器 model.compile(loss=weighted_binary_crossentropy, optimizer='adam') # 训练模型 model.fit([X_train[:, 0], X_train[:, 1]], y_train, batch_size=32, epochs=10, validation_data=([X_val[:, 0], X_val[:, 1]], y_val))
Di mana fungsi weighted_binary_crossentropy mentakrifkan fungsi kehilangan wajaran, class1_weight dan class2_weight ialah kategori 1 dan 2 masing-masing berat kategori 2, class1_mask dan class2_mask ialah topeng yang digunakan untuk melindungi kategori 1 dan kategori 2. Apabila melatih model, anda perlu menghantar data latihan dan data pengesahan kepada dua input model, dan lulus pembolehubah sasaran sebagai parameter ketiga kepada kaedah muat. Sila ambil perhatian bahawa ini hanyalah satu contoh dan tidak dijamin untuk menyelesaikan sepenuhnya masalah set data yang tidak seimbang. Dalam aplikasi praktikal, mungkin perlu mencuba penyelesaian yang berbeza dan menyesuaikannya mengikut situasi tertentu.
Atas ialah kandungan terperinci Cara menggunakan rangkaian Siam untuk mengendalikan set data tidak seimbang sampel (dengan kod sampel). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!