今天学习了初学入门,初学教程中的《网络构建》,这是一个重要内容。
笔记如下:
## 前面学习了数据类型,数据加载,现在进入到网络构建部分
## 神经网络模型: 神经网络层+Tensor操作。
## Cell类是所有网络的基类,即基本单元。注意,一个Net表示为一个Cell,且由不同的“子Cell”构成。
## 以Mnist Database为例,建一个分类神经网络模型
## 准备工作有:
"""
%%capture captured_output
# 实验环境已经预装了mindspore==2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14
"""
导入库
import mindspore
from mindspore import nn, ops
## 定义模型类
## 这个 Network 类定义了一个简单的 feed-forward 神经网络,
## 它接受一个形状为 [batch_size, 28, 28] 的输入(例如,手写数字图像),
## 然后通过一系列全连接层和ReLU激活函数,
## 最后输出一个形状为 [batch_size, 10] 的logits向量,用于10个类别的分类。
class Network(nn.Cell):
def __init__(self):
super().__init__()
self.flatten = nn.Flatten()
self.dense_relu_sequential = nn.SequentialCell(
nn.Dense(28*28, 512, weight_init="normal", bias_init="zeros"),
nn.ReLU(),
nn.Dense(512, 512, weight_init="normal", bias_init="zeros"),
nn.ReLU(),
nn.Dense(512, 10, weight_init="normal", bias_init="zeros")
)
def construct(self, x):
x = self.flatten(x)
logits = self.dense_relu_sequential(x)
return logits
## 构建完成,查看结构
model = Network()
print(model)
## MindSpore框架来创建一个全1的Tensor(张量)X,其形状为(1, 28, 28),数据类型为float32。
## 然后,您将这个张量作为输入传递给一个名为model的模型,并计算模型的输出logits。
然后预测一下:
X = ops.ones((1, 28, 28), mindspore.float32)
logits = model(X)
# print logits
logits
pred_probab = nn.Softmax(axis=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")
## 下面进入模型层: 分解每一层。观察效果
input_image = ops.ones((3, 28, 28), mindspore.float32)
print(input_image.shape)
## 实例化nn.Flatten层:将二维张量转为一维数组
flatten = nn.Flatten()
flat_image = flatten(input_image)
print(flat_image.shape)
# 接下来是全连接层nn.Dense: 用权重和偏差对输入进行线性变换
layer1 = nn.Dense(in_channels=28*28, out_channels=20)
hidden1 = layer1(flat_image)
print(hidden1.shape)
## 然后是nn.ReLu层: 加入非线性激活函数,帮助net学习复杂特征
print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")
## 然后是nn.SequentialCell: 输入的张量按照定义顺序通过所有Cell,
## 可以使用SequentialCell 构造一个net
seq_modules = nn.SequentialCell(
flatten,
layer1,
nn.ReLU(),
nn.Dense(20, 10)
)
logits = seq_modules(input_image)
print(logits.shape)
## 最后是使用nn.Softmax,作用是, 将net中最后一个全连接层返回的
## logits的值转为0到1的数,代表预测概率。
softmax = nn.Softmax(axis=1)
pred_probab = softmax(logits)
## Next,来到模型参数部分: 如网络层的“权重参数”,“偏执参数”
## 参数在训练中不断调整优化,可用model.parameters_and_names()获取参数名等
print(f"Model structure: {model}\n\n")
for name, param in model.parameters_and_names():
print(f"Layer: {name}\nSize: {param.shape}\nValues : {param[:2]} \n")
结果解释:
dense_relu_sequential.0.weight:这是一个大小为 (512, 784) 的权重矩阵,包含了 512 行和 784 列的数值,用于神经网络中该层的计算。
dense_relu_sequential.0.bias:大小为 (512,) 的偏置向量,每个元素的值均为 0,用于该层的计算。
dense_relu_sequential.2.weight:大小为 (512, 512) 的权重矩阵,用于该层的计算。
dense_relu_sequential.2.bias:大小为 (512,) 的偏置向量,值均为 0。
dense_relu_sequential.4.weight:大小为 (10, 512) 的权重矩阵,用于网络的计算。
dense_relu_sequential.4.bias:大小为 (10,) 的偏置向量,值均为 0。
学习时间:
代码的一些分布结果如图: