# 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)
这段代码定义了一个简单的两层神经网络。我们来逐步解释其内容:
numpy
库并为其设置别名为 np
:import numpy as np
Sigmoid
的类,表示 Sigmoid 激活函数。这个类有一个方法 forward
用于计算 Sigmoid 函数的输出。class Sigmoid:
def __init__(self):
self.params = []
def forward(self, x):
return 1 / (1 + np.exp(-x))
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
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
x
,并使用 TwoLayerNet
类创建了一个神经网络模型。它然后对输入 x
进行预测,并打印出预测结果。x = np.random.randn(10, 2)
model = TwoLayerNet(2, 4, 3)
s = model.predict(x)
print(s)
print('ok')
简而言之,这段代码展示了如何使用 numpy 实现一个简单的两层神经网络,并对随机输入进行预测。
下面模拟代码执行并提供变量的值。模拟执行代码的关键部分并解释每一步。
首先,导入必要的库:
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’,表示代码已成功执行。