我正在尝试为https://www.kaggle.com/moltean/fruits数据集建立一个连体网络。我从这个数据集中为每个班级挑选了 10 张图片。该数据集中共有 131 个类。我正在使用下面的模型来训练我的网络。但是,它无法收敛。我看到了一个奇怪的行为,在 3000 个 epoch 之后,无论我给出的输入对如何,我的结果都是 0.5000003,并且我的损失停止在 0.61。网络规格如论文中所述。我尝试更改以下内容,
- 将 Denes 层激活更改为 ReLU
- 导入 ResNet50 的“ImageNet”权重
- 尝试增加和减少学习率。
我还检查了批输入以查看正确的输入对 (x) 是否与正确的 y 值配对。但是,我认为我做的事情基本上是错误的。很高兴你能帮助我。谢谢 :)
该笔记本托管在 Kaggle https://www.kaggle.com/krishnaprasad96/siamese-network中。如果您对代码的某些部分的工作方式有疑问,请参阅https://medium.com/@krishnaprasad_54871/siamese-networks-line-by-line-explanation-for-beginners-55b8be1d2fc6
#Building a sequential model
input_shape=(100, 100, 3)
left_input = Input(input_shape)
right_input = Input(input_shape)
W_init = keras.initializers.RandomNormal(mean = 0.0, stddev = 1e-2)
b_init = keras.initializers.RandomNormal(mean = 0.5, stddev = 1e-2)
model = keras.models.Sequential([
keras.layers.Conv2D(64, (10,10), activation='relu', input_shape=input_shape, kernel_initializer=W_init, kernel_regularizer=l2(2e-4)),
keras.layers.MaxPooling2D(),
keras.layers.Conv2D(128, (7,7), activation='relu', kernel_initializer=W_init, bias_initializer=b_init, kernel_regularizer=l2(2e-4)),
keras.layers.MaxPooling2D(),
keras.layers.Conv2D(128, (4,4), activation='relu', kernel_initializer=W_init, bias_initializer=b_init, kernel_regularizer=l2(2e-4)),
keras.layers.MaxPooling2D(),
keras.layers.Conv2D(256, (4,4), activation='relu', kernel_initializer=W_init, bias_initializer=b_init, kernel_regularizer=l2(2e-4)),
keras.layers.MaxPooling2D(),
keras.layers.Flatten(),
keras.layers.Dense(4096, activation='sigmoid', kernel_initializer=W_init, bias_initializer=b_init, kernel_regularizer=l2(1e-3))
])
encoded_l = model(left_input)
encoded_r = model(right_input)
subtracted = keras.layers.Subtract()([encoded_l, encoded_r])
prediction = Dense(1, activation='sigmoid', bias_initializer=b_init)(subtracted)
siamese_net = Model(input=[left_input, right_input], output=prediction)
optimizer= Adam(learning_rate=0.0006)
siamese_net.compile(loss='binary_crossentropy', optimizer=optimizer)
plot_model(siamese_net, show_shapes=True, show_layer_names=True)