第一天记录实验中遇到的问题和解决办法,以及一些技巧

课题:单元延时预测模型的泛化能力增强

利用《Domain-Adversarial Training of Neural Networks》中的领域对抗技术来突破之前模型泛化能力不足的问题。之前的主体代码使用NLP类似的方法实现,但泛化能力不佳,一个设计的数据训练出的模型对不同设计的单元延时预测效果不行。

主体方法类似GAN网络,主干网络为CNN对特征进行深入提取,预测器为3层线性层,前两层为Relu激活,最后一层为sigmod函数激活(保证延时预测值大于0,且不会像Relu一样一刀切掉小于0的值全部为0),领域区分器为2层线性层,最后用softmax函数预测领域概率。

由于输入为三维数据(类似文本数据处理),【x, y, z】x为batch size, y为corner数量,z为单元特征,因此选用conv1d进行卷积。conv1d(in_channels, out_channels, kernel_size)in_channels需要等于y,out_channels自己设置,此处我设置为64, kernel_size卷积大小。经过conv1d卷积计算后的输出数据为【x, out_channels, L】。

L=\frac{z + 2*padding -dilation*(kenerlsize-1)-1}{stride}+1

最大池化层maxpolol1d(输出维度的变化与conv1D一致)

输入【x,y,z】

输出【x,y,Z】

Z=\frac{z + 2*padding -dilation*(kenerlsize-1)-1}{stride}+1

问题1:RuntimeError: running_mean should contain 1 elements not 10

running_mean是在网络训练过程中计算得到的数据集均值的统计量,从
torch.nn.BatchNorm1d()可以了解到,BN层在通道维度上计算均值和方差的,所以BN层的第一个参数num_features应该为BN上一层输出的通道数。

由于此时我输入BatchNorm1d()的数据为三维数据X=【x, y, z】,而设置batchNorm1d(z),因此num_features设置错误,应该设置为y。问题解决。(最后是将batchnorm层的输入转为了二维数据, 利用X.view()函数,其中可以用X.view(-1, z) 将X转化为【x*y, z】,-1表示自适应大小。)

问题2:Error: ValueError: Expected input batch_size (324) to match target batch_size (4) Log In

batch大小不匹配,因为输入的数据不是batch_size的整数倍,最后一组的batch小于batchsize。这与我写的函数有关系,最后把domain标签长度每次都更新为batch的长度,不固定为batchsize大小,解决问题。

问题3:RuntimeError: Found dtype Double but expected Float

输入数据转为了Float,标签没有转为Float,计算损失时报错。在计算损失前,将标签转为Float型即解决问题。

nn.Linear(in_channel, out_channel)输入的数据可以是多维的,

输入为X【batch_size,in_channel】输出为【batch_size, out_channel】。输入为X【batch_size, dim_num, in_channel】输出为【batch_size, dim_num, out_channel】。依次类推。

模型构建时的两种方法

1.self.ConvLayer= nn.Sequential(
          nn.Conv2d(1,20,5),
          nn.ReLU(),
          nn.Conv2d(20,64,5),
          nn.ReLU()
        )

2.可以一层一层的取名字,更直观明了,查看每层输出的时候更方便。

self.feature = nn.Sequential()
self.feature.add_module('f_conv1', nn.Conv2d(3, 64, kernel_size=5))
self.feature.add_module('f_bn1', nn.BatchNorm2d(64))
self.feature.add_module('f_pool1', nn.MaxPool2d(2))
self.feature.add_module('f_relu1', nn.ReLU(True))

DataLoader迭代时的两种方法

1. for batch_index, (data, label) in enumerate(Data_loader):

2.

Data_iter = iter(Data_loader)

for i in range(len(Data_loader)):

        data = Data_iter.next()

        feature, label = data

len(Data_loader):返回batch的数量,即一个数据集总共有多少个batch

len(Data_loader.dataset):返回数据集中样本的数量,即dataset的长度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值