ホームページ > 記事 > テクノロジー周辺機器 > Siamese ネットワークを使用してサンプルの不均衡なデータセットを処理する方法 (サンプルコード付き)
シャム ネットワークは、計量学習に使用されるニューラル ネットワーク モデルであり、2 つの入力間の類似性または差異の尺度を計算する方法を学習できます。その柔軟性により、顔認識、意味的類似性の計算、テキスト マッチングなどの多くのアプリケーションで人気があります。ただし、Siamese ネットワークは、少数のクラスのサンプルに過度に焦点を当て、大部分のサンプルを無視する可能性があるため、不均衡なデータ セットを扱う場合に問題に直面する可能性があります。この問題を解決するには、いくつかの手法を使用できます。 1 つのアプローチは、アンダーサンプリングまたはオーバーサンプリングを通じてデータ セットのバランスをとることです。アンダーサンプリングとは、少数派クラスのサンプル数と等しくなるように、多数派クラスから一部のサンプルをランダムに削除することを意味します。オーバーサンプリングは、多数派クラスのサンプル数と等しくなるように、新しいサンプルをコピーまたは生成することによって少数派クラスのサンプル数を増やします。これにより、データセットのバランスが効果的に保たれますが、情報の損失や過剰適合の問題が発生する可能性があります。 もう一つの方法は、重量調整を使用することです。少数派クラスのサンプルにより高い重みを割り当てることにより、少数派クラスに対するシャム ネットワークの注目を高めることができます。これにより、データセットを変更せずにいくつかのクラスに焦点を当てることにより、モデルのパフォーマンスが向上します。 さらに、敵対的生成ネットワーク
1 に基づく敵対的生成ネットワーク (GAN) など、いくつかの高度なメトリクス学習アルゴリズムを使用して、シャム ネットワークのパフォーマンスを向上させることもできます。
不均衡なデータセットでは、カテゴリサンプルの数は大きく異なります。データセットのバランスをとるために、リサンプリング手法を使用できます。一般的なものには、いくつかのカテゴリに過度に集中するのを防ぐためのアンダーサンプリングとオーバーサンプリングが含まれます。
アンダーサンプリングとは、多数派カテゴリのサンプルの一部を削除して少数派カテゴリと同じサンプル数になるようにすることで、多数派カテゴリと少数派カテゴリのサンプル サイズのバランスを取ることです。このアプローチでは、モデルが大多数のカテゴリに重点を置くことを減らすことができますが、一部の有用な情報が失われる可能性もあります。
オーバーサンプリングは、少数派クラスと多数派クラスのサンプル数が同じになるように少数派クラスのサンプルをコピーすることで、サンプルの不均衡問題のバランスをとります。オーバーサンプリングにより少数派クラスのサンプル数が増加する可能性がありますが、オーバーフィッティングの問題が発生する可能性もあります。
2. サンプル重み付けテクニック
#不均衡なデータセットに対処するもう 1 つの方法は、サンプル重み付けテクニックを使用することです。この方法では、さまざまなカテゴリのサンプルに異なる重みを与えて、データ セットにおけるサンプルの重要性を反映できます。
#一般的なアプローチは、クラス頻度を使用してサンプルの重みを計算することです。具体的には、各サンプルの重みを $$##w_i=\frac{1}{n_c\cdot n_i}
##Where に設定できます。 n_c はカテゴリ c のサンプル数、n_i はサンプル i が属するカテゴリのサンプル数です。この方法では、少数派クラスのサンプルに高い重みを与えることで、データ セットのバランスをとることができます。 3. 損失関数を変更する シャム ネットワークは通常、三重項損失関数やコサイン損失関数などの対照的な損失関数を使用してモデルをトレーニングします。 。不均衡なデータセットを扱う場合、改良されたコントラスト損失関数を使用して、モデルが少数派のサンプルにさらに注意を払うようにすることができます。 一般的なアプローチは、少数派クラスのサンプルの重みが大きくなる、重み付き対比損失関数を使用することです。具体的には、損失関数は次の形式に変更できます: L=\frac{1}{N}\sum_{i=1}^N w_i\cdot L_i ここで、N はサンプルの数、w_i はサンプル i の重み、L_i はサンプル i のコントラスト損失です。 4. 複数の方法を組み合わせる 最後に、不均衡なデータセットに対処するために、複数の方法を組み合わせてシャム ネットワークをトレーニングできます。 。たとえば、リサンプリング手法とサンプル重み付け手法を使用してデータ セットのバランスをとり、改良されたコントラスト損失関数を使用してモデルをトレーニングできます。この方法では、さまざまな技術の利点を最大限に活用し、不均衡なデータセットでより優れたパフォーマンスを得ることができます。 不均衡なデータセットの場合、一般的な解決策は、頻度の低いクラスに高い重みを割り当てる重み付き損失関数を使用することです。以下は、不均衡なデータ セットを処理するために、Keras で加重損失関数を備えたシャム ネットワークを実装する方法を示す簡単な例です。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))その中で、weighted_binary_crossentropy 関数は、それぞれ加重損失関数、class1_weight と class2_weight を定義します。カテゴリ 1 とカテゴリ 2 の重み、class1_mask と class2_mask は、カテゴリ 1 とカテゴリ 2 をシールドするために使用されるマスクです。モデルをトレーニングするときは、トレーニング データと検証データをモデルの 2 つの入力に渡し、ターゲット変数を 3 番目のパラメーターとして Fit メソッドに渡す必要があります。これは単なる例であり、不均衡なデータセットの問題を完全に解決することを保証するものではないことに注意してください。実際のアプリケーションでは、さまざまなソリューションを試し、特定の状況に応じて調整することが必要になる場合があります。
以上がSiamese ネットワークを使用してサンプルの不均衡なデータセットを処理する方法 (サンプルコード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。