昇思25天学习打卡营第5天|网络构建 mindspore.nn学习

神经网络模型是一种模仿人类神经系统工作原理的计算模型,它由大量的人工神经元组成,并通过神经元之间的连接和传递信息来进行计算和学习。不同的神经网络模型根据其结构和连接方式的不同,具有不同的原理和应用。

以下是几种常见的神经网络模型及其原理和应用:

  1. 前馈神经网络(Feedforward Neural Network):

    • 原理:前馈神经网络是最基本的神经网络模型,它由输入层、隐藏层和输出层组成。输入层接收外部输入,隐藏层进行计算和学习,输出层产生最终的输出结果。信息在网络中只能向前传播,不存在反馈连接。
    • 应用:前馈神经网络广泛用于分类和回归问题,如图像识别、语音识别、自然语言处理等。
  2. 循环神经网络(Recurrent Neural Network):

    • 原理:循环神经网络具有循环连接,使得网络可以存储和利用历史信息。每个神经元的输出除了作为下一层的输入,还会作为自身的输入,形成一个循环,实现了对时间序列数据的建模。
    • 应用:循环神经网络主要用于序列数据的处理,如语言模型、机器翻译、情感分析等。
  3. 卷积神经网络(Convolutional Neural Network):

    • 原理:卷积神经网络主要由卷积层、池化层和全连接层组成。卷积层使用卷积运算进行特征提取,池化层用于降维和提取特征的稀疏表示,全连接层用于分类和回归。
    • 应用:卷积神经网络广泛应用于图像和视频处理领域,如图像分类、目标检测、人脸识别等。
  4. 生成对抗网络(Generative Adversarial Network):

    • 原理:生成对抗网络由生成器和判别器组成。生成器试图生成与真实数据类似的样本,判别器试图区分真实样本和生成样本。两个网络通过对抗训练不断优化,最终生成器可以生成逼真的样本。
    • 应用:生成对抗网络广泛应用于生成图像、视频、文字等领域,如图像生成、图像修复、图像风格迁移等。
  5. 长短时记忆网络(Long Short-Term Memory):

    • 原理:长短时记忆网络是一种特殊的循环神经网络,通过引入门控机制解决了循环神经网络“梯度消失”和“梯度爆炸”问题,能够更好地处理长序列数据。
    • 应用:长短时记忆网络主要用于序列数据的处理,如语音识别、机器翻译、文本生成等。

6.深度神经网络(Deep Neural Network, DNN):

  • 原理:DNN是一种包含多个隐藏层的神经网络模型。其原理是通过多个非线性的隐藏层来逐层提取特征,以实现更复杂的模型表达能力。

  • 应用:DNN广泛应用于图像分类、语音识别、自然语言处理等领域。

  1. 自编码器(Autoencoder):
    • 原理:自编码器是一种无监督学习的神经网络模型,通过将输入数据编码为低维表示,再解码重构回输入数据,实现数据的压缩和重建。自编码器可以用于特征学习和降维。
    • 应用:自编码器广泛用于图像去噪、图像压缩、特征提取等领域。

8.ResNet(Residual Neural Network):

  • 原理:是一种深度残差神经网络模型,它通过引入"跳跃连接"(skip connections)解决了深度神经网络训练过程中的梯度消失和梯度爆炸问题。通过在网络中添加残差块(residual block)来实现跳跃连接。每个残差块由两个或三个卷积层组成,其中第一个卷积层用于降低特征维度,第二个卷积层用于恢复特征维度。在这些残差块中,输入的特征被直接添加到输出特征上,从而形成了跳跃连接。通过这种跳跃连接的方式,ResNet能够让网络更深,更容易训练,同时提高了网络性能。

  • 应用:可以在图像分类、目标检测、物体分割等计算机视觉任务以及文本分类、情感分析等自然语言处理任务中获得更好的性能。


网络构建

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

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

%%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

定义模型类

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

construct意为神经网络(计算图)构建,相关内容详见使用静态图加速。

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

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

model = 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=
[[-5.08734025e-04,  3.39190010e-04,  4.62840870e-03 ... -1.20305456e-03, -5.05689112e-03,  3.99264274e-03]])

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

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的图像),依次通过每一个神经网络层来观察其效果。

input_image = ops.ones((3, 28, 28), mindspore.float32)
print(input_image.shape)
(3, 28, 28)
nn.Flatten

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

flatten = nn.Flatten()
flat_image = flatten(input_image)
print(flat_image.shape)
(3, 784)
nn.Dense

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

layer1 = nn.Dense(in_channels=28*28, out_channels=20)
hidden1 = layer1(flat_image)
print(hidden1.shape)
(3, 20)
nn.ReLU

在这里插入图片描述

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

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 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
0.01825903 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
0.01825903 0.01287796 0.17238477 -0.1621131 -0.0080034 -0.24523425
-0.10083733 0.05171938]]

After ReLU: [[0. 0.2939465 0. 0. 0. 0.
0.18007928 0.43213072 0.12091967 0. 0.53133243 0.12605792
0.01825903 0.01287796 0.17238477 0. 0. 0.
0. 0.05171938]
[0. 0.2939465 0. 0. 0. 0.
0.18007928 0.43213072 0.12091967 0. 0.53133243 0.12605792
0.01825903 0.01287796 0.17238477 0. 0. 0.
0. 0.05171938]
[0. 0.2939465 0. 0. 0. 0.
0.18007928 0.43213072 0.12091967 0. 0.53133243 0.12605792
0.01825903 0.01287796 0.17238477 0. 0. 0.
0. 0.05171938]]

在这里插入图片描述

nn.SequentialCell

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

seq_modules = nn.SequentialCell(
    flatten,
    layer1,
    nn.ReLU(),
    nn.Dense(20, 10)
)

logits = seq_modules(input_image)
print(logits.shape)
(3, 10)
nn.Softmax

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

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.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 : [[ 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: (10,)
Values : [0. 0.]

在这里插入图片描述

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值