Keras提取权重使用get_weights功能

2024-06-10 07:03:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想提取1dcnn层的权重,并了解如何准确计算预测值。我无法使用get_weights()函数的权重重新生成预测值。

为了解释我的理解,这里有一个小数据集。

n_filter = 64
kernel_size = 10
len_timeseries = 123
n_feature = 3
X = np.random.random(sample_size*len_timeseries*n_feature).reshape(sample_size,len_timeseries,n_feature)
y = np.random.random(sample_size*(len_timeseries-kernel_size+1)*n_filter).reshape(sample_size,
                                                                                  (len_timeseries-kernel_size+1),
                                                                                  n_filter)

现在,创建一个简单的1d CNN模型:

model = Sequential()
model.add(Conv1D(n_filter,kernel_size,
                 input_shape=(len_timeseries,n_feature)))
model.compile(loss="mse",optimizer="adam")

拟合模型并将X的值预测为:

model.fit(X,y,nb_epoch=1)
y_pred = model.predict(X)

y_pred的维数应该是(1000, 114, 64)

现在,我想使用存储在model.layer中的权重重新生成y_pred[irow,0,ilayer]]的值。因为只有单层,len(model.layer)=1。因此,我从第一层和唯一一层提取权重:

weight = model.layers[0].get_weights()
print(len(weight))
> 2 
weight0 = np.array(weight[0])
print(weight0.shape)
> (10, 1, 3, 64)
weight1 = np.array(weight[1])
print(weight1.shape)
> (64,)

权重的长度为2,我假设第0个位置包含特征的权重,第1个位置包含偏移。 作为weight0.shape=(kernel_size,1,n_feature,n_filter),我认为可以通过以下方法获得y_pred[irow,0,ilayer]的值:

ifilter = 0
irow = 0
y_pred_by_hand = weight1[ifilter] + np.sum( weight0[:,0,:,ifilter] * X[irow,:kernel_size,:])
y_pred_by_hand
> 0.5124888777

但是,这个值与y_pred[irow,0,ifilter]完全不同,因为:

 y_pred[irow,0,ifilter]
 >0.408206

请告诉我哪里做错了。


Tags: samplesizemodellennprandomfilterkernel
1条回答
网友
1楼 · 发布于 2024-06-10 07:03:06

您误解了这里的weights属性。您要查找的是层的output属性,它是由model.predict给出的结果。这可以通过layer.output获得。通常,Layer由输入张量馈送,并由weights矩阵作用,该矩阵取决于所使用的层的类型。这个计算给出了一个输出张量,这正是您要寻找的。

例如,考虑具有形状(1,3)的输入张量a的简单致密层、发射张量B(1,1)的输出sigmoid层和权重矩阵W。W的形状基于输入和输出形状确定。因此,在这种情况下,致密层会A matmul W,其结果将是预测B.W的形状将被确定为(3,1),只有这样才能得到(1,1)的输出形状。所以你要找的是B,不管你想访问W

相关问题 更多 >