在 Keras 中实现 Siamese NN
Implementing a Siamese NN in Keras
所以我尝试用 10 类 来实现 this paper about a Siamese neural network: Learning a similarity metric discriminatively, with application to face verification, by Sumit Chopra, Raia Hadsell and Yann LeCun (2005). I'm using the CIFAR10 dataset。
为方便起见,转载了其中一条腿的规格。表示法:C_x是卷积层,S_x是子采样层,F_x是全连接层;使用共享索引 x:
- C1: feature maps: 15, kernel size = (7, 7)
- S2: feature maps: 15, field-of-view = (2, 2)
- C3: feature maps: 45, kernel size = (6, 6)
- S4: feature maps: 45, field-of-view = (4, 3)
- C5: feature maps: 250, kernel size = (5, 5)
- F6(全连接层):没有。单位数 = 50
我试过的
model = Sequential()
#C1
model.add(Convolution2D(15, 7, 7,
activation='relu',
border_mode='same',
input_shape=input_img_shape))
print("C1 shape: ", model.output_shape)
#S2
model.add(MaxPooling2D((2,2), border_mode='same'))
print("S2 shape: ", model.output_shape)
#...
#C5
model.add(Convolution2D(250, 5, 5,
activation='relu',
border_mode='same'))
print("C5 shape: ", model.output_shape)
#F6
model.add(Dense(50))
这会抛出一条很长的错误消息,我认为这是重塑错误。错误片段:
Exception: Input 0 is incompatible with layer dense_13: expected
ndim=2, found ndim=4
我知道问题被隔离在最后的 Dense 层中,因为如果我将其注释掉,代码将顺利进行。但是我不确定我应该如何 shape/specify 我的最终完全连接层,以便它与之前的卷积层兼容?
我去过的一些地方
is a related problem, though the implementation is slightly different (it seems that there isn't a 'Siamese' core layer in keras at the time of this writing). I'm aware that there are also ,如果我不能在 keras 中做到这一点,我会牢记这一点。
谢谢!
您不需要 Siamese Layer,您只需要使用 Keras functional API 创建一个具有两个输入和一个输出的模型。
似乎 Keras 示例 already contain 一个与您正在实施的模型非常相似的模型。
正如 Matias Valdenegro 所提到的,Keras 已经有一个 Siamese network 的例子。不过,该示例仅使用密集层。
你的问题是你需要在卷积层和密集层之间添加一个 Flatten
层以获得正确的形状,参见 this Keras CNN example
这 2 个示例应该可以帮助您构建 Siamese 网络。
所以我尝试用 10 类 来实现 this paper about a Siamese neural network: Learning a similarity metric discriminatively, with application to face verification, by Sumit Chopra, Raia Hadsell and Yann LeCun (2005). I'm using the CIFAR10 dataset。
为方便起见,转载了其中一条腿的规格。表示法:C_x是卷积层,S_x是子采样层,F_x是全连接层;使用共享索引 x:
- C1: feature maps: 15, kernel size = (7, 7)
- S2: feature maps: 15, field-of-view = (2, 2)
- C3: feature maps: 45, kernel size = (6, 6)
- S4: feature maps: 45, field-of-view = (4, 3)
- C5: feature maps: 250, kernel size = (5, 5)
- F6(全连接层):没有。单位数 = 50
我试过的
model = Sequential()
#C1
model.add(Convolution2D(15, 7, 7,
activation='relu',
border_mode='same',
input_shape=input_img_shape))
print("C1 shape: ", model.output_shape)
#S2
model.add(MaxPooling2D((2,2), border_mode='same'))
print("S2 shape: ", model.output_shape)
#...
#C5
model.add(Convolution2D(250, 5, 5,
activation='relu',
border_mode='same'))
print("C5 shape: ", model.output_shape)
#F6
model.add(Dense(50))
这会抛出一条很长的错误消息,我认为这是重塑错误。错误片段:
Exception: Input 0 is incompatible with layer dense_13: expected
ndim=2, found ndim=4
我知道问题被隔离在最后的 Dense 层中,因为如果我将其注释掉,代码将顺利进行。但是我不确定我应该如何 shape/specify 我的最终完全连接层,以便它与之前的卷积层兼容?
我去过的一些地方
谢谢!
您不需要 Siamese Layer,您只需要使用 Keras functional API 创建一个具有两个输入和一个输出的模型。
似乎 Keras 示例 already contain 一个与您正在实施的模型非常相似的模型。
正如 Matias Valdenegro 所提到的,Keras 已经有一个 Siamese network 的例子。不过,该示例仅使用密集层。
你的问题是你需要在卷积层和密集层之间添加一个 Flatten
层以获得正确的形状,参见 this Keras CNN example
这 2 个示例应该可以帮助您构建 Siamese 网络。