Python 用于特征相似性的暹罗网络

Python 用于特征相似性的暹罗网络,python,tensorflow,similarity,siamese-network,Python,Tensorflow,Similarity,Siamese Network,我有大约20k不同领域的图像,其中的特征已经使用GLCM和HOG提取。每个图像的特征尺寸约为2000。我想用暹罗网络找出特征之间的相似性。我把所有的都存储在一个数据框中。我不确定我们怎样才能给神经网络输入特征。 只有一种可能使用1DCNN/致密层 encoder = models.Sequential(name='encoder') encoder.add(layer=layers.Dense(units=1024, activation=activations.relu, input_shap

我有大约20k不同领域的图像,其中的特征已经使用GLCM和HOG提取。每个图像的特征尺寸约为2000。我想用暹罗网络找出特征之间的相似性。我把所有的都存储在一个数据框中。我不确定我们怎样才能给神经网络输入特征。 只有一种可能使用1DCNN/致密层

encoder = models.Sequential(name='encoder')
encoder.add(layer=layers.Dense(units=1024, activation=activations.relu, input_shape=[n_features]))
encoder.add(layers.Dropout(0.1))
encoder.add(layer=layers.Dense(units=512, activation=activations.relu))
encoder.add(layers.Dropout(0.1))
encoder.add(layer=layers.Dense(units=256, activation=activations.relu))
encoder.add(layers.Dropout(0.1))
在上面的代码中,我们只提供了一些特性作为编码器的输入,但我的两幅图像的特性数量是相同的。 我是否应该分别训练两个编码器,并在最后连接它们以形成嵌入层?
但是我应该如何测试呢?

对于暹罗网络,您可能希望有一个网络,并在不同的数据集上对其进行训练

假设有两组形状相同的数据
X0
X1

来自tensorflow.keras导入模型的

从tensorflow.keras导入图层
从tensorflow.python.keras.utils导入损失\u utils
#功能数量
n_特征=2000
#假数据,批量大小为4
X0=tf.random.normal([4,n_特征])
X1=tf.随机.正常([4,n_特征])
#暹罗编码器模型
编码器=型号。顺序(name='encoder')
编码器.添加(层=层.密度)(
单位=1024,激活=“relu”,输入形状=[n\u特征])
编码器。添加(层。退出(0.1))
编码器.add(layer=layers.Dense(units=512,activation=“relu”))
编码器。添加(层。退出(0.1))
编码器.add(layer=layers.Dense(units=256,activation=“relu”))
编码器。添加(层。退出(0.1))
#通过同一模型发送两组数据
enc0=编码器(X0)
enc1=编码器(X1)
#比较两个输出
比较=tf.keras.loss.cosinessility(
减少=损失_utils.减少v2.无)(附件0,附件1)
打印(f“输出的余弦相似性:{compared.numpy()}”)
#输出的余弦相似性:[-0.5785658,-0.6405066,-0.57274437,-0.6017716]
#现在做优化。。。

有很多方法可以比较输出,余弦相似性就是其中之一,但我只是为了举例说明,您可能需要一些其他指标。

对于暹罗网络,您希望有一个网络,并在不同的数据集上对其进行训练

假设有两组形状相同的数据
X0
X1

来自tensorflow.keras导入模型的

从tensorflow.keras导入图层
从tensorflow.python.keras.utils导入损失\u utils
#功能数量
n_特征=2000
#假数据,批量大小为4
X0=tf.random.normal([4,n_特征])
X1=tf.随机.正常([4,n_特征])
#暹罗编码器模型
编码器=型号。顺序(name='encoder')
编码器.添加(层=层.密度)(
单位=1024,激活=“relu”,输入形状=[n\u特征])
编码器。添加(层。退出(0.1))
编码器.add(layer=layers.Dense(units=512,activation=“relu”))
编码器。添加(层。退出(0.1))
编码器.add(layer=layers.Dense(units=256,activation=“relu”))
编码器。添加(层。退出(0.1))
#通过同一模型发送两组数据
enc0=编码器(X0)
enc1=编码器(X1)
#比较两个输出
比较=tf.keras.loss.cosinessility(
减少=损失_utils.减少v2.无)(附件0,附件1)
打印(f“输出的余弦相似性:{compared.numpy()}”)
#输出的余弦相似性:[-0.5785658,-0.6405066,-0.57274437,-0.6017716]
#现在做优化。。。

有很多方法可以比较输出,余弦相似性就是其中之一,但我只是为了举例说明,您可能需要一些其他指标。

只有一个网络刚刚复制。所有权重都是共享的。因此,您正在训练一个网络,只需在学习的每个步骤中运行两次即可。 您应该从数据集中选取两个样本,如果来自同一个类,则将其标记为1,否则标记为0

来自tensorflow.keras导入模型的

从tensorflow.keras导入图层
将tensorflow.keras.backend作为K导入
n_特征=2000
定义cos_相似性(x):
x1,x2=x
返回K.sum(x1*x2)/(K.sqrt(K.sum(x1*x1))*K.sqrt(K.sum(x2*x2)))
inp1=层。输入(形状=(n_特征))
inp2=层。输入(形状=(n_特征))
编码器=型号。顺序(name='encoder')
编码器.添加(层=层.密度)(
单位=1024,激活=“relu”,输入形状=[n\u特征])
编码器。添加(层。退出(0.1))
编码器.add(layer=layers.Dense(units=512,activation=“relu”))
编码器。添加(层。退出(0.1))
编码器.add(layer=layers.Dense(units=256,activation=“relu”))
编码器。添加(层。退出(0.1))
out1=编码器(inp1)
out2=编码器(inp2)
相似性=层。Lambda(cos_相似性)([out1,out2])
模型=模型。模型(输入=[inp1,inp2],输出=[similarity])
compile(优化器='adam',loss='mse')
对于测试,首先你应该计算HOG特性,你说它有2000个特性。然后跑

model.predict(hog_特性)
你有输出功能。
顺便说一下,我建议不要使用hog功能和暹罗网络。仅使用此网络提取图像特征。更改输入形状并使用图像进行训练。

只有一个网络刚刚复制。所有权重都是共享的。因此,您正在训练一个网络,只需在学习的每个步骤中运行两次即可。 您应该从数据集中选取两个样本,如果来自同一个类,则将其标记为1,否则标记为0

来自tensorflow.keras导入模型的

从tensorflow.keras导入图层
将tensorflow.keras.backend作为K导入
n_特征=2000
定义cos_相似性(x):
x1,x2=x
返回K.sum(x1*x2)/(K.sqrt(K.sum(x1*x1))*K.sqrt(K.sum(x2*x2)))
inp1=层。输入(形状=(n_特征))
inp2=层。输入(形状=(n_特征))
编码器=型号。顺序(name='encoder')
编码器.添加(层=层.密度)(
单位=1024,激活=“relu”,输入形状=[n\u特征])
编码器。添加(层。退出(0.1))
编码器.add(layer=layers.Dense(units=512,activation=“relu”))
编码器。添加(层。退出(0.1))
编码器.add(layer=layers.Dense(units=256,activation=“relu”))
编码器。添加(层。退出(0.1))
out1=编码器(inp1)
欧点