pytorch深度学习编程框架
程序员文章站
2022-03-21 21:17:26
...
1 数据流
根据任务需要读取数据
包括:(原始数据-可以输入模型的数据)
数据的组织形式: one task需要的数据形式
数据内容: 需要什么样的预处理 如:归一,数据增强等
数据输入模型前需要部署到cuda上
Variable(samples).cuda(GPU)
2 模型
定义模型
将模型定义在一个类中
通常有init(模型初始化)和forward(执行模型–前向传播)方法
该类继承nn.Module,可以调用nn.module中的属性或方法
class RelationNetwork(nn.Module):
def __init__(self,input_size,hidden_size):
super(RelationNetwork, self).__init__()
self.layer1 = nn.Sequential(
nn.Conv2d(128,64,kernel_size=3,padding=0),
nn.BatchNorm2d(64, momentum=1, affine=True),
nn.ReLU(),
nn.MaxPool2d(2))
self.layer2 = nn.Sequential(
nn.Conv2d(64,64,kernel_size=3,padding=0),
nn.BatchNorm2d(64, momentum=1, affine=True),
nn.ReLU(),
nn.MaxPool2d(2))
self.fc1 = nn.Linear(input_size*3*3,hidden_size)
self.fc2 = nn.Linear(hidden_size,1)
def forward(self,x):
out = self.layer1(x)
out = self.layer2(out)
out = out.view(out.size(0),-1)
out = F.relu(self.fc1(out))
out = F.sigmoid(self.fc2(out))
return out
初始化模型
创建模型类实例,会自动调用init方法,进行模型初始化
relation_network = RelationNetwork(FEATURE_DIM,RELATION_DIM)
打印模型
print(relation_network)
权值初始化(可选)
自定义初始化
feature_encoder.apply(weights_init)
加载预训练
if os.path.exists(str("./models/miniimagenet_relation_network_"+ str(CLASS_NUM) +"way_" + str(SAMPLE_NUM_PER_CLASS) +"shot.pkl")):
relation_network.load_state_dict(torch.load(str("./models/miniimagenet_relation_network_"+ str(CLASS_NUM) +"way_" + str(SAMPLE_NUM_PER_CLASS) +"shot.pkl")))
print("load relation network success")
部署到cuda
relation_network.cuda(GPU)
执行模型–前向传播
relations = relation_network(relation_pairs)
模型设置为训练模式
feature_encoder.zero_grad()
模型设置为测试模式
存储模型
torch.save(relation_network.state_dict(),str("./models/miniimagenet_relation_att_network_"+ str(CLASS_NUM) +"way_" + str(SAMPLE_NUM_PER_CLASS) +"shot_"+str(episode)+".pkl"))
3 优化
定义优化器
relation_network_optim = torch.optim.Adam(relation_network.parameters(),lr=LEARNING_RATE)
学习率时刻表
relation_network_scheduler = StepLR(relation_network_optim,step_size=100000,gamma=0.5)
执行优化器(时刻表)
feature_encoder_scheduler.step(episode)
计算损失
mse = nn.MSELoss().cuda(GPU)
loss = mse(relations,one_hot_labels)
反向传播
loss.backward()
梯度截断
torch.nn.utils.clip_grad_norm(relation_network.parameters(),0.5)
执行优化
relation_network_optim.step()
4 损失
5 日志
========
通用代码积累
常见数据预处理
复杂模型
优化器
学习率调整
自定义的参数优化设置
权值加载与存储
========
自己的框架
数据流模块
调用某个方法可得到可以输入模型的数据
模型定义模块
创建模型实例等于创建模型,调用forward方法等于执行模型
模型初始化模块
损失模块
*run模块
调用方法得到可以输入模型的数据–用数据流模块
- 数据部署到cuda