基础框架代码解释

自定义的,用法就是等于号后面的

out是自己定义的层啊

nn.ReLU()是构造了一个ReLU对象,并不是函数调用,而F.ReLU()是函数调用

这里大佬能说一下,为什么forward里面不能用nn.RELU()函数吗,我只知道是因为参数的问题,但不知道为什么

nn.ReLU不是一个函数,而是一个class

这里hidden(X)是Module父类下一个方法的变体,hidden(X)=hidden.call(X),表示把X作为输入传入该层

nn.ReLU是一个层结构,必须放在nn.Module中,F.relu是一个函数

回答前面:pytorch的这个nn.module不用自己定义后向,pytorch可以自己进行自动后向计算

不是得net.forward(X) 才算是调用forward函数吗 怎么直接net(X)也可以出来

这里net实例化MLP类后可以调用是因为MLP类继承了Moudle类中的__call__方法

这里为什么不是net.forwar(X)

这是python的一个语法糖,net()实际上调用net.call(),而__call__()调用了forward

看起来好象不符合python语法是因为,torch是个框架它有自己内部调用机制,你按它的要求填好空就行了

call__可以通过类名直接调用函数
net()继承Module类,而Module类的call会执行forword
通过内置函数__call
把实例化对象当成函数调用,但不知道为啥需要这么操作

这个类似于c++里面的函数重载,重载了()运算符,类似函数对象,也就是python里面的__call__()的作用

*args:接受不定数量的参数(参数就是层或者块)
调用父类的初始化函数
values,不是keys,keys是string

前面说的对,两个*才是dict
相当于block()调用了层里面的函数
关于为啥是字典形式;因为self._moudles是父类的属性,这个属性类型是OrderedDict()有序字典,这样添加层是将你的层嵌入到模型中,这也是为什么此处并没有重写forward函数
block是循环变量 block()是功能函数

关于为啥是字典形式;因为self._moudles是父类的属性,这个属性类型是OrderedDict()有序字典,这样添加层是将你的层嵌入到模型中,这也是为什么此处并没有重写forward函数

这里的意思是你可以自由的定义你想要的层不是让你复刻

forward在父类nn。module里面调用了,可以打开pycharm跟踪下就知道了

forward应该是在Module类里有调用,所以在class外的代码不需要显示地调用forward,但实际上运行了forward

因为父类nn.Module里重载了__call__,里面调用了forward

这里只是告诉各位,可以灵活的将各种块组合在一起,比如将刚刚定义的NestMLP、线性层以及之前定义的FixedHiddenMLP连在一起。

Sequential对象其实就是一个拿来装Linear (),ReLu()等方法(网络的层)的容器…
list of layers

权重是实例化出来的时候,模型默认初始化赋值的

*表示解包操作,将列表中的元素解包成多个参数传递给print()函数,使得打印的结果更加清晰易读。

解包操作符,一般对元组或列表使用,变为单独的元素。

1是relu,没有参数。02是两个全联接层

激活函数没有参数 取不出来

通过名字获取参数

字典 state_dict()[key]的效果和state_dict[key].data效果一样的吗
传一个字符串名字,指示add module对应的module
print一个网络,知道这个网络大概的架构

net.apply(function),for loop让每一个module调用function这个函数

API是高级程序接口,就是封装好的一个一个可以实现作用的直接调用的东西

为什么不能把weight初始化为常数

数值稳定性那节不是有讲么?要破坏初始化参数的对称性

全部初始化为同一个值,会导致:除输入层以外其它层的各个神经单元输入输出一样,状态梯度一样,从而权重的梯度更新也一样,等价于每层只有一个单元,

计算得到的梯度全都一样,最后所有权重都一样

Xavier

uniform distribution均匀分布

在《银河系漫游指南》小说中,有一个超级先进的文明为了寻找宇宙的终极答案,造了一台超级计算机,经过750万年的计算,最后超级计算机告诉他们终极答案就是“42”。

宇宙终极答案是“42”吗?我们都被“42”骗得好惨

计算机ASCII代码表里十六进制的42对应字符“*”(星号),换句话说,就是计算机里的通配符。所以42就是一切的意思,什么都可以代替。

apply函数的功能是将传入的函数应用到指定的module上,不只是初始化,做什么都行

“*[]”序列解包很细节,和.item()异曲同工

没听懂的建议看 pytorch基础,就那个龙良曲老师讲的,听完后再看这个,就会清楚很多

这个布尔表达式强转成float的意思,先判断是不是绝对值大于5,是就 1,不是就0

因为两个share是同一块内存
梯度肯定会更新,反正两个权重一起变
就是说他们的地址是一样的,所以一个改了,另外一个也跟着改

反向不需要考虑,因为这里的层不包含需要更新的参数
不会真的为0,十的负九次方,用很小的数值来表示
继承自Module的子类在创建实例的时候都会自动生成计算图
rand是从0-1的均匀分布中随机抽样,randn是从0-1的正态分布中抽样forward中定义的计算用的是不可反向传播的data,所以backward没结果的

nn.parameter加梯度加名字

实例化模型的命名而已dense,没错

dense应该特指全连接层。

MyLinear是一个类,dense是这个类的一个实例

为什么省去了dense.forward()

具体到后缀是.pt,.pth,.pkl,都对,不用细究,是Pytorch专用的格式

可以不带文件类型保存,你随便加后缀也可以,torch都可以save load

引号里面的就是你保存的位置,自定义就可以,建议不要有中文
state_dict得到字符串到parameters的映射

在别的地方薅羊毛训练网络经常要这么干

哪这里是不是 需要原来的网络模型也要知道,不然模型参数对不上!

是的,因为只保存了参数没有保存结构,你需要把原来的模型声明写出来

load_state_dict()这个函数是在哪定义了吗

好像可以,有两种save net的方式,这里是只存参数

此处是否通过eval()进入evaluation mode对结果并没有影响
应该是eval是设为评估模式,不计算梯度
train模式(net.train())和eval模式(net.eval())。一般的神经网络中,这两种模式是一样的,只有当模型中存在dropout和batchnorm的时候才有区别。

Y在前面面in[4]里面定义了,Y=net(X)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值