使用模型权重和偏差手动执行预测(Keras)

piok6c0g  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(149)

我想使用Keras中的模型权重和偏置手动预测数据(回归任务)(即Z = f(WX+B),其中Z是层的输出,W是权重矩阵,X是输入向量,B是偏置向量)。
我的模型架构如下:

model = Sequential()
model.add(Dense(207, input_dim = 173, activation = 'relu'))
model.add(Dense(207, activation = 'relu'))
model.add(Dense(207, activation = 'relu'))
model.add(Dense(240))

字符串
我也完成了模型的训练。
我已经尝试使用以下方法提取权重和偏差:

layer_num = 1
layer_weights = model.layers[layer_num-1].get_weights()[0]
layer_biases  = model.layers[layer_num-1].get_weights()[1]


其中layer_num是层数(对于我的模型,layer_num从1到4)。然而,我不知道如何为我的测试集x_test手动执行Z = f(WX+B)。
使用这种手动方法,我想比较它的结果和model.predict,以及x_test的每个示例/行的预测计算时间(但我想我可以自己计算出最后一部分)。
编辑1:我提到我可以自己计算每个示例/行的计算时间,但如果您也能帮助我,我将非常感激。

bbmckpt7

bbmckpt71#

对于一个密集层,当你调用get_weights方法时,你会得到一个列表,它的第一个元素是权重矩阵W,第二个元素是偏置b

W, b = dense_layer.get_weights()

字符串
假设你有一个形状为[batch, 173]的测试数据矩阵X。然后你可以写一个如下的代码片段来获得所有的权重和偏置:

Ws, bs = [], []
for layer in model.layers:
    W, b = layer.get_weights()
    Ws.append(W)
    bs.append(b)


有了它们,我们可以定义我们的功能:

def relu(x):
    return np.where(x >= 0, x, 0)

def identity(x):
    return x

def predict(Ws, bs, activations, X):
    Z = X
    for W, b, activation in zip(Ws, bs, activations):
        Z = Z @ W + b
        Z = activation(Z)
    return Z


然后,您可以使用predict函数手动预测测试X

Y = predict(Ws, bs, (relu, relu, relu, identity), x_test)

相关问题