一个有序的容器,神经网络模块将按照在传入构造器的顺序依次被添加到计算图中执行,同时以神经网络模块为元素的有序字典也可以作为传入参数。
# Example of using Sequential
model = nn.Sequential(
nn.Conv2d(1,20,5),
nn.ReLU(),
nn.Conv2d(20,64,5),
nn.ReLU()
)
# Example of using Sequential with OrderedDict
model = nn.Sequential(OrderedDict([
('conv1', nn.Conv2d(1,20,5)),
('relu1', nn.ReLU()),
('conv2', nn.Conv2d(20,64,5)),
('relu2', nn.ReLU())
]))
以上就是实现sequential的两种方式,下面一个是可以给每个存放的取名。
然后在forward 调用这个序列,就会像for循环一样,在序列中一个一个取出来。
def forward(self, input):
for module in self._modules.values():
input = module(input)
return input
一个简单举例:
# hyper parameters
in_dim=1
n_hidden_1=1
n_hidden_2=1
out_dim=1
class Net(nn.Module):
def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
super().__init__()
self.layer = nn.Sequential(
nn.Linear(in_dim, n_hidden_1),
nn.ReLU(True),
nn.Linear(n_hidden_1, n_hidden_2),
nn.ReLU(True),
# 最后一层不需要添加激活函数
nn.Linear(n_hidden_2, out_dim)
)
def forward(self, x):
x = self.layer(x)
return x
工程执行:
if __name__ == '__main__':
torch.manual_seed(args.seed)
checkpoint = utility.checkpoint(args) ## setting the log and the train information
if checkpoint.ok:
loader = data.Data(args) ## data loader
model = model.Model(args, checkpoint)
loss = loss.Loss(args, checkpoint) if not args.test_only else None
t = Trainer(args, loader, model, loss, checkpoint)
while not t.terminate():
t.train()
checkpoint.done()
1. 数据加载:加载完成后,不是说直接就喂入网络中。实际上的,还是在这个trainner容器里面执行的inference,这里才是真的开始fed网络中运行。
for batch, (lr, hr, _, idx_scale) in enumerate(self.loader_train):
lr, hr = self.prepare(lr, hr)
scale = hr.size(2) / lr.size(2)
scale2 = hr.size(3) / lr.size(3)
timer_data.hold()
self.optimizer.zero_grad()
# inference
self.model.get_model().set_scale(scale, scale2)
sr = self.model(lr)
2:创建这个model,即把这个模型参数什么的先建立。但是 这时候你直接debug进去 一样的还是有数据的显示(这代表数据已经fed到网络了吗?暂时不清楚这个)
3:定义好loss函数的计算,
4:这个才是最关键的 trainer容器,即真正infererce 计算loss 等的地方。