问题标签 [siamese-network]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
151 浏览

python - Keras 中的连体网络 - 错误

我已经在图像数据集上训练了一个连体网络,并得到了一些错误,如下所示。

我已经在图像数据集上训练了模型:

我有以下错误。

ValueError:检查模型输入时出错:您传递给模型的 Numpy 数组列表不是模型预期的大小。预计会看到 2 个数组,但得到了以下 1 个数组的列表:[array([[[[1., 1., 1.], [1., 1., 1.], [1. , 1. , 1. ], ..., [1. , 1. , 1. ...

0 投票
0 回答
40 浏览

python - 使用 Python 和 Keras 构建连体网络的问题

我想用以下形式制作一个网络 在此处输入图像描述

所以我写了这段代码:

当我运行它时,我收到此错误:

我发现这是因为在这一行:

input_shape 参数不正确,所以如果我输入 (240,240,3) 而不是给定的参数,它可以工作。我想知道如何解决它。

所以,如果我输入(240,240,3),那么我会得到这个错误:

我不知道如何解决这个问题。

0 投票
1 回答
767 浏览

machine-learning - Keras中示例Siamese网络的准确率和错误率

我一直在这里关注这个例子,我想知道这个准确度函数是如何工作的:

据我所知,在这种情况下网络的输出将是两对之间的距离。那么在这种情况下我们如何计算准确率呢?“0.5”阈值指的是什么?另外,如何计算错误率?

0 投票
0 回答
56 浏览

tensorflow - 向 One Shot Learning 训练模型添加新类

我是 One-Shot Learning 的新手,我的信息还不完整。我在互联网搜索中没有找到这些问题的答案。

  1. 在 One-Shot Learning 中训练完网络后,要使用新的单一数据添加新的 Class,网络是否应该从头开始训练?
  2. 如果否,此更新是否需要以前的数据以及它是如何发生的?

谢谢

0 投票
0 回答
251 浏览

python - MNIST 数据集上的连体网络没有得到训练

我在两类 MNIST 数据集上训练具有建设性损失的 Siamese 网络,以识别两个图像是否相似。虽然损失在一开始是减少的,但后来它以 0.5 左右的精度冻结。

该模型在成对的图像和标签上进行训练(0.0 表示不同,1.0 表示相同)。为了简单起见,我只使用了两个类(零和一)并准备了数据集,以便它包含每对图像。我检查了数据集是否一致(来自数据集的图像对)。我还尝试过数据归一化、不同的批量大小、学习率、初始化和正则化常数,但都没有成功。

这是模型:

损失和准确率:

训练:

上面的代码产生:

纪元:0 损失:0.755419433 准确度:0.318898171 val_accuracy:0.310316473

纪元:1 损失:0.270610392 准确度:0.369466901 val_accuracy:0.360871345

纪元:2 损失:0.262594223 准确度:0.430587918 val_accuracy:0.418002456

纪元:3 损失:0.258690506 准确度:0.428258181 val_accuracy:0.427044809

纪元:4 损失:0.25654456 准确度:0.43497327 val_accuracy:0.44800657

纪元:5 损失:0.255373538 准确度:0.444840342 val_accuracy:0.454993844

纪元:6 损失:0.254594624 准确度:0.453885168 val_accuracy:0.454171807

0 投票
1 回答
551 浏览

python - 如何使用训练有素的连体网络来预测具有 100 多个类别的大型测试集的标签?

我是否必须将每个测试图像与每个班级的示例图像进行比较?测试集包含 104 个类别的大约 7400 张图像。所以这将是 7400 x 104 的预测?

在 tpu 上使用 tensorflow,我能够非常有效地训练模型。但是,使用上述方法预测标签需要很长时间,而且模型预测调用会导致内存泄漏,最终导致内核失败(内存可能会爆炸到 30+gb 并且还在增加)。

0 投票
1 回答
300 浏览

deep-learning - 如果在推理过程中是单输入,连体网络是如何用 Pytorch 实现的?

我正在尝试使用 Pytorch 训练一个 CNN 模型,以便输出对于不同类型的输入表现不同。(即如果输入图像是人,则输出模式A,但如果输入是其他动物,则输出模式B)。

经过一番网上搜索,似乎连体网与此有关。所以我有以下两个问题:

(1)Siamese network真的是训练这样一个模型的好方法吗?

(2)从实现的角度来看,pytorch中的代码应该如何实现呢?

目前,我正在尝试一些我在网上找到的现有实现,比如上面的类定义。它可以工作,但是这个模型总是有两个输入和两个输出。我同意它便于训练,但理想情况下,在推理过程中应该只有一个输入和一个(两个也可以)输出。

有人可以就如何修改代码以使其成为单一输入提供一些指导吗?

0 投票
2 回答
859 浏览

python - Pytorch连体网络未收敛

大家,早安

下面是我对 pytorch 连体网络的实现。我使用 32 批大小、MSE 损失和具有 0.9 动量的 SGD 作为优化器。

每批包含交替对,即[pos, pos], [pos, neg], [pos, pos]等...但是,网络不收敛,并且问题似乎fres在网络中对于每一对都是相同的(无论是正对还是负对),并且输出ofself.linear2(fres)总是大约等于[0.0531, 0.0770]。这与我的预期相反,即[0.0531, 0.0770]随着网络的学习,正对的第一个值将接近 1,而负对的第二个值将接近 1。这两个值也需要相加为 1。

我已经为 2 通道网络架构测试了完全相同的设置和相同的输入图像,例如,[pos, pos]您可以在其中以深度方式堆叠这 2 个图像,而不是输入numpy.stack([pos, pos], -1)。在此设置中的尺寸nn.Conv2d(1, 8, 7)也会更改为。nn.Conv2d(2, 8, 7)这工作得很好。

我还为传统的 CNN 方法测试了完全相同的设置和输入图像,我只是将单个正和负灰度图像传递到网络中,而不是堆叠它们(如使用 2-CH 方法)或传递它们作为图像对(与连体方法一样)。这也很有效,但结果不如 2 通道方法好。

编辑(我尝试过的解决方案):

  • 我尝试了许多不同的损失函数,包括 HingeEmbeddingLoss 和 CrossEntropyLoss,都导致或多或少相同的问题。所以我认为可以肯定地说问题不是由使用的损失函数引起的;MSEL 损失。
  • 不同的批量大小似乎也对这个问题没有影响。
  • 我尝试按照 Keras Model for Siamese Network not Learning 中的建议增加可训练参数的数量,并且始终预测相同的输出 也不起作用。
  • 尝试更改此处实施的网络架构:https ://github.com/benmyara/pytorch-examples/blob/master/notebooks/1_NeuralNetworks/9_siamese_nn.ipynb 。换句话说,将前向传递更改为以下代码。还将损失更改为 CrossEntropy,将优化器更改为 Adam。仍然没有运气:
  • 我还尝试将整个网络从 CNN 更改为线性网络,如下所示:https ://github.com/benmyara/pytorch-examples/blob/master/notebooks/1_NeuralNetworks/9_siamese_nn.ipynb 。还是不行。
  • 尝试使用此处建议的更多数据:Keras Model for Siamese Network not Learning and always predicting the same 输出。没运气...
  • 试图torch.nn.PairwiseDistance在 的输出之间使用convnet。做了一些改进;网络在前几个时期开始收敛,然后每次都达到相同的高原:

另一件需要注意的事情可能是,在我的研究范围内,为每个对象训练了一个连体网络。因此,第一类与包含相关对象的图像相关联,第二类与包含其他对象的图像相关联。不知道这是否可能是问题的原因。然而,在传统 CNN 和 2 通道 CNN 方法的背景下,这不是问题。

根据要求,这是我的培训代码:

注意dpindp.train_set是一个带有 attributes 的类train_set, valid_set, test_set,其中每个集合的创建方式如下:

根据要求,这是预测概率与真实标签的示例,您可以在其中看到模型似乎没有学习:

0 投票
0 回答
503 浏览

python - AttributeError:“NoneType”对象没有属性“_inbound_nodes”Keras


我正在尝试在我现有的 FaceNet 模型之上创建一个连体网络。我正在使用我的预训练模型创建特征向量。

Vector1 和 Vector2 是我提供给连体网络的特征向量。取它们之间的绝对差并将其馈送到 Dense 层。

定义模型时出现以下错误:

* Traceback(最近一次通话最后):文件“C:/Users/techolution/Desktop/Facenet/Create Vectors/Siamese Network - Test.py”,第 104 行,在

文件“C:\Users\techolution\Desktop\Facenet\Create Vectors\venv\lib\site-packages\keras\legacy\interfaces.py”,第 91 行,在包装返回 func(*args, **kwargs)

文件“C:\Users\techolution\Desktop\Facenet\Create Vectors\venv\lib\site-packages\keras\engine\network.py”,第 94 行,init self._init_graph_network(*args, **kwargs)

文件“C:\Users\techolution\Desktop\Facenet\Create Vectors\venv\lib\site-packages\keras\engine\network.py”,第 241 行,在 _init_graph_network self.inputs,self.outputs 中)

文件“C:\Users\techolution\Desktop\Facenet\Create Vectors\venv\lib\site-packages\keras\engine\network.py”,第 1434 行,在 _map_graph_network tensor_index=tensor_index)

文件“C:\Users\techolution\Desktop\Facenet\Create Vectors\venv\lib\site-packages\keras\engine\network.py”,第 1421 行,在 build_map 节点索引、张量索引中)

文件“C:\Users\techolution\Desktop\Facenet\Create Vectors\venv\lib\site-packages\keras\engine\network.py”,第 1421 行,在 build_map 节点索引、张量索引中)

文件“C:\Users\techolution\Desktop\Facenet\Create Vectors\venv\lib\site-packages\keras\engine\network.py”,第 1393 行,在 build_map node = layer._inbound_nodes[node_index]

AttributeError:“NoneType”对象没有属性“_inbound_nodes”*

0 投票
1 回答
144 浏览

tensorflow - 通过在完全成对比较中预先计算编码输出,加速比预期小

我正在构建一个神经网络来预测成对比较的结果。在合并和计算下游部分的结果之前,相同的编码器网络应用于两个输入。在我的用例中,我正在计算给定元素集的所有成对预测,因此预测的数量增长得非常快,因此我有兴趣加快预测过程。

天真地进行完整的成对预测涉及一遍又一遍地计算编码器网络在每个元素上的结果。由于编码器网络大于下游部分(合并+下游层),我认为在每个输入元素上预先计算编码器网络的结果,然后仅根据这些编码值计算下游将导致显着加速。然而,这并不是我在实践中发现的。对于下面在 Colab (CPU) 和我的机器 (CPU) 上的示例,我可以节省 10-15% 的运行时间,而如果您从层的角度考虑,我预计会节省 50%,如果您考虑到更多考虑参数。

我觉得我错过了一些东西,无论是在实现中还是 tensorflow/keras 已经做了某种魔法(缓存?)给定网络的结构,从而导致较小的收益?