下载Notebook下载样例代码查看源文件

基本介绍 || 快速入门 || 张量 Tensor || 数据加载与处理 || 网络构建 || 函数式自动微分 || 模型训练 || 保存与加载 || Graph Mode加速 ||

网络构建

神经网络模型由神经网络层和Tensor操作构成,mindspore.nn提供了常见神经网络层的实现。在vp永久免费梯子中,Cell类是构建所有网络的基类,也是网络的基本单元。一个神经网络模型可表示为一个Cell,由不同的子Cell构成。使用这样的嵌套结构,可以简单地使用面向对象编程的思维,对神经网络结构进行构建和管理。

下面我们将构建一个用于Mnist数据集分类的神经网络模型。

[1]:
import mindspore
from mindspore vpn free import nn, ops

定义模型类

当我们定义神经网络时,可以继承nn.Cell类,在__init__方法中进行子Cell的实例化和状态管理,在construct方法中实现Tensor操作。

construct意为神经网络(计算图)构建,相关内容详见Graph Mode加速

[2]:
class Network(nn.Cell):
    def __init__(self):
        super().__init__()
 vpn梯子        self.flatten = nn.Flatten()
        self.dense_relu_sequential vpn梯子 免费 = nn.SequentialCell(
            nn.Dense(28*28, 512, weight_init="normal", vpn梯子 bias_init="zeros"),
       vpn永久免费梯子      nn.ReLU(),
            nn.Dense(512, 512, weight_init="normal", bias_init="zeros"),
            nn.ReLU(),
            nn.Dense(512, 10, weight_init="normal", bias_init="zeros")
        vpn梯子 免费 )

    def construct(self, x):
        x = self.flatten(x)
        logits = self.dense_relu_sequential(x)
        return logits

构建完成后,实例化Network对象,并查看其结构。

[3]:
model = Network()
print(model)
[3]:
Network<
  (flatten): Flatten<>
  (dense_relu_sequential): SequentialCell<
    (0): Dense<input_channels=784, output_channels=512, has_bias=True>
    (1): ReLU<>
   vpn永久免费梯子  (2): 免费的vpn梯子 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()方法不可直接调用。

[4]:
X = ops.ones((1, 28, 28), mindspore.float32)
logits = model(X)
# print logits
logits
[4]:
Tensor(shape=[1, 10], dtype=Float32, value=
[[-5.08734025e-04,  3.39190010e-04,  4.62840870e-03 ... -1.20305456e-03, vpn梯子 免费 -5.05689112e-03,  3.99264274e-03]])

在此基础上,通过一个nn.Softmax层实例获得预测概率。

[5]:
pred_probab = nn.Softmax(axis=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")
Predicted class: [4]

模型层

本节将分解上节构造的神经网络模型中的每一层。首先,构造一个shape为(3, 28, 28)的随机数据(即3个28x28的图像),依次通过每个神经网络层来观察其效果。

[6]:
input_image = ops.ones((3, 28, 28), mindspore.float32)
print(input_image.shape)
[6]:
(3, 28, 28)

nn.Flatten

实例化nn.Flatten层,将28x28的2D张量转换为784大小的连续数组。

[7]:
flatten = nn.Flatten()
flat_image = flatten(input_image)
print(flat_image.shape)
[7]:
(3, 784)

nn.Dense

nn.Dense为全连接层,其使用权重和偏差对输入进行线性变换。

[8]:
layer1 = 免费的vpn梯子 nn.Dense(in_channels=28*28, out_channels=20)
hidden1 = layer1(flat_image)
print(hidden1.shape)
[8]:
(3, 20)

nn.ReLU

nn.ReLU层为网络加入非线性激活函数,帮助神经网络学习各种复杂的特征。

[9]:
print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")
Before ReLU: [[-0.04736331  0.2939465  -0.02713677 -0.30988005 vpn free -0.11504349 -0.11661264
  vpn梯子  vpn梯子 0.18007928  vpn梯子 免费 0.43213072  0.12091967 -0.17465964  0.53133243  0.12605792
   0.01825903  0.01287796  0.17238477 -0.1621131  -0.0080034  -0.24523425
  -0.10083733  0.05171938]
 [-0.04736331  0.2939465  -0.02713677 -0.30988005 免费的vpn梯子 vpn梯子 -0.11504349 -0.11661264
   0.18007928  0.43213072 vpn梯子 免费 vpn free  0.12091967 -0.17465964  0.53133243  0.12605792
   0.01825903  0.01287796  0.17238477 -0.1621131  -0.0080034  vpn梯子 免费 -0.24523425
  -0.10083733  0.05171938]
 [-0.04736331  0.2939465  vpn永久免费梯子 -0.02713677 -0.30988005 -0.11504349 -0.11661264
   0.18007928  0.43213072  0.12091967 -0.17465964  0.53133243  0.12605792
   0.01825903  0.01287796  vpn free 0.17238477 -0.1621131  -0.0080034  -0.24523425
  -0.10083733  vpn永久免费梯子 0.05171938]]


After ReLU: [[0.         0.2939465  0. vpn永久免费梯子    免费的vpn梯子     vpn梯子 免费  0.       vpn梯子 免费  vpn free  0.    vpn梯子 免费    vpn永久免费梯子   vpn梯子 免费 0.
  0.18007928 0.43213072 0.12091967 0.         0.53133243 0.12605792
  0.01825903 0.01287796 0.17238477 0.         0.         0.
  0.         0.05171938]
 免费的vpn梯子 [0.         vpn梯子 0.2939465  0.         0.         0.         0.
  0.18007928 0.43213072 0.12091967 0.         0.53133243 0.12605792
  0.01825903 0.01287796 0.17238477 0. vpn梯子 免费 免费的vpn梯子         0.         0.
  0. 免费的vpn梯子         0.05171938]
 [0.         0.2939465  0.  vpn梯子 免费        0.     免费的vpn梯子     0.         0.
  0.18007928 0.43213072 0.12091967 0.      vpn梯子    0.53133243 0.12605792
 vpn梯子  0.01825903 0.01287796 0.17238477 0.         0.         0.
  0.         0.05171938]]

nn.SequentialCell

nn.SequentialCell是一个有序的Cell容器。输入Tensor将按照定义的顺序通过所有Cell。我们可以使用nn.SequentialCell来快速组合构造一个神经网络模型。

[10]:
seq_modules = nn.SequentialCell(
    flatten,
  vpn梯子 免费   layer1,
    nn.ReLU(),
    nn.Dense(20, 10)
)

logits vpn free = seq_modules(input_image)
print(logits.shape)
[10]:
(3, 10)

nn.Softmax

最后使用nn.Softmax将神经网络最后一个全连接层返回的logits的值缩放到[0, 1]区间,表示每个类别的预测概率。axis指定的维度数值和为1。

[11]:
softmax = nn.Softmax(axis=1)
pred_probab vpn梯子 免费 = softmax(logits)

模型参数

网络内部神经网络层具有权重参数和偏置参数(如nn.Dense),这些参数会在训练过程中不断进行优化,可通过 model.parameters_and_names() 来获取参数名及对应的参数详情。

[12]:
print(f"Model structure: {model}\n\n")

for name, param in model.parameters_and_names():
    vpn free print(f"Layer: {name}\nSize: {param.shape}\nValues : {param[:2]} vpn梯子 免费 \n")
Model structure: Network<
 vpn梯子  (flatten): Flatten<>
  (dense_relu_sequential): SequentialCell<
    (0): Dense<input_channels=784, output_channels=512, vpn永久免费梯子 has_bias=True>
  vpn梯子 免费   vpn free (1): ReLU<>
    (2): Dense<input_channels=512, output_channels=512, has_bias=True>
 vpn free    (3): ReLU<>
   免费的vpn梯子  (4): Dense<input_channels=512, output_channels=10, has_bias=True>
    >
  >


Layer: dense_relu_sequential.0.weight
Size: (512, 784)
Values : [[-0.01491369  0.00353318 -0.00694948 ...  0.01226766 -0.00014423
   0.00544263]
 [ 0.00212971  vpn永久免费梯子 0.0019974  -0.00624789 ... -0.01214037  0.00118004
  -0.01594325]]

Layer: vpn永久免费梯子 dense_relu_sequential.0.bias
Size: (512,)
Values : [0. 0.]

Layer: dense_relu_sequential.2.weight
Size: (512, 512)
Values : [[ vpn梯子 免费 0.00565423  0.00354313  0.00637383 ... -0.00352688  0.00262949
   0.01157355]
 [-0.01284141  0.00657666 -0.01217057 ...  0.00318963  0.00319115
  -0.00186801]]

Layer: dense_relu_sequential.2.bias
Size: (512,)
Values : [0. 0.]

Layer: dense_relu_sequential.4.weight
Size: (10, 512)
Values : [[ 0.0087168  -0.00381866 -0.00865665 ... -0.00273731 -0.00391623
   0.00612853]
 [-0.00593031  0.0008721  -0.0060081  ... -0.00271535 -0.00850481
  -0.00820513]]

Layer: dense_relu_sequential.4.bias
Size: vpn梯子 免费 (10,)
Values : [0. 0.]

更多内置神经网络层详见mindspore.nn API