深度学习笔记012:AlexNet+.nn.Sequential构建神经网络使用实例+object to parameter ‘0’ (torch.nn.Parameter or None……

AlexNet

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对 原 始 图 片 进 行 了 数 据 增 强 : 随 机 截 取 , 亮 度 与 色 温 的 改 变 对原始图片进行了数据增强:随机截取,亮度与色温的改变

在这里插入图片描述

torch.nn.Sequential源码链接

nn.Sequential
A sequential container. Modules will be added to it in the order they are passed in the constructor. Alternatively, an ordered dict of modules can also be passed in.

一个有序的容器,神经网络模块将按照在传入构造器的顺序依次被添加到计算图中执行,同时以神经网络模块为元素的有序字典也可以作为传入参数;代码链接。

import torch
from torch import nn

# Module 类是 nn 模块⾥提供的⼀个模型构造类,是所有神经⽹络模块的基类,继承它来定义我们想要的模型。需要重写Module 类的 __init__ 函数和 forward 函数。它们分别⽤于创建模型参数和定义前向计算。

class CenteredLayer(nn.Module):
    def __init__(self, **kwargs):
        super(CenteredLayer, self).__init__(**kwargs)

    def forward(self, x):

        return x - x.mean()

# 测试一下
layer = CenteredLayer()
layer(torch.tensor([1, 2, 3, 4, 5], dtype=torch.float))

# 放入到nn.Sequential中
net = nn.Sequential(nn.Linear(8, 128), CenteredLayer())
y = net(torch.rand(4, 8))
y.mean().item()
class FancyMLP(nn.Module):
    def __init__(self, **kwargs):
        super(FancyMLP, self).__init__(**kwargs)
    	self.rand_weight = torch.rand((20, 20),requires_grad=False)  # 不可训练参数(常数参数)
    	self.linear = nn.Linear(20, 20)

    def forward(self, x):
        x = self.linear(x)
        # 使⽤创建的常数参数,以及nn.functional中的relu函数和mm函数
    	x = nn.functional.relu(torch.mm(x, self.rand_weight.data) + 1)
    	# 复⽤全连接层。等价于两个全连接层共享参数
    	x = self.linear(x)
    	# 控制流,这⾥我们需要调⽤item函数来返回标量进⾏⽐较
    	while x.norm().item() > 1:
        	x /= 2
    	if x.norm().item() < 0.8:
        	x *= 10
    	return x.sum()
class NestMLP(nn.Module):
    def __init__(self, **kwargs):
        super(NestMLP, self).__init__(**kwargs)
        self.net = nn.Sequential(nn.Linear(40, 30), nn.ReLU())

    def forward(self, x):
        return self.net(x)


net = nn.Sequential(NestMLP(), nn.Linear(30, 20), FancyMLP())

更复杂一点的情况

如果模型中有需要学习的参数:

class MyDense(nn.Module):
    def __init__(self):
        # 在自己的模块中添加可学习的参数,供训练学习使用
        super(MyDense, self).__init__()
        self.params = nn.ParameterList([nn.Parameter(torch.randn(4,4)) for i in range(3)])
        # nn.Parameter(torch.randn(4,4)): Parameter 类其实是 Tensor 的⼦类,如果⼀个 Tensor 是 Parameter ,那么它会⾃动被添加到模型的参数列表⾥
        # ParameterList 接收⼀个 Parameter 实例的列表作为输⼊然后得到⼀个参数列表,使⽤的时候可以⽤索引来访问某个参数
        self.params.append(nn.Parameter(torch.randn(4, 1))) # 可以使⽤ append 和 extend 在列表后⾯新增参数
    def forward(self, x):
        for i in range(len(self.params)):
            x = torch.mm(x, self.params[i])
        return x

net = MyDense()
print(net)

模型参数访问

更多相关的编程细节

提示:
注:多个模型嵌套的情况下,函数中传播的部分写到了初始化中,可能正向传播没有问题,但是,无法获取参数列表进行反向传播。

TypeError: cannot assign ‘torch.FloatTensor’ object to parameter ‘0’ (torch.nn.Parameter or None required)

nn.Sequential(layers)中的用法及错误TypeError: list is not a Module subclass
ValueError:optimizer got an empty parameter list,参数空传

提示:
如果在forward 中传入或new数据,需要考虑和网络在同一个device。

其他实现方法

make layer是对每一层的层自定义创建:构造对象数组layers,然后调用nn.Sequential(*layers)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值