新手笔记,全是错误勿看
搬运工作
英语不好真的很吃力!
nn.Categorical
torch.distributions.categorical.Categorical(probs=None, logits=None, validate_args=None)
不同时传入probs或者logits,分别表示对数概率或普通概率。
尽量传入一维长度任意的张量
m = Categorical(torch.tensor([0.25, 0.25, 0.25, 0.25]))
m.sample()
# >>tensor(3)
# print(m) : Categorical(probs: torch.Size([4]))
中文名为类别分布,K个类型概率和为1
torch.linear
torch.nn.Linear(in_features, out_features, bias=True, device=None, dtype=None)
shape:函数输入input(任意,in_features),output(任意, out_features)
>>> m = nn.Linear(20, 30) # input 20 , output 30
>>> input = torch.randn(128, 20) # input为128行20列的矩阵
>>> output = m(input) # 128*20
>>> print(output.size())
torch.Size([128, 30])
上面的代码实际上执行了如下的矩阵乘法,因此得到的输出时128*30
权重实际上时根据(-根号k, 根号k)的均匀分布随机选取得到的,k=1/in_features,他的shape是(20,30),很多人不知道怎么来的,其实代码的第一行就设置好了。
nn.Sequential
序贯模型,看下面的代码就能看懂,nn.Sequential之后就生成了一个序贯神经网络模型
import torch.nn as nn
model = nn.Sequential(
nn.Conv2d(1,20,5),
nn.ReLU(),
nn.Conv2d(20,64,5),
nn.ReLU()
)
print(model)
print(model[2]) # 通过索引获取第几个层
'''运行结果为:
Sequential(
(0): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
(1): ReLU()
(2): Conv2d(20, 64, kernel_size=(5, 5), stride=(1, 1))
(3): ReLU()
)
Conv2d(20, 64, kernel_size=(5, 5), stride=(1, 1))
'''
assert和isinstance
assert 语句用法:
assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"
断言语句,如何断言不正确,输出引号里的内容,如果正确就继续执行程序。
isinstance用法:
isinstance(env.observation_space, Box)
判断环境的状态空间是否为连续型,是就返回True,否则返回False
重点
logits_net = mlp(sizes=[obs_dim]+hidden_sizes+[n_acts])
实际上是如上,用状态空间的维数、隐藏层的维数和动作空间的维数创建一个三层神经网络,这里必须联合mlp函数充分理解。
理解了之后再来看logits = logits_net(obs)
,实际上就是将观测值赋给生成好的三层神经网络。