因此,我正在尝试实施这篇关于Siamese神经网络的论文:Sumit Chopra,Raia Hadsell和Yann LeCun(2005),通过应用于面部验证来区分相似性度量.不过,我正在使用CIFAR10数据集,有10个类.
为方便起见,再现了一条腿的规格.符号:C_x是卷积层,S_x是子采样层,F_x是完全连接的层; 使用共享索引x:
我试过的
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))
Run Code Online (Sandbox Code Playgroud)
这会抛出一条长错误信息,我认为这是一个重塑错误.错误的片段:
Exception: Input 0 is incompatible with layer dense_13: expected
ndim=2, found ndim=4
Run Code Online (Sandbox Code Playgroud)
我知道问题是在最后的Dense层中被隔离的,因为如果我将它注释掉,代码会顺利进行.但我不确定我应该如何塑造/指定我的最终完全连接层,以便它与先前的卷积层兼容?
我看过的一些地方
这是一个相关的问题,虽然实现略有不同(似乎在撰写本文时keras中没有'Siamese'核心层).我知道Theano中也有实现,如果我不能在keras中执行它,我会牢记这一点.
谢谢!
假设我有一个学生考试成绩的数据框,每个学生学习不同的科目。每个学生可以多次参加每个科目的考试,只保留最高分(满分 100 分)。例如,假设我有一个包含所有测试记录的数据框:
| student_name | subject | test_number | score |
|--------------|---------|-------------|-------|
| sarah | maths | test1 | 78 |
| sarah | maths | test2 | 71 |
| sarah | maths | test3 | 83 |
| sarah | physics | test1 | 91 |
| sarah | physics | test2 | 97 |
| sarah | history | test1 | 83 |
| sarah | history | test2 | 87 |
| joan | maths …Run Code Online (Sandbox Code Playgroud) 我有一张桌子:
country | name | medals_won | year
-----------------------------------
US | sarah | 1 | 2010
US | sarah | 2 | 2011
US | sarah | 5 | 2015
US | alice | 3 | 2010
US | alice | 4 | 2012
US | alice | 1 | 2015
AU | jones | 2 | 2013
AU | jones | 8 | 2015
Run Code Online (Sandbox Code Playgroud)
我希望它像:
country | name | 2010 | 2011 | 2012 | 2013 | 2014 | …Run Code Online (Sandbox Code Playgroud) 我在一堆我自己的图像数据上运行卷积神经网络(这个),形状(通道数,高度,宽度)=(3, 30, 30)。我有76960个训练样本,19240个测试样本,一共有39个类。最后几块代码是:
# Train the model using Stochastic grad descent + momentum
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
cnn.compile(loss='categorical_crossentropy',
optimizer=sgd,
metrics=['accuracy'])
batch_size = 128
nb_epoch = 50
cnn.fit(x_train, y_train,
batch_size = batch_size,
nb_epoch = nb_epoch,
validation_data=(x_test, y_test),
shuffle=True)
Run Code Online (Sandbox Code Playgroud)
训练损失和准确率随 epoch 变化,但验证准确率仅从第 1 个到第 2 个 epoch(从 0.3387 到 0.3357)发生变化,然后一直保持在 0.3357。
我尝试过不同的批量大小(32、128 或 256)、学习率(从 1e-6 到 0.1,一路乘以 10)并尝试使用或不使用数据标准化(基本均值偏移和除以 sd )。这些都没有奏效。
我有一个 python 字符串,如:"(a and b and c) or (d and e)",其中 a、b、c、d 和 e 是某种条件。您可能会看到,这实际上是一个逻辑表达式。
我想以某种方式将其转换为类似逻辑门的函数,例如f。所以我会向f传递一些真实的条件,并得到逻辑结果。例子:
(d and e)(即 d 和 c 为真),则f返回True。(a and b and c),f返回True。a,f返回False。b and c,f返回False。我不知道如何解决这样的问题。strtobool不能完全满足我的要求,我不确定如何将给定的字符串转换为函数。至于将 true 条件作为输入传递,我正在考虑将True布尔值列表传递给它,即所有条件都是False默认值。例如从上面的第一个例子:
d = True; e = True
f([d, e])
> …Run Code Online (Sandbox Code Playgroud)