Fai*_*Ice 5 python keras deeplearning4j keras-layer
我想提取 1d 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)
Run Code Online (Sandbox Code Playgroud)
现在,创建一个简单的一维 CNN 模型,如下所示:
model = Sequential()
model.add(Conv1D(n_filter,kernel_size,
input_shape=(len_timeseries,n_feature)))
model.compile(loss="mse",optimizer="adam")
Run Code Online (Sandbox Code Playgroud)
拟合模型并预测如下值X:
model.fit(X,y,nb_epoch=1)
y_pred = model.predict(X)
Run Code Online (Sandbox Code Playgroud)
的维度y_pred是(1000, 114, 64)应该的。
现在,我想重现y_pred[irow,0,ilayer]]使用存储在model.layer. 由于只有单层,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,)
Run Code Online (Sandbox Code Playgroud)
权重的长度为 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
Run Code Online (Sandbox Code Playgroud)
但是,此值与以下内容完全不同y_pred[irow,0,ifilter]:
y_pred[irow,0,ifilter]
>0.408206
Run Code Online (Sandbox Code Playgroud)
请让我知道我哪里出错了。
您误解了weights这里的属性。您正在寻找的是output图层的属性,它是由 给出的结果model.predict。这可以通过 获得layer.output。通常,aLayer被输入一个输入张量,并受到矩阵的作用,weights该矩阵取决于所使用的层的类型。此计算给出了您正在寻找的输出张量。
例如,考虑一个简单的密集层,其输入张量 A 形状为 (1,3),输出 sigmoid 层发射张量 B (1,1) 和权重矩阵 W。W 的形状根据输入和输出确定形状。因此,在这种情况下,密集层会执行A matmul W此操作,其结果将是预测 B。W 的形状将仅确定为 (3,1),这会导致输出形状为 (1,1)。所以你正在寻找的是B,但是你正在尝试访问W。