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

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

网络构建

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

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

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

定义模型类

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

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

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

    def construct(self, x):
 vpn梯子  vpn free vpn梯子       x = self.flatten(x)
        logits = self.dense_relu_sequential(x)
        return logits

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

[3]:
model = Network()
print(model)
[3]:
Network<
 vpn梯子 免费  (flatten): Flatten<>
  (dense_relu_sequential): SequentialCell<
    (0): Dense<input_channels=784, output_channels=512, vpn梯子 免费 vpn free has_bias=True>
    (1): ReLU<>
    (2): Dense<input_channels=512, output_channels=512, has_bias=True>
    (3): ReLU<>
 vpn梯子 免费    (4): Dense<input_channels=512, output_channels=10, has_bias=True>
    >
  >

我们构造一个输入数据,直接调用模型,可以获得一个二维的Tensor输出,其包含每个类别的原始预测值。

model.construct()方法不可直接调用。

[4]:
X = ops.ones((1, 28, 28), mindspore.float32)
logits vpn梯子 免费 = 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, -5.05689112e-03,  3.99264274e-03]])

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

[5]:
pred_probab vpn梯子 免费 = vpn永久免费梯子 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 -0.11504349 -0.11661264
   0.18007928  0.43213072  0.12091967 -0.17465964  0.53133243  0.12605792
   0.01825903  免费的vpn梯子 0.01287796  0.17238477 -0.1621131  -0.0080034  -0.24523425
  -0.10083733  0.05171938]
 [-0.04736331  0.2939465  -0.02713677 -0.30988005 -0.11504349 -0.11661264
   0.18007928  0.43213072  0.12091967 -0.17465964  0.53133243  0.12605792
   vpn梯子 0.01825903  0.01287796  0.17238477 -0.1621131  -0.0080034  -0.24523425
  vpn free -0.10083733  0.05171938]
 [-0.04736331  0.2939465  -0.02713677 -0.30988005 -0.11504349 -0.11661264
   0.18007928  vpn free 0.43213072  0.12091967 -0.17465964  0.53133243  0.12605792
   0.01825903  0.01287796  0.17238477 -0.1621131  -0.0080034  -0.24523425
  -0.10083733  免费的vpn梯子 0.05171938]]


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

nn.SequentialCell

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

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

logits = 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 = softmax(logits)

模型参数

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

[12]:
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, 免费的vpn梯子 has_bias=True>
    (1): ReLU<>
 vpn梯子    (2): Dense<input_channels=512, output_channels=512, has_bias=True>
  vpn梯子 免费   (3): ReLU<>
    (4): Dense<input_channels=512, output_channels=10, has_bias=True>
  免费的vpn梯子   >
  >


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

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

Layer: dense_relu_sequential.2.weight
Size: (512, 512)
Values vpn永久免费梯子 : [[ vpn梯子 0.00565423  0.00354313  0.00637383 ... -0.00352688  0.00262949
   免费的vpn梯子 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 vpn梯子 免费  0.0008721  -0.0060081  ... -0.00271535 -0.00850481
  -0.00820513]]

Layer: dense_relu_sequential.4.bias
Size: (10,)
Values : [0. 0.]

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