Python 比较两个深度学习框架的特征响应

Python 比较两个深度学习框架的特征响应,python,machine-learning,deep-learning,correlation,feature-extraction,Python,Machine Learning,Deep Learning,Correlation,Feature Extraction,我从两个独立的机器/深度学习框架中提取两个特性响应。我现在有两个矩阵,它们有NxF维,其中N是样本数,F是特征数。我想比较一下学习到的特征有多相似。我尝试过几种方法,但主要思想是使用相关性(Pearson和Spearman尝试过)将特征响应关联到FxF矩阵中。然后取一个轴上的绝对值max,然后计算这些max值的平均值。我实际上有几个框架,我想比较,但我得到了非常相似的结果。有人这样做过吗?还有谁有更好的建议吗?下面是我的代码示例 from scipy.stats import spearmanr

我从两个独立的机器/深度学习框架中提取两个特性响应。我现在有两个矩阵,它们有NxF维,其中N是样本数,F是特征数。我想比较一下学习到的特征有多相似。我尝试过几种方法,但主要思想是使用相关性(Pearson和Spearman尝试过)将特征响应关联到FxF矩阵中。然后取一个轴上的绝对值max,然后计算这些max值的平均值。我实际上有几个框架,我想比较,但我得到了非常相似的结果。有人这样做过吗?还有谁有更好的建议吗?下面是我的代码示例

from scipy.stats import spearmanr
import numpy as np

def similarity(resp1, resp2):
    rho, p = spearmanr(resp1,resp2)
    corr = rho[:resp1.shape[1],resp1.shape[1]:]
    sim_mtrx = np.abs(corr)
    feature_match = np.max(sim_mtrx,axis=1)
    return np.mean(feature_match)
有人这样做过吗?还有谁有更好的建议吗?下面是我的代码示例

from scipy.stats import spearmanr
import numpy as np

def similarity(resp1, resp2):
    rho, p = spearmanr(resp1,resp2)
    corr = rho[:resp1.shape[1],resp1.shape[1]:]
    sim_mtrx = np.abs(corr)
    feature_match = np.max(sim_mtrx,axis=1)
    return np.mean(feature_match)
老实说,这毫无意义。为什么?因为像深网这样的东西在功能上没有顺序。因此,你所做的比较不能用来得出任何合理的结论。你的矩阵
nxf
可能是你第一层的权重矩阵。因此,这些矩阵的每个(列)向量表示一个神经元。诀窍是一个网络(用一个框架训练)中的-
i
th神经元可以与另一个网络中的
i
th神经元无关,而它可能与
j
th相同。例如,考虑一个在“代码> f=3</代码>的图像上训练的网络,你会发现这些神经元学会检测水平(神经元1)、垂直(神经元2)线和一个圆(神经元3)。现在,您可以使用不同的框架,甚至使用相同但不同的随机种子进行再次训练。现在,即使第二个网络学习到完全相同的东西——检测水平线、垂直线和圆——但只是在不同的神经元(如水平2、垂直3、圆1)中,你的方法会声称这些是完全不同的模型,这显然是错误的。“相似表征”问题本身就是一个研究方向

在应用您提出的基本分析之前,您至少要找到两个网络中神经元之间的最佳匹配。您可以通过暴力强制(F^2可能的映射,只需使用声称最大相似性的映射)或使用类似匈牙利算法的方法来找到完美匹配

最重要的是保持参考比较,以避免上述问题,因此,与其为每个框架培训单个模型,不如为每个框架培训至少2个。现在,你不应该声称“方法A和B产生(dis)相似表示,因为A和B的单个实验产生的表示是(dis)相似的”,而应该检查两次运行(使用不同的种子)之间的(dis)相似性是否存在统计上的显著差异同一算法和两种不同算法的单次运行,换句话说:

  • 你有两个算法A,B(框架)
  • 创建表达A1、A2、B1、B2
  • 您测试平均值(sim(A1、A2)、sim(B1、B2))=平均值(sim(A1,B1),sim(A2,B2))(而之前您只是检查sim(A1,B1)是否“大”)
更新 为了说明所考虑的指标错误的原因,让我们将其用于:

>>> x
array([[0, 3, 6],
       [1, 4, 7],
       [2, 5, 8]])
>>> y
array([[ 6,  0,     0],
       [ 7, -1,  -123],
       [ 8,  0,  1000]])
>>> similarity(x,y)
1.0

你只需要一个匹配,你不在乎90%的数据是完全不同的-你仍然报告最大的相似性。

我确实简化了堆栈溢出的问题,但我确实有两个框架a和B。我用两组不同的数据对这些框架进行了训练,得到了A1、A2、B1和B2。我假设我能找到一个相似性度量,它给出了你上面描述的东西。我假设A1~A2和B1~B2。我上面提供的相似性度量对此有意义吗?过去,神经科学论文似乎使用1-线性(皮尔逊)相关性来表示差异性。正如我在答案的第一部分所说的——不,不是。这个度量不是置换不变的,您需要这个属性。另一方面,代码不执行相关性检查,它执行最大相关性检查(按特征)。因此,它在赋值时忽略了90%的数据。该示例有助于说明我的度量不正确的原因。我对“最佳匹配”引用感到困惑,因为我认为这就是我对max函数所做的。与其说我关心的是位置,不如说我关心的是我能找到彼此相似的功能响应。我试图在中重现类似于图9的内容。他们试图找出模型反应之间的不同之处。在我看来,他们正在使用简单的相关性来构建RDM。再说一次,这里提出的方法不适用于神经网络。找到最佳匹配(这意味着您要找到一个网络中的每个神经元,第二个网络中哪个神经元最相似,并计算这对神经元的相关性)。通过这种方式,你会得到一些相似性的概念(但是它仍然会产生错误的否定,因为在“人类”感官中有许多非常相似的过滤器/模型,它们没有很高的相关性。例如,如果这些是图像,你只需将所有内容转换一个像素,相关性将是随机的,但过滤器几乎相同。