首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras中的神经网络公式

Keras中的神经网络公式
EN

Stack Overflow用户
提问于 2021-07-17 07:47:11
回答 1查看 169关注 0票数 0

我正在学习Keras中的神经网络公式。假设我有一个单层神经网络和特定的权重。(我知道我们在实践中随机地给出了权重。)见下图。

根据我学到的公式,损失是(7-8)^2+(16-9)^2/2=25。然而,真正的结果是15. 1/1 [==============================] - 0s 202ms/step - loss: 15.0000参见下面的代码。

代码语言:javascript
复制
from tensorflow.keras import models
from tensorflow.keras import layers
from tensorflow.keras import initializers

import numpy as np

model = models.Sequential()

model.add(layers.Dense(units=2, 
                       activation=None,
                       kernel_initializer=initializers.constant(np.array([3,5])),
                       bias_initializer=initializers.constant(np.array([4,6])),
                      )
         )

model.compile(optimizer='sgd',
              loss='mse',
             )

x = np.array([
              [1],
              [2]
             ])

y = np.array([
              [8],
              [9]
             ])

model.fit(x, y, epochs=1)
model.layers[0].weights

我误解了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-21 13:16:16

这在某种程度上很难解释,因为您的体系结构是不正确的。

让我们一步一步地走:

  1. ,你定义了单层作为输入和输出,有两个神经元。因此,您的模型将为每个输入预测2个值。

代码语言:javascript
复制
>>> model.predict([1])
    array([[ 7., 11.]], dtype=float32) #for input 1, model gives 2 output: 7 and 11
>>> model.predict([2])
    array([[ 10., 16.]], dtype=float32) #for input 2, model gives 2 output: 10 and 16

现在,让我们探讨一下上面的输出是如何计算出来的。您已经设置了2个权重3,5和2个偏差: 4,6。

  1. ,现在,让我们计算损失。重点是,你的模型,每个输入输出,2个输出。因此,您应该提供4个值作为y_true,但是您提供了2个值[8,9]作为基本真值。无论如何,您提供两个输入:[1,2]到您的模型。模型输出4个值:[[7,11][10,16]]model.evaluate输出15.0作为损失:

代码语言:javascript
复制
>>> x, y = np.array([[1],[2]]), np.array([[8],[9]])
>>> model.evaluate(x,y, verbose=2)
    1/1 - 0s - loss: 15.0000

让我们看看它是如何计算的。在前面的计算中,您看到了y_pred是:[[7,11][10,16]],您将y_true指定为[[8][9]]。如果我们用y_truey_pred计算mse的损失

代码语言:javascript
复制
>>> print(tf.keras.losses.mse([[8],[9]], [[[ 7., 11.]], [[10. ,16.]]]).numpy())
    [[ 5.  4.]
     [34. 25.]]

现在,我们有4个值作为损失,2个值用于第一个输入,2个值用于第二个输入。由于计算函数期望每个输入有一个损失,它将第一行的第一个值作为第一个输入的损失值:在[5.,4.]中选择[5.,4.]中的25.作为1的损失,在第二行中为第二个输入选择第二个值:选择25.作为2的损失。现在,如果我们把它们加起来,得到平均值:(25+5)/2=15.0,结果是15。

这种复杂性是由于定义架构和不正确地传递值造成的。

您可以生成更多的示例并比较它们,例如feed 2示例12作为输入,并将y_true定义为[6,7]

代码语言:javascript
复制
print("y_true: ", "[[ 6. 7. ]]")
print("y_pred: ", model.predict([1]))
print("loss:   ", tf.keras.losses.mse([[6.],[7.]], [model.predict([1])]).numpy())
print()
print("y_true: ", "[[ 6. 7. ]]")
print("y_pred: ", model.predict([2]))
print("loss:   ", tf.keras.losses.mse([[6.],[7.]], [model.predict([2])]).numpy())
x = np.array([[1],[2]])
y = np.array([[6],[7]])
model.evaluate(x,y,verbose=2)
print(tf.reduce_mean(tf.keras.losses.mse([[6],[7]], [model.predict([1]), model.predict([2])])).numpy())

产出如下:

代码语言:javascript
复制
y_true:  [[ 6. 7. ]]
y_pred:  [[ 7. 11.]]
loss:    [[13.  8.]]

y_true:  [[ 6. 7. ]]
y_pred:  [[10. 16.]]
loss:    [[58. 45.]]
1/1 - 0s - loss: 29.0  #(45+13)/2      = 29.0  what model.evaluate() compute
                 31.0  #(58+45+13+8)/4 = 31.0  what probably you expect
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68418501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档