填坑——软编码
背景介绍
今天想重新复写一下模型结构,让模型能够自适应的去适应在不同的数据集,实现软编码。
首先介绍一下硬编码
参考博客
硬编码是指将具体的数值、路径、参数等直接写入程序代码中,而不通过变量或配置文件来表示。这样的做法使得程序中的这些数值和参数变得固定,不容易修改,且缺乏灵活性。硬编码的值通常被称为”魔法数”(Magic Numbers)或”魔法字符串”,因为它们没有直观的含义,只能通过查看代码来了解。
例如,以下是一个硬编码的示例,其中数值 10 直接出现在代码中:
1 |
|
软编码(Softcoding):
软编码是指通过变量、配置文件、参数等方式将具体数值或参数抽象出来,而不是直接写入代码。通过软编码,程序变得更加灵活,可以更容易地进行修改和维护,且适应性更强。
使用软编码的例子:
1 |
|
硬编码:将具体数值、参数等直接写入程序代码中,缺乏灵活性,不易修改和维护。
软编码:通过变量、配置文件等方式将数值或参数抽象出来,使得程序更具灵活性,易于修改和维护。
我的解决办法
在foward中进行重新赋值(有问题),问题就是没有前向训练过程中都重新创建了一个linear,这个linear层的参数没有训练,相当于随机(注:只是我猜的,没有验证,挖个坑在这)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27import torch
import torch.nn as nn
class IntegratedNet(nn.Module):
def __init__(self):
super(IntegratedNet, self).__init__()
self.linear = None # 在初始类中先第一一个self.linear=None ,而后在forward中重新定义
def forward(self, x):
if self.linear is None:
self.linear = nn.Linear(in_features=x.size(1), out_features=1)
x = self.linear(x)
return x
# 创建模型实例
model = IntegratedNet()
# 创建输入数据
x = torch.randn(2, 512, 64)
# 前向传播
output = model(x)
# 打印输出的形状
print(output.size())第二种解决方法在__init__中留下一个接口,在调用这个模型时直接重新赋值。
1
2
3
4
5
6
7
8
9
10
11
12class IntegratedNet(nn.Module):
def __init__(self, input_size=3, mlp_dim=512, mlp_ratio=4,
dims=[64, 128, 320, 512],in_feature=64):
super(IntegratedNet, self).__init__()
model = IntegratedNet(input_size=2,in_feature=209) # 全部重新赋值,实现
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
# 打印模型结构摘要
summary(model, (2, 33, 3333))重新构建网络结构,加入自适应池化层。