python - 如何根据权重/偏差重现 Keras 模型?

标签 python tensorflow machine-learning keras

我想使用 Keras ML 模型的权重和偏差在另一个未安装(也不能)安装 Keras 的程序中创建数学预测函数。

我有一个简单的 MLP 模型,用于拟合数据。我在 Python 中运行 Keras 和 TensorFlow 后端;现在,我使用一个输入层、1 个隐藏层和 1 个输出层。所有层都是RELU,我的优化器是adam,损失函数是mean_squared_error。

据我了解,我获得的各层的权重应该以数学形式使用:

(SUM (w*i)) + b

其中总和是所有权重和输入的总和,b 是神经元的偏差。例如,假设我有一个形状为 (33, 64) 的输入层。有 33 个输入,64 个神经元。我将有一个暗淡 33 的向量输入和一个暗淡 64 的向量输出。这将使每个 SUM 33 项 * 33 权重,并且输出将是所有 64 个 SUM 加上 64 个偏差(分别)。

下一层(在我的例子中是 32 个神经元)将执行相同的操作,但具有 64 个输入和 32 个输出。我的输出层变为单个值,因此输入 32 和输出 1。

我已经编写了代码来尝试模仿该模型。以下是用于进行单个预测的片段:

    def modelR(weights, biases, data):
       # This is the input layer.
       y = []
       for i in range(len(weights[0][0])):
           x = np.zeros(len(weights[0][0]))
           for j in range(len(data)):
               x[i] += weights[0][j][i]*data[j]
           y.append(x[i]+biases[0][i])

       # This is the hidden layer.
       z = []
       for i in range(len(weights[1][0])):
           x = np.zeros(len(weights[1][0]))
           for j in range(len(y)):
               x[i] += weights[1][j][i]*y[j]
           z.append(x[i]+biases[1][i])

       # This is the output layer.
       p = 0.0
       for i in range(len(z)):
           p += weights[-1][i][0]*z[i]
       p = p+biases[-1][0]

       return p

需要明确的是,“权重”和“偏差是通过以下方式得出的:

    weights = []
    biases = []
    for i in range(len(model.layers)):
       weights.append(model.layers[i].get_weights()[0])
       biases.append(model.layers[i].get_weights()[1])

    weights = np.asarray(weights)
    biases = np.asarray(biases)

因此第一个输入的第一个神经元的第一个权重是权重[0][0][0],第二个神经元的第一个输入的第一个权重是权重[0][1][0],我可能在这方面是错的,这可能是我陷入困境的地方。但这是有道理的,因为我们从 (1 x 33) 向量到 (1 x 64) 向量,所以我们应该有一个 (33 x 64) 矩阵。

你知道我哪里出错了吗?谢谢!

编辑:找到答案 我将 jhso 的答案标记为正确,即使它在我的代码中无法正常工作(我可能在某处缺少 import 语句)。关键是激活函数。我使用的是 RELU,所以我不应该传递任何负值。另外,jhso 展示了一种不使用循环而是简单地进行矩阵乘法的好方法(我不知道 Python 会这样做)。现在我只需要弄清楚如何在 C++ 中做到这一点!

最佳答案

我认为在使用机器学习时熟悉线性代数是有好处的。当我们有一个 sum(matrix elem times another matrix elem) 形式的方程时,它通常是一个 matrix1 * matrix2.T 形式的简单矩阵乘法。这大大简化了您的代码:

def modelR(weights, biases, data):
   # This is the input layer.
   y = np.matmul(data,weights[0])+biases[0][None,:] 
   y_act = relu(y) #also dropout or any other function you use here
   z = np.matmul(y_act,weights[1])+biases[1][None,:]
   z_act = relu(z) #also dropout and any other function you use here
   p = np.matmul(z_act,weights[2])+biases[2][None,:]
   p_act = sigmoid(p)   
   return p_act

我猜测了您使用的激活函数。我也不确定你的数据是如何构造的,只需确保特征/权重始终是乘法的内部维度,即。如果您的输入是 (Bx10) 并且权重是 (10x64),那么 input*weights 就足够了,并且会产生形状 (Bx64) 的输出。

关于python - 如何根据权重/偏差重现 Keras 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58983045/

相关文章:

python - TensorFlow:如何使用 'tf.data' 而不是 'load_csv_without_header'?

session - tensorflow session 实际上是什么?

machine-learning - 为什么手写数字分类没有明确的顺序?

python - 一个简单的 Python SWIG 错误问题

Python Txt 文件替换 - 'str' 对象不支持项目分配

python - 如何在 Python/Flask 中使用 stripe webhook 识别客户

python - 打字,自定义集合类型

machine-learning - 简单来说什么是损失函数?

r - 通过sample()进行数据洗牌将测试集中的RMSE降低到比训练集中更低的值

machine-learning - softmax 和 log-softmax 有什么区别?