课题:单元延时预测模型的泛化能力增强
利用《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】。
最大池化层maxpolol1d(输出维度的变化与conv1D一致)
输入【x,y,z】
输出【x,y,Z】
问题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的长度