[英]val_loss and val_accuracy do not change in siamese network
我实现了连体网络,但 val_loss 和 val_accuracy 没有改变。 数据集用于人脸。 我为标签和图像制作了配对,并且我可以在测试中看到配对,所以我在阅读配对时没有问题。 连体网络代码:
inputs = layers.Input(input Shape)
x = layers.Conv2D(64,(3,3),padding = 'same')(inputs)
x =layers.BatchNormalization()(x)
x =layers.Activation('relu')(x)
x =layers.Dropout(0.8)(x)
x =layers.Conv2D(64,(3,3),padding = 'same')(x)
x =layers.BatchNormalization()(x)
x =layers.Activation('relu')(x)
x =layers.Dropout(0.8)(x)
x =layers.MaxPool2D(pool_size = (2,2),strides=(2,2))(x)
x =layers.Conv2D(128,(3,3),padding = 'same')(x)
x =layers.BatchNormalization()(x)
x =layers.Activation('relu')(x)
x =layers.Dropout(0.8)(x)
x =layers.Conv2D(128,(3,3),padding = 'same')(x)
x =layers.BatchNormalization()(x)
x =layers.Activation('relu')(x)
x =layers.Dropout(0.8)(x)
x =layers.MaxPool2D(pool_size = (2,2),strides=(2,2))(x)
x =layers.Conv2D(256,(3,3),padding = 'same')(x)
x =layers.BatchNormalization()(x)
x =layers.Activation('relu')(x)
x =layers.Dropout(0.8)(x)
x =layers.Conv2D(256,(3,3),padding = 'same')(x)
x =layers.BatchNormalization()(x)
x =layers.Activation('relu')(x)
x =layers.Dropout(0.8)(x)
x =layers.Conv2D(256,(3,3),padding = 'same')(x)
x =layers.BatchNormalization()(x)
x =layers.Activation('relu')(x)
x =layers.Dropout(0.8)(x)
x =layers.MaxPool2D(pool_size = (2,2),strides=(2,2))(x)
x =layers.Conv2D(256,(3,3),padding = 'same')(x)
x =layers.BatchNormalization()(x)
x =layers.Activation('relu')(x)
x =layers.Dropout(0.8)(x)
x =layers.MaxPool2D(pool_size = (2,2),strides=(2,2))(x)
x =layers.Dense(4096, activation ='relu')(x)
x =layers.Dropout(0.5)(x)
x =layers.Dense(4096, activation ='relu')(x)
x =layers.Dropout(0.5)(x)
pooledOutput = layers.GlobalAveragePooling2D()(x)
outputs = layers.Dense(embeddingDim)(pooledOutput)
# Build the model
model = Model(inputs, outputs)
# Return the model to the calling function
print (model.summary())
return model
然后我使用 adam 和 binary_crossentropy 编译部分:
opt = Adam(lr = 1e-1)
model.compile(loss="binary_crossentropy", optimizer=opt,
metrics=["accuracy"])
history = model.fit([pairTrain[:, 0], pairTrain[:, 1]],labelTrain,
validation_data=([pairTest[:, 0], pairTest[:, 1]], labelTest),batch_size=Config.BATCH_SIZE,epochs=Config.EPOCHS)
以及model汇总及参数个数:
Layer (type) Output Shape Param #
=================================================================
input_3 (InputLayer) [(None, 96, 96, 3)] 0
conv2d (Conv2D) (None, 96, 96, 64) 1792
batch_normalization (BatchNormalization) (None, 96, 96, 64) 256
activation (Activation) (None, 96, 96, 64) 0
dropout (Dropout) (None, 96, 96, 64) 0
conv2d_1 (Conv2D) (None, 96, 96, 64) 36928
batch_normalization_1(BatchNormalization) (None, 96, 96, 64) 256
activation_1 (Activation) (None, 96, 96, 64) 0
dropout_1 (Dropout) (None, 96, 96, 64) 0
max_pooling2d (MaxPooling2D (None, 48, 48, 64) 0
conv2d_2 (Conv2D) (None, 48, 48, 128) 73856
batch_normalization_2 (BatchNormalization) (None, 48, 48, 128) 512
activation_2 (Activation) (None, 48, 48, 128) 0
dropout_2 (Dropout) (None, 48, 48, 128) 0
conv2d_3 (Conv2D) (None, 48, 48, 128) 147584
batch_normalization_3 (BatchNormalization) (None, 48, 48, 128) 512
activation_3 (Activation) (None, 48, 48, 128) 0
dropout_3 (Dropout) (None, 48, 48, 128) 0
max_pooling2d_1 (MaxPooling2D) (None, 24, 24, 128) 0
conv2d_4 (Conv2D) (None, 24, 24, 256) 295168
batch_normalization_4 (BatchNormalization) (None, 24, 24, 256) 1024
activation_4 (Activation) (None, 24, 24, 256) 0
dropout_4 (Dropout) (None, 24, 24, 256) 0
conv2d_5 (Conv2D) (None, 24, 24, 256) 590080
batch_normalization_5 (BatchNormalization) (None, 24, 24, 256) 1024
activation_5 (Activation) (None, 24, 24, 256) 0
dropout_5 (Dropout) (None, 24, 24, 256) 0
conv2d_6 (Conv2D) (None, 24, 24, 256) 590080
batch_normalization_6 (BatchNormalization) (None, 24, 24, 256) 1024
activation_6 (Activation) (None, 24, 24, 256) 0
dropout_6 (Dropout) (None, 24, 24, 256) 0
max_pooling2d_2 (MaxPooling2D) (None, 12, 12, 256) 0
conv2d_7 (Conv2D) (None, 12, 12, 256) 590080
batch_normalization_7(BatchNormalization) (None, 12, 12, 256) 1024
activation_7 (Activation) (None, 12, 12, 256) 0
dropout_7 (Dropout) (None, 12, 12, 256) 0
max_pooling2d_3 (MaxPooling2D) (None, 6, 6, 256) 0
dense (Dense) (None, 6, 6, 4096) 1052672
dropout_8 (Dropout) (None, 6, 6, 4096) 0
dense_1 (Dense) (None, 6, 6, 4096) 16781312
dropout_9 (Dropout) (None, 6, 6, 4096) 0
global_average_pooling2d (GlobalAveragePooling2D) (None, 4096) 0
dense_2 (Dense) (None, 48) 196656
=================================================================
Total params: 20,361,840
Trainable params: 20,359,024
Non-trainable params: 2,816
____________________________
output 如下所示:
Epoch 310/400
1/1 [==============================] - 0s 191ms/step - loss: 2.5433e-04 - accuracy: 1.0000 - val_loss: 3.7977 - val_accuracy: 0.5000
Epoch 311/400
1/1 [==============================] - 0s 82ms/step - loss: 2.5718e-04 - accuracy: 1.0000 - val_loss: 3.7978 - val_accuracy: 0.5000
Epoch 312/400
1/1 [==============================] - 0s 81ms/step - loss: 2.5694e-04 - accuracy: 1.0000 - val_loss: 3.7978 - val_accuracy: 0.5000
Epoch 313/400
1/1 [==============================] - 0s 82ms/step - loss: 2.5570e-04 - accuracy: 1.0000 - val_loss: 3.7979 - val_accuracy: 0.5000
Epoch 314/400
1/1 [==============================] - 0s 81ms/step - loss: 2.5392e-04 - accuracy: 1.0000 - val_loss: 3.7979 - val_accuracy: 0.5000
Epoch 315/400
1/1 [==============================] - 0s 82ms/step - loss: 2.5371e-04 - accuracy: 1.0000 - val_loss: 3.7980 - val_accuracy: 0.5000
Epoch 316/400
1/1 [==============================] - 0s 81ms/step - loss: 2.5867e-04 - accuracy: 1.0000 - val_loss: 3.7980 - val_accuracy: 0.5000
Epoch 317/400
1/1 [==============================] - 0s 81ms/step - loss: 2.5400e-04 - accuracy: 1.0000 - val_loss: 3.7981 - val_accuracy: 0.5000
Epoch 318/400
1/1 [==============================] - 0s 83ms/step - loss: 2.5599e-04 - accuracy: 1.0000 - val_loss: 3.7981 - val_accuracy: 0.5000
Epoch 319/400
1/1 [==============================] - 0s 83ms/step - loss: 2.5272e-04 - accuracy: 1.0000 - val_loss: 3.7982 - val_accuracy: 0.5000
我该如何解决这个问题?
对于 SNN,您需要实现contrastive_loss
而不是二进制 CE,甚至您应该定义具有相同结构和权重的相同模型,然后定义 lambda 层,该层将采用这些模型的 output 并通过 Z968A45F3FZF44B85 计算相似度计算欧几里得距离的层
但是您的 model 只是一侧,并且在 keras.Model() 中仅定义了一个输入,它还需要预处理数据以将它们分组到 Z20F35E630DAF44DBFA4C3F68F68F5399D8CZ 定义相似性或非相似性的标签中的方式但是在安装 model 时,您正在为 model 提供两个输入。
甚至在您的 model 结构中,您在密集层之后实现全局平均池,尽管 model 未定义为分类,因此根本不需要任何密集层? 甚至将 Adam 作为优化器设置为学习率 = 1E-1?!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.