摘要:
记录了昇思MindSpore神经网络模型的定义构建、模型分层,以及获取模型参数的步骤方法。
一、神经网络模型概念
神经网络模型是由神经网络层和Tensor操作构成。
mindspore.nn实现了神经网络层。
mindspore.nn.Cell是构建神经网络的基类。
支持子Cell嵌套形成复杂的神经网络。
二、环境准备
安装minspore模块
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.3.0rc1
导入minspore、nn、ops等相关模块
import mindspore
from mindspore import nn, ops
三、定义模型类
继承nn.Cell类
__init__ 初始化方法实现子Cell实例化和状态管理
construct 构建方法实现Tensor操作
示例:Mnist数据集分类神经网络模型。
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 logitsmodel = Network()
print(model)
输出:
Network<(flatten): Flatten<>(dense_relu_sequential): SequentialCell<(0): Dense<input_channels=784, output_channels=512, has_bias=True>(1): ReLU<>(2): Dense<input_channels=512, output_channels=512, has_bias=True>(3): ReLU<>(4): Dense<input_channels=512, output_channels=10, has_bias=True>>>
构造输入数据,直接调用模型,获得一个十维的Tensor输出,包含每个类别的原始预测值。
【为什么?】model.construct()方法不可直接调用。
X = ops.ones((1, 28, 28), mindspore.float32)
logits = model(X)
# print logits
logits
输出:
Tensor(shape=[1, 10], dtype=Float32, value=
[[-6.12840615e-03, -9.06550791e-03, 7.44015072e-03 ... -1.21108280e-03, 8.75189435e-05, 1.14824511e-02]])
nn.Softmax()获得预测概率
pred_probab = nn.Softmax(axis=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")
输出:
Predicted class: [9]
四、模型层
神经网络模型层分解
构造3个28x28的随机图像,shape为(3, 28, 28)
input_image = ops.ones((3, 28, 28), mindspore.float32)
print(input_image.shape)
输出:
(3, 28, 28)
1. nn.Flatten
实例化nn.Flatten层,将28x28的2D张量转换为784大小的连续数组。
类似理解为将2维矩阵转换为1维数组。
flatten = nn.Flatten()
flat_image = flatten(input_image)
print(flat_image.shape)
输出:
(3, 784)
2. nn.Dense
nn.Dense为全连接层,使用权重和偏差对输入进行线性变换。
【猜测理解】排除噪声数据
layer1 = nn.Dense(in_channels=28*28, out_channels=20)
hidden1 = layer1(flat_image)
print(hidden1.shape)
输出:
(3, 20)
3. nn.ReLU
nn.ReLU层给网络中加入非线性的激活函数,帮助神经网络学习各种复杂的特征。
【猜测理解】提取特征模型
print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")
输出:
Before ReLU:
[[ 0.22167806 -0.6745967 -0.27886766 0.22455142 -0.23248096 -0.133361430.10336601 0.55169076 1.5191591 0.73823357 0.14714427 0.70888543-0.38694382 -0.49788377 0.06992912 0.1532075 -0.5910665 0.69121903-0.3803944 1.0794045 ][ 0.22167806 -0.6745967 -0.27886766 0.22455142 -0.23248096 -0.133361430.10336601 0.55169076 1.5191591 0.73823357 0.14714427 0.70888543-0.38694382 -0.49788377 0.06992912 0.1532075 -0.5910665 0.69121903-0.3803944 1.0794045 ][ 0.22167806 -0.6745967 -0.27886766 0.22455142 -0.23248096 -0.133361430.10336601 0.55169076 1.5191591 0.73823357 0.14714427 0.70888543-0.38694382 -0.49788377 0.06992912 0.1532075 -0.5910665 0.69121903-0.3803944 1.0794045 ]]After ReLU:
[[0.22167806 0. 0. 0.22455142 0. 0.0.10336601 0.55169076 1.5191591 0.73823357 0.14714427 0.708885430. 0. 0.06992912 0.1532075 0. 0.691219030. 1.0794045 ][0.22167806 0. 0. 0.22455142 0. 0.0.10336601 0.55169076 1.5191591 0.73823357 0.14714427 0.708885430. 0. 0.06992912 0.1532075 0. 0.691219030. 1.0794045 ][0.22167806 0. 0. 0.22455142 0. 0.0.10336601 0.55169076 1.5191591 0.73823357 0.14714427 0.708885430. 0. 0.06992912 0.1532075 0. 0.691219030. 1.0794045 ]]
4. nn.SequentialCell
nn.SequentialCell 顺序Cell容器
输入张量Tensor按照定义的顺序通过所有Cell
seq_modules = nn.SequentialCell(flatten,layer1,nn.ReLU(),nn.Dense(20, 10)
)logits = seq_modules(input_image)
print(logits.shape)
输出:
(3, 10)
5. nn.Softmax
最后使用nn.Softmax将神经网络最后一个全连接层返回的logits的值缩放为[0, 1],表示每个类别的预测概率。axis指定的维度数值和为1。
【猜测理解】nn.Softmax根据神经网络返回的特征解推出预测概率。
softmax = nn.Softmax(axis=1)
pred_probab = softmax(logits)
五、模型参数
包括网络内部神经网络层具有权重参数和偏置参数,nn.Dense等。
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")
输出:
Model structure: Network<(flatten): Flatten<>(dense_relu_sequential): SequentialCell<(0): Dense<input_channels=784, output_channels=512, has_bias=True>(1): ReLU<>(2): Dense<input_channels=512, output_channels=512, has_bias=True>(3): ReLU<>(4): Dense<input_channels=512, output_channels=10, has_bias=True>>>Layer: dense_relu_sequential.0.weight
Size: (512, 784)
Values :
[[-0.00240309 0.01673641 0.01800174 ... -0.00494339 0.00156037-0.01077523][ 0.01024065 0.00036838 0.01390939 ... -0.03533866 0.015644050.00675983]] Layer: dense_relu_sequential.0.bias
Size: (512,)
Values : [0. 0.] Layer: dense_relu_sequential.2.weight
Size: (512, 512)
Values :
[[ 0.01293653 -0.00968055 0.00156187 ... -0.00389436 0.00231833-0.00164853][ 0.01165598 0.00445346 -0.00812163 ... 0.00903445 -0.001936590.00366774]] Layer: dense_relu_sequential.2.bias
Size: (512,)
Values : [0. 0.] Layer: dense_relu_sequential.4.weight
Size: (10, 512)
Values :
[[ 5.1974057e-05 -1.5710767e-02 -1.3622168e-02 ... 8.3433613e-03-2.0038823e-02 2.4895865e-02][-1.8089322e-02 -1.6186651e-02 1.5664777e-02 ... -8.6768856e-034.5306431e-03 8.7257465e-03]] Layer: dense_relu_sequential.4.bias
Size: (10,)
Values : [0. 0.]