【发布时间】:2017-08-25 09:35:34
【问题描述】:
我试图从Keras example about siamese network 更改代码。但奇怪的是,无论损失减少多少,准确率始终为 0.5000。我现在的假设是我错误地修改了 create_pair 函数,我想尝试将类数更改为 4:
原文:
def create_pairs(x, digit_indices):
'''Positive and negative pair creation.
Alternates between positive and negative pairs.
'''
pairs = []
labels = []
n = min([len(digit_indices[d]) for d in range(10)]) - 1
for d in range(10):
for i in range(n):
z1, z2 = digit_indices[d][i], digit_indices[d][i + 1]
pairs += [[x[z1], x[z2]]]
inc = random.randrange(1, 10)
dn = (d + inc) % 10
z1, z2 = digit_indices[d][i], digit_indices[dn][i]
pairs += [[x[z1], x[z2]]]
labels += [1, 0]
return np.array(pairs), np.array(labels)
并且,在第 93-97 行:
digit_indices = [np.where(y_train == i)[0] for i in range(10)]
tr_pairs, tr_y = create_pairs(x_train, digit_indices)
digit_indices = [np.where(y_test == i)[0] for i in range(10)]
te_pairs, te_y = create_pairs(x_test, digit_indices)
这是我的代码:
def create_pairs(x, digit_indices):
'''Positive and negative pair creation.
Alternates between positive and negative pairs.
'''
pairs = []
labels = []
n = min([len(digit_indices[d]) for d in range(4)]) - 1
for d in range(4):
for i in range(n):
z1, z2 = digit_indices[d][i], digit_indices[d][i + 1]
pairs += [[x[z1], x[z2]]]
inc = random.randrange(1, 4)
dn = (d + inc) % 4
z1, z2 = digit_indices[d][i], digit_indices[dn][i]
pairs += [[x[z1], x[z2]]]
labels += [1, 0]
return np.array(pairs), np.array(labels)
并且,在第 93-97 行:
digit_indices = [np.where(y_train == i)[0] for i in range(4)]
tr_pairs, tr_y = create_pairs(x_train, digit_indices)
digit_indices = [np.where(y_test == i)[0] for i in range(4)]
te_pairs, te_y = create_pairs(x_test, digit_indices)
这是我的base_network(使用RNN的那个,不是我在评论回复中谈到的conv net,都给出了相同的结果,50%的准确率):
def create_base_network(embedding_layer):
seq = Sequential()
seq.add(embedding_layer)
seq.add(GRU(512, use_bias=True, dropout=0.5, recurrent_dropout=0.5, return_sequences=True))
seq.add(GRU(512, use_bias=True, dropout=0.5, recurrent_dropout=0.5))
seq.add(Dense(512, activation='relu'))
seq.add(Dropout(0.1))
seq.add(Dense(512, activation='relu'))
return seq
嵌入层只是一个简单的手套矩阵。我还在合并后使用 sigmoid 激活函数添加了另一个密集层。
有什么遗漏吗?或者这不是我应该如何改变它?提前致谢
【问题讨论】:
-
我收到了 0 到 3 位数字的
* Accuracy on training set: 99.97%`` * Accuracy on test set: 99.69%...你还改变了什么? -
你可以在这里查看我对你要求的限制的更改gist.github.com/oak-tree/49fcbee1d2ecfb11c78b1b64bafc9a76
-
我也更改了 base_network,我尝试复制 this paper。因此,我使用 conv net(s) 更改了基础网络,并在 lambda 层之后添加了一个密集层 + 我将欧几里德距离更改为 L1 距离。所以我想可能我只需要增加 epoch 以便 conv 层可以了解更多(?)。你怎么看?
-
如果您发布您的来源 更容易提供帮助。请注意您添加的论文,您还需要添加 sigmoid 激活
-
是的,我在 Lambda 层之后添加了 sigmoid 层,并且我更新了问题以向您展示我的 base_network,对该代码有什么建议吗? @橡树
标签: keras