在接触了之前所说的Conv,pool,Batchnorm,ReLU等方法都是神经网络中常见的操作,我们可以根据这些方法来自定义网络模型,也可以根据需求对经典模型进行调整,他们都继承共同的抽象类nn.Module,其中包含好了很多函数。
这个方法中可以封装多个子类,注意,一定继承nn.Module的类,在调用的时候,可以使用下面的方法
net = nn.Sequential(
nn.Conv2d(3,32,3,1,1),
nn.MaxPool2d(2,2),
nn.ReLU(inplace=True),
nn.BatchNorm2d(32)
)
x = t.rand(1,3,32,32)
x = net(x)
x.shape
这个是一个很重要的方法,用于存储模型训练中所有的参数信息,我们可以自定义需要学习的内容,
self.gamma = Parameter(torch.zeros(1))
就可以将我们自定义的参数加入到优化参数列表中了
net=nn.Sequential(nn.Linear(4,2),nn.Linear(2,2))
list(net.parameters())[0].shape #查询网络参数结构
in:dict(net.named_parameters()).items()
out:[('1.weight', Parameter containing:
tensor([[ 0.2523, 0.7062],
[-0.6563, -0.6892]], requires_grad=True)),
('0.bias', Parameter containing:
tensor([0.3603, 0.4283], requires_grad=True)),
('1.bias', Parameter containing:
tensor([ 0.2454, -0.0655], requires_grad=True)),
('0.weight', Parameter containing:
tensor([[-0.1277, -0.3428, -0.1208, 0.2463],
[ 0.0940, 0.0312, 0.3777, -0.2666]], requires_grad=True))]
optim = optim.SGD(net.parameters(),lr = 0.1)
通常我们在训练的过程中,都会指定cuda,或者使用CPU进行训练,可以使用这种方法来实现,使网络在GPU上进行训练
device = t.device("cuda" if t.cuda.is_available() else "cpu") #如果GPU允许就使用GPU
net = net.to(device)
在训练过程中达到一定的acc或者一定的epoch,我们就会使网络结果持久化到本地,避免一些服务器异常的情况,在新增数据进行训练的时候也可以使用预训练的模型上进行
self.load_state_dict(torch.load(‘model.pth’))
t.save(net.state_dict(), name)
在训练过程中,没训练几个epoch或者一些batch,就要进行val操作,至于val和test的区别,就是我们高三时候的每周一小考和高考一样,“把周测当高考,把高考当周测”,这是我的母校绥化一中的标语,哈哈,会不会有学弟学妹在看这篇博客。
net.to(device)#加载网络模型到GPU
...
net.train() #调整到训练状态
...
with torch.no_grad(): #标记为验证状态
net.eval()
...
只要知道了规则,继承nn.Module,就可以实现我们自己的网络结构,下面我分享一个,我经常使用的base_module
class BasicModule(t.nn.Module):
"""
封装了nn.Module,主要是提供了save和load两个方法
"""
def __init__(self):
super(BasicModule,self).__init__()
self.model_name=str(type(self))# 默认名字
def load(self, path):
"""
可加载指定路径的模型
"""
self.load_state_dict(t.load(path))
def save(self, name=None):
"""
保存模型,默认使用“模型名字+时间”作为文件名
"""
if name is None:
prefix = 'checkpoints/' + self.model_name + '_'
name = time.strftime(prefix + '%m%d_%H:%M:%S.pth')
t.save(self.state_dict(), name)
return name
"""
获取参数优化器信息
"""
def get_optimizer(self, lr, weight_decay):
return t.optim.Adam(self.parameters(), lr=lr, weight_decay=weight_decay)
class Flat(t.nn.Module):
"""
把输入reshape成(batch_size,dim_length)
"""
def __init__(self):
super(Flat, self).__init__()
#self.size = size
def forward(self, x):
return x.view(x.size(0), -1)
这几个方法都是训练中很常用的,只要按下面的语法就可以实现我们自己的神经网络了。
class Modulename(t.nn.Module,args=):
def __init__(self):
super(Modulename,self).__init__()
希望这些常见的方法对你有一点帮助,欢迎指正,沟通! 坚持一件事或许很难,但坚持下来一定很酷!^_^