pytorch -nn基础

官方网址:http://pytorch.org/docs/nn.html

数据加载

torch.utils.data.DataLoader

train_iter = torch.utils.data.DataLoader(
    dataset,
    batch_size=batch_size,
    shuffle=True,
    num_workers=0
)

函数解释

DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, num_workers=0, 
collate_fn=default_collatem, pin_memory=False, drop_last=False)
数据加载器(数据集,批处理大小=1,随机播放=False,采样器=None,num\u workers=0,
collate\u fn=default\u collatem,pin\u内存=False,drop\u last=False)

数据迭代

for batch_idx,(inputs,labels) in enumerate(train_loader,0): # 从0开始迭代
    print(batch_idx)

函数解释

以上程序中inputs的大小为[batchsize,每个运算数据的大小]

>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))       # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

train_loader为一个batchszie,batch_idx是迭代次数的索引可以帮助输出阶段参数,
enumerate:返回值有两个:一个是序号,也就是在这里的batch地址,一个是数据train_ids
for i, data in enumerate(train_loader,1):  # 注意enumerate返回值有两个,一个是序号,一个是数据(包含训练数据和标签)
    x_data, label = data

nn.Module

可通过继承 MODULE 类来构造模型,Module 类是 nn 模块⾥提供的⼀个模型构造类,是所有神经⽹络模块的基类

模型:
class MyConv2D(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size):
        super(MyConv2D, self).__init__()
        # 初始化卷积层的2个参数:卷积核、偏差
        if isinstance(kernel_size, int):
            kernel_size = (kernel_size, kernel_size)
        self.weight = nn.Parameter(torch.randn((out_channels, in_channels) + kernel_size))
        self.bias = nn.Parameter(torch.randn(out_channels, 1, 1))

    def forward(self, x):
        """
        :param x: 输入图片,shape(batch_size, C_in, H, W)
        :return: shape(batch_size,C_out, H_out, W_out)
        """
        return corr2d_multi_in_out(x, self.weight) + self.bias
        #      corr2d_multi_in_out是可在类的初始化或全局定义的函数
调用:
net = MyConv2D()
net(X) # 实例化后传入参数X,系统将自动调用forward来完成前向计算。

Module的子类: Sequential(ModuleList 和 ModuleDict与Sequential类似,主要参数形式不同)

# 先导入from torch.nn import init
# 用net.parameters() & net.named_parameters() & net.state_dict()初始化模型的参数
class MyConv2D(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size):
		self.weight = nn.Parameter(torch.randn((out_channels, in_channels) + kernel_size))
		self.bias = nn.Parameter(torch.randn(out_channels, 1, 1))
# 或默认的初始化方法,如线性层
m=nn.Linear(3, 4)# 线性层有weight和bias两个参数
print(m.weight) #size:(3, 4)
print(m.bias)   #size:(1, 4)
net = MySequential(
 nn.Linear(784, 256),
 nn.ReLU(),
 nn.Linear(256, 10),
 )
 
net(X)

训练过程

x = Variable(torch.ones(2,2),requires_grad = False) temp = Variable(torch.zeros(2,2),requires_grad = True)  y = x + temp + 2 y = y.mean()  #求平均数  y.backward()  #反向传递函数,用于求y对前面的变量(x)的梯度 print(x.grad)  # d(y)/d(x)

定义模型与训练过程

# 定义模型
net = ConvMoule().to(device)# nn
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr=lr)

# 在定义好模型之后
optimizer.zero_grad()
output = net(data)
loss = criterion(output, target.long())
loss.backward() # Back Propagation
optimizer.step() # Gardient Descent
total_loss += loss.item()

optimizer.zero_grad()

打印参数

def parameters(self):
  for name, param in self.named_parameters():
    yield param
for name, param in model.named_parameters():
  if param.requires_grad:
    print(name)

PyTorch 中,nn 与 nn.functional 有什么区别?

面向对象

pytorch -nn基础_第1张图片

类的- -init- -方法:

初始化对象属性的构造方法,实例化类时此方法会自动执行,如果实例化类时给类传了参数,则此参数也是呈交给此方法来处理输入的数据

类的其他方法:

类方法的创建,此与函数的定义相类似,区别在于类方法的创建首个形参必须是self

super函数与多继承

python super函数,Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx
python 多继承
Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx

flatten

1)flatten(x,1)是按照x的第1个维度拼接(按照列来拼接,横向拼接);
2)flatten(x,0)是按照x的第0个维度拼接(按照行来拼接,纵向拼接);
3)有时候会遇到flatten里面有两个维度参数,flatten(x, start_dim, end_dimension),此时flatten函数执行的功能是将从start_dim到end_dim之间的所有维度值乘起来,其他的维度保持不变。例如x是一个size为[4,5,6]的tensor, flatten(x, 0, 1)的结果是一个size为[20,6]的tensor。

常见错误与注意

测试集不进行梯度变化:

用with torch.no_grad():包起来

x.view(x.shape[0], -1)

pytorch提示:torch.device’ object has no attribute ‘_apply’

原因是模型没有实例化,net = model() 写成了 net = model;
忘了加括号,笑哭。。。

pytorch提示:named_parameters() missing 1 required positional argument: ‘self’

调用类的方法时一定要加括号,net = AlexnetOfTV.AlexNet应为net = AlexnetOfTV.AlexNet(),然后再使用net.named_parameters()读取参数。

size后少了()

Pytorch出现‘Tensor‘ object is not callable解决办法

Can’t call numpy() on Tensor that requires grad. Use tensor.detach().numpy() instead.

all_prediction = np.concatenate((all_prediction,prediction),axis=0)改成
all_prediction = np.concatenate((all_prediction,prediction.detach().cpu().numpy()),axis=0)

NotImplementedError:未实现错误,比如net实例化结果代码中没有实现forward函数

takes 1 positional argument but 2 were given

在类函数中加上self,因为在类调用类内部函数时,会自动传入self参数;在函数调用是传入参数是(self,x)

参数 batch_first=True

pytorch的bug

expected scalar type Double but found Float
transf = transforms.ToTensor()
img_tensor = transf(img)
x = img_tensor.unsqueeze(0)
y = net.features(x)# 提取特征
img_tensor = transf(arr).to(torch.float32)# 第二次报错,需类型转换[PyTorch]中的数据类型
x = img_tensor.unsqueeze(0)
y = net.features(x)# 提取特征

python+pycharm小技巧

函数的参数类型

打印结果到文件:


f = open("./output/recard", 'w+')  
print("结果", file=f)  

__all__

如果这个包内的类或方法不在__all__里面,就相当于没有上白名单,外面的包就不能正常使用这些没有上白名单的方法和类。

如果没有设置__all__,那么外面可以通过包内的约定来显示可见性。即:python通过private对应两个下划线__,protected对应一个下划线_,public 对应没有下划线,来约定类似于java的可见性控制。

python中的_all_用法

【Python】用 all 暴露接口

__init__.py

__init__.py的在文件夹中,可以使文件夹变为一个python模块,python的每个模块对应的包中都有一个__init__.py文件的存在

通常__init__.py文件为空,但是我们还可以为它增加其他的功能,我们在导入一个模块时候(也叫包),实际上导入的是这个模块的__init__.py文件。我们可以在__init__.py导入我们需要的模块,不需要一个个导入

_init_.py 中还有一个重要的变量,叫做 _all_。我们有时会使出一招“全部导入”,也就是这样:from PackageName import *,这时 import 就会把注册在包 init.py 文件中 all 列表中的子模块和子包导入到当前作用域中来

python无法导入自己的模块的解决办法


https://blog.csdn.net/weixin_40841247/article/details/88682551

RuntimeError: expected padding to be a single integer value or a list of 1 values to match the convolution dimensions, but got padding=[0, 0]
————————————————
版权声明:本文为CSDN博主「gdymind」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gdymind/article/details/82933534

还有一种可能:你的赋值少了一个维度,卷积核的维度应该是这样的
pytorch -nn基础_第2张图片

pycharm dubug不成功原因

可能是系统原因,还有可能是断点在注释上

python 删除字典中的某个元素

你可能感兴趣的:(深度学习,pytorch,深度学习)