进阶第1章代码解读

编程入门 行业动态 更新时间:2024-10-19 21:27:25

<a href=https://www.elefans.com/category/jswz/34/1769503.html style=进阶第1章代码解读"/>

进阶第1章代码解读

目录

  • forward_net.py
    • 代码
    • 代码解读
    • debug 代码

forward_net.py

代码

# coding: utf-8
import numpy as npclass Sigmoid:def __init__(self):self.params = []def forward(self, x):return 1 / (1 + np.exp(-x))class Affine:def __init__(self, W, b):self.params = [W, b]def forward(self, x):W, b = self.paramsout = np.dot(x, W) + breturn outclass TwoLayerNet:def __init__(self, input_size, hidden_size, output_size):I, H, O = input_size, hidden_size, output_size# 初始化权重和偏置W1 = np.random.randn(I, H)b1 = np.random.randn(H)W2 = np.random.randn(H, O)b2 = np.random.randn(O)# 生成层self.layers = [Affine(W1, b1),Sigmoid(),Affine(W2, b2)]# 将所有的权重整理到列表中self.params = []for layer in self.layers:self.params += layer.paramsdef predict(self, x):for layer in self.layers:x = layer.forward(x)return xx = np.random.randn(10, 2)
model = TwoLayerNet(2, 4, 3)
s = model.predict(x)
print(s)

代码解读

这段代码定义了一个简单的两层神经网络。我们来逐步解释其内容:

  1. 导入 numpy 库并为其设置别名为 np
import numpy as np
  1. 定义一个名为 Sigmoid 的类,表示 Sigmoid 激活函数。这个类有一个方法 forward 用于计算 Sigmoid 函数的输出。
class Sigmoid:def __init__(self):self.params = []def forward(self, x):return 1 / (1 + np.exp(-x))
  1. 定义一个名为 Affine 的类,表示神经网络中的仿射层(或称为全连接层)。这个层在前向传播时执行一个矩阵乘法和加偏置的操作。
class Affine:def __init__(self, W, b):self.params = [W, b]def forward(self, x):W, b = self.paramsout = np.dot(x, W) + breturn out
  1. 定义一个名为 TwoLayerNet 的类,表示一个两层的神经网络。这个类在初始化时会设置网络的结构并随机初始化权重和偏置。它还有一个 predict 方法用于执行前向传播。
class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size):...# 生成层self.layers = [Affine(W1, b1),Sigmoid(),Affine(W2, b2)]...def predict(self, x):for layer in self.layers:x = layer.forward(x)return x
  1. 最后,这段代码生成了一个随机输入 x,并使用 TwoLayerNet 类创建了一个神经网络模型。它然后对输入 x 进行预测,并打印出预测结果。
x = np.random.randn(10, 2)
model = TwoLayerNet(2, 4, 3)
s = model.predict(x)
print(s)
print('ok')

简而言之,这段代码展示了如何使用 numpy 实现一个简单的两层神经网络,并对随机输入进行预测。

debug 代码

下面模拟代码执行并提供变量的值。模拟执行代码的关键部分并解释每一步。

首先,导入必要的库:

import numpy as np

这行代码导入了 NumPy 库,并为它设置了别名 np

接下来,定义 Sigmoid 类:

class Sigmoid:def __init__(self):self.params = []def forward(self, x):return 1 / (1 + np.exp(-x))

这个类定义了 Sigmoid 激活函数。初始化方法仅设置一个空的 params 列表,而 forward 方法则计算 Sigmoid 函数的输出。

紧接着,我们定义 Affine 类:

class Affine:def __init__(self, W, b):self.params = [W, b]def forward(self, x):W, b = self.paramsout = np.dot(x, W) + breturn out

这个类表示一个仿射层。初始化方法接收权重 W 和偏置 b,并将它们存储在 params 列表中。forward 方法执行矩阵乘法并加上偏置。

接下来,我们定义 TwoLayerNet 类:

class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size):I, H, O = input_size, hidden_size, output_size# 初始化权重和偏置W1 = np.random.randn(I, H)b1 = np.random.randn(H)W2 = np.random.randn(H, O)b2 = np.random.randn(O)

这段代码定义了类的初始化方法,它接收输入层、隐藏层和输出层的大小,并随机初始化权重和偏置。例如,如果输入大小为2,隐藏层大小为4,输出大小为3,我们得到以下值(注意,由于随机初始化,值可能会有所不同):

I = 2, H = 4, O = 3
W1 = [[random_value1, random_value2, random_value3, random_value4],[random_value5, random_value6, random_value7, random_value8]]
b1 = [random_value9, random_value10, random_value11, random_value12]
W2 = [[random_value13, random_value14, random_value15],[random_value16, random_value17, random_value18],[random_value19, random_value20, random_value21],[random_value22, random_value23, random_value24]]
b2 = [random_value25, random_value26, random_value27]

然后,代码创建了神经网络的各个层并将它们添加到 self.layers 列表中:

self.layers = [Affine(W1, b1),Sigmoid(),Affine(W2, b2)
]

接着,代码将所有层的 params 列表整合到一个列表中:

self.params = []
for layer in self.layers:self.params += layer.params

这会生成一个列表,其中包含所有权重和偏置。

最后,TwoLayerNet 类定义了一个 predict 方法,该方法用于执行前向传播:

def predict(self, x):for layer in self.layers:x = layer.forward(x)return x

接下来,模拟代码生成了一个随机输入 x 并创建了神经网络模型:

x = np.random.randn(10, 2)
model = TwoLayerNet(2, 4, 3)

这将创建一个具有10个样本和2个特征的随机输入矩阵 x,并使用 TwoLayerNet 类创建了一个神经网络模型。

最后,模型对输入 x 进行预测,并打印出结果:

s = model.predict(x)
print(s)

这将输出预测结果。

最后一行:

print('ok')

简单地打印出 ‘ok’,表示代码已成功执行。

更多推荐

进阶第1章代码解读

本文发布于:2023-12-03 11:15:27,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1654749.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:进阶   代码

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!