昇思25天打卡营-mindspore-ML- Day5网络构建

今天学习了初学入门,初学教程中的《网络构建》,这是一个重要内容。

笔记如下:

## 前面学习了数据类型,数据加载,现在进入到网络构建部分
## 神经网络模型: 神经网络层+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。
 

学习时间:

代码的一些分布结果如图:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值