【问题标题】:keras: extracting weights using get_weights functionkeras:使用 get_weights 函数提取权重
【发布时间】:2017-12-18 23:59:34
【问题描述】:

我想提取一维 CNN 层的权重,并了解如何准确计算预测值。我无法使用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

请告诉我哪里出错了。

【问题讨论】:

    标签: python keras keras-layer deeplearning4j


    【解决方案1】:

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

    例如考虑一个简单的 Dense 层,输入张量 A 的形状为 (1,3),输出 sigmoid 层发出张量 B (1,1) 和权重矩阵 W。W 的形状是根据输入和输出形状。因此,在这种情况下,密集层会执行A matmul W,其结果将是预测 B。W 的形状将仅确定为 (3,1),这可能导致输出形状为 (1,1)。因此,您正在寻找的是 B,但是您正在尝试访问 W。

    【讨论】:

    • 请问您在示例中如何定义“B”?
    • 你说得对,我想要“B”(结果由 model.predict 给出)。但为此我可以简单地使用model.predict。我想要“B”的原因是要了解如何将权重与输入张量“X”一起使用来计算“B”。似乎我使用权重计算 B 的方式是错误的,因为它不同意 model.predict 的输出。
    猜你喜欢
    • 2019-02-02
    • 2018-03-30
    • 2018-08-14
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2020-04-01
    • 2020-10-20
    相关资源
    最近更新 更多