Keras中计算VGG-16模型权重Pearson相关系数报错问题排查
问题分析与解决方案
你的处理方法存在几个关键问题,直接导致了报错,具体如下:
错误原因
权重维度处理错误
你用array([model1.get_weights()[layer1]])将权重包装成了二维数组(比如原权重是(3,3,3,64),处理后变成(1,3,3,3,64)),但scipy.stats.pearsonr要求输入是一维数组,且长度至少为2。这种二维输入会被pearsonr识别为长度为1的序列,触发x and y must have length at least 2的错误。循环逻辑错误
你的循环只是不断覆盖layer_weights1和layer_weights2变量,最终只保留了两个模型的最后一层权重,没有实现“每层权重分别计算相关系数”的目标。未对应层匹配计算
两个VGG16模型的层数完全一致,应该对同一层的权重进行相关系数计算,而不是分别遍历两个模型的所有层后只取最后一层。
正确处理方法
验证权重线性关系的核心是:对两个模型的每一层权重,分别展平为一维数组后计算Pearson相关系数。对于相同预训练权重的模型,每层的相关系数都应该是1.0。
修正后的代码
import tensorflow as tf from tensorflow.keras import applications from scipy.stats import pearsonr import numpy as np model_input = (224,224,3) # 加载两个相同预训练权重的VGG16 model1 = applications.VGG16(include_top=False, weights='imagenet', input_shape=model_input) model2 = applications.VGG16(include_top=False, weights='imagenet', input_shape=model_input) # 遍历每一层对应的权重 for idx, (weights1, weights2) in enumerate(zip(model1.get_weights(), model2.get_weights())): # 将多维权重展平为一维数组 flat_w1 = weights1.flatten() flat_w2 = weights2.flatten() # 计算Pearson相关系数 corr, p_value = pearsonr(flat_w1, flat_w2) print(f"第{idx+1}层权重的Pearson相关系数: {corr:.3f},p值: {p_value:.3f}")
关键修正点
- 使用
zip(model1.get_weights(), model2.get_weights())同时遍历两个模型的对应层权重,保证层的匹配。 - 用
flatten()将多维权重数组转换为一维,满足pearsonr的输入要求。 - 对每一层单独计算并输出结果,符合你验证每层权重线性关系的需求。
运行修正后的代码,所有层的相关系数都会是1.0,因为两个模型的权重完全一致,验证方法的可行性。后续替换为不同超参数训练后的模型,即可得到对应层权重的线性相关程度。
内容的提问来源于stack exchange,提问作者shiva
相关产品推荐
相关产品推荐

