网站建设验收表,浙江建设职业学校网站,企业网站服务类型,北京网站制作百度推广记录使用pytorch构建网络模型过程遇到的点 1. 网络模型构建中的问题
1.1 输入变量是Tensor张量
各个模块和网络模型的输入#xff0c; 一定要是tensor 张量#xff1b;
可以用一个列表存放多个张量。 如果是张量维度不够#xff0c;需要升维度#xff0c; 可以先使用 … 记录使用pytorch构建网络模型过程遇到的点 1. 网络模型构建中的问题
1.1 输入变量是Tensor张量
各个模块和网络模型的输入 一定要是tensor 张量
可以用一个列表存放多个张量。 如果是张量维度不够需要升维度 可以先使用 torch.unsqueeze(dim expected) 然后再使用torch.cat(dim ) 进行拼接
需要传递梯度的数据禁止使用numpy 也禁止先使用numpy然后再转换成张量的这种情况出现 这是因为pytorch的机制是只有是 Tensor 张量的类型才会有梯度等属性值如果是numpy这些类别这些变量并会丢失其梯度值。 1.2 __init__() 方法使用
class ex:def __init__(self):pass__init__方法必须接受至少一个参数即self
Python中self是指向该对象本身的一个引用
通过在类的内部使用self变量
类中的方法可以访问自己的成员变量简单来说self.varname的意义为”访问该对象的varname属性“
当然__init__()中可以封装任意的程序逻辑这是允许的init()方法还接受任意多个其他参数允许在初始化时提供一些数据例如对于刚刚的worker类可以这样写
class worker:def __init__(self,name,pay):self.namenameself.paypay这样在创建worker类的对象时必须提供name和pay两个参数
bworker(Jim,5000)Python会自动调用worker.init()方法并传递参数。
细节参考这里init方法
1.3 内置函数 setattr()
此时可以使用python自带的内置函数 setattr(), 和对应的getattr()
setattr(object, name, value)object – 对象。 name – 字符串对象属性。 value – 属性值。
对已存在的属性进行赋值
class A(object):
... bar 1
... a A()getattr(a, bar) # 获取属性 bar 值
1setattr(a, bar, 5) # 设置属性 bar 值a.bar
5如果属性不存在会创建一个新的对象属性并对属性赋值:class A():
... name runoob
... a A()setattr(a, age, 28)print(a.age)
28setattr() 语法
setattr(object, name, value)object – 对象。 name – 字符串对象属性。 value – 属性值。
1.4 网络模型的构建
注意到 在python的 __init__() 函数中 self 本身就是该类的对象的一个引用即self是指向该对象本身的一个引用
利用上述这一点当在神经网络中
需要给多个属性进行实例化时且这多个属性使用的是同一个类进行实例化.
1.4.1 使用 setattr(self, string, object1) 添加属性
注意到下面这种方式由于 Basic_slide_conv() 只经过了一次实例化 所以在内存空间中只会分配一个地址空间给该对象
虽然后面使用 35 group 但这35组本质上使用的同一个对象即conv_block 该对象
class Temporal_GroupTrans(nn.Module):def __init__(self, num_classes10,num_groups35, drop_prob0.5, pretrained True):super(Temporal_GroupTrans, self).__init__()conv_block Basic_slide_conv()for i in range( num_groups):setattr(self, group str(i), conv_block)# 自定义transformer模型的初始化 CustomTransformerModel() 在该类中传入初始化模型的参数,# nip:512 输入序列中每个列向量的编码维度 16: 注意力头的个数# 600: 中间mlp 隐藏层的维数, 6: 堆叠transforEncode 编码模块的个数self.trans_model CustomTransformerModel(512,16,600, 6,droupout0.5,nclass4)
如果想要分配35个不同的对象 即需要分配出35个不同的地址空间用来存储 那么需要将 Basic_slide_conv() 经过了35次实例化 所以需要将 类Basic_slide_conv() 实例化的过程放在循环当中实现
class Temporal_GroupTrans(nn.Module):def __init__(self, num_classes10,num_groups35, drop_prob0.5, pretrained True):super(Temporal_GroupTrans, self).__init__()# conv_block Basic_slide_conv()for i in range( num_groups):setattr(self, group str(i), Basil_slide_conv() )# 自定义transformer模型的初始化 CustomTransformerModel() 在该类中传入初始化模型的参数,# nip:512 输入序列中每个列向量的编码维度 16: 注意力头的个数# 600: 中间mlp 隐藏层的维数, 6: 堆叠transforEncode 编码模块的个数self.trans_model CustomTransformerModel(512,16,600, 6,droupout0.5,nclass4)
1.4.2 使用 getattr(self, string, object1) 获取属性 trans_input_sequence []for i in range(0, num_groups, ):# 每组语谱图的大小是一个 (bt, ch,96,12)的矩阵,组与组之间没有重叠cur_group x[:, :, :, 12 * i:12 * (i 1)]# VARIABLE_fun self.group # 每一组与之对应的卷积模块# cur_fun eval(VARIABLE_fun str(i ))cur_fun getattr(self, groupstr(i))cur_group_out cur_fun(cur_group).unsqueeze(dim1) # [bt,1, 512]trans_input_sequence.append(cur_group_out)