进阶第1章代码解读

目录

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

forward_net.py

代码

# coding: utf-8
import numpy as np


class 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.params
        out = np.dot(x, W) + b
        return out


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)

        # 生成层
        self.layers = [
            Affine(W1, b1),
            Sigmoid(),
            Affine(W2, b2)
        ]

        # 将所有的权重整理到列表中
        self.params = []
        for layer in self.layers:
            self.params += layer.params

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


x = 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.params
        out = np.dot(x, W) + b
        return 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.params
        out = np.dot(x, W) + b
        return 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’,表示代码已成功执行。

你可能感兴趣的:(自然语言处理,1024程序员节)