今日第一坑:用iter(data_loader)来进行迭代时,每个epoch都需要重置迭代器,不然会报错Stopiteration(我是把iter()的申明放到了epoch循环外,导致报错)。
enumerate(data_loader)则是直接写在循环内的。
CNN做主干网络提取特征感觉训练效果不佳,平均误差在8ps,很差。
同时以2层RNN做主干网络进行实验,调整了网络结构,预测器减少一层线性层。
RNN的输入【batchsize, numcorner, featuredim】输出【batchsize, numcorner, hiddensize】。
batchnorm层主要作用对每个批次的输入都归一化至均值为0,方差为1的标准正态分布,保持输入的分布一致性,可以加速网络的收敛。BN在CNN中表现不错,但目前在RNN中引入BN的有几项工作,目前有些矛盾的结论。
维度变化技巧
x = x.view(-1, dim) -1表示自适应大小
x = x[:, -1, :] 可以去掉第二维,例如【8,12,14】变为【8,14】
踩坑2:RuntimeError: view size is not compatible with input tensor‘s size and stride
出现这个原因主要就是因为view()需要Tensor中的元素地址是连续的,因为可能出现Tensor不连续的情况,修改为:在.view前加.contiguous(),使其变为连续就ok。
但不知道为何昨日并未出现这个报错。
踩坑3:做回归预测在最后一层输出层用了sigmod激活函数映射输出
回归预测与分类问题不同,分类问题需要在最后一层加激活函数映射至类别概率(0-1之间),而回归预测则不需要。(加了激活函数后,预测的延时会被映射至0-1之间,其分布与预测结果标签相差甚远)