欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

创建模型实例–用模型定义模块

模型初始化–用模型初始化模块

模型部署到cuda

定义优化器

定义优化器时刻表

执行优化器(时刻表)

执行模型–前向传播

模型设置为训练模式

计算损失

反向传播

执行优化

设置模型为测试模式

计算准确率

输出日志

存储模型