dataset是准备paired input & output,长度不需要准备到一致
dataset 封装到dataloader中,准备的是mini-batch,因此维度变成【batch_size, time-length, feature_dim】,需要扩维度&长度通知到max_length
enumerate dataloader的时候报错TypeError: Caught TypeError in DataLoader worker process 0.
(1) print dataset中准备的数据,看是否有问题
(2)检查collate的 def __init__(self)
是否正确,是必须有的定义
Pytorch的数据读取主要包含三个类:
Dataset
DataLoader
DataLoaderIter
这三者大致是一个依次封装的关系: 1.被装进2., 2.被装进3.
2.DataLoader()
DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
num_workers=0, collate_fn=default_collate, pin_memory=False,
drop_last=False)
dataset:加载的数据集(Dataset对象)
batch_size:batch size
shuffle::是否将数据打乱
sampler: 样本抽样,后续会详细介绍
num_workers:使用多进程加载的进程数,0代表不使用多进程
collate_fn: 如何将多个样本数据拼接成一个batch,一般使用默认的拼接方式即可
pin_memory:是否将数据保存在pin memory区,pin memory中的数据转到GPU会快一些
drop_last:dataset中的数据个数可能不是batch_size的整数倍,drop_last为True会将多出来不足一个batch的数据丢弃
Pytorch中nn.ModuleList 和 nn.Sequential的不同
ModuleList类似于keras的函数式模型创建,确定输入输出
nn.Sequential每次直接拼接网络,不需要指定输入输出
class LinearNet(nn.Module):
def init(self, input_size, num_layers, layers_size, output_size):
super(LinearNet, self).init()
self.linears = nn.ModuleList([nn.Linear(input_size, layers_size)])
self.linears.extend([nn.Linear(layers_size, layers_size) for i in range(1, self.num_layers-1)])
self.linears.append(nn.Linear(layers_size, output_size)
class Flatten(nn.Module):
def forward(self, x):
N, C, H, W = x.size() # read in N, C, H, W
return x.view(N, -1)
simple_cnn = nn.Sequential(
nn.Conv2d(3, 32, kernel_size=7, stride=2),
nn.ReLU(inplace=True),
Flatten(),
nn.Linear(5408, 10),
)
参考:https://blog.csdn.net/xiaojiajia007/article/details/82118559
参考:
https://zhuanlan.zhihu.com/p/30934236(详细讲解了三个过程)
https://blog.csdn.net/g11d111/article/details/81504637(更详细的讲解每一个参数作用)
https://zhuanlan.zhihu.com/p/39752167(pytorch提速指南 )
https://zhuanlan.zhihu.com/p/34298983(autograd.variable和tensor)
AttributeError: module 'torch.nn' has no attribute 'linear'
from torch import nn
linear1 = nn.Linear(in_dim, out_dim) # 注意这里是大写
self.lstm = nn.LSTM(config['Model']['encoder_embedding_dim'],
int(config['Model']['encoder_lstm_dim']), 1,
batch_first=True, bidirectional=True)
## 填充过的变长序列去除冗余(压紧)
x = nn.utils.rnn.pack_padded_sequence(x, input_lengths, batch_first=True)
self.lstm.flatten_parameters()
outputs, _ = self.lstm(x)
## 和pack_padded_sequence()是相反,把压紧的序列再填充回来
outputs, _ = nn.utils.rnn.pad_packed_sequence(outputs, batch_first=True)
更多解释可以参见pytorch对可变长度序列的处理
使用PyTorch进行训练和测试时一定注意要把实例化的model指定train/eval,eval()时,框架会自动把BN和DropOut固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层导致生成图片颜色失真极大
model = resnet50()
print("resnet50 have {} paramerters in total".format(sum(x.numel() for x in model.parameters())))
# x是W/b这样的参数
# x.numel()是计算参数矩阵里边真正的参数量
1 byte = 8 bit
1 kb = 1024 byte
1 MB = 1024 kb
因此得到的参数个数如果是floatn32的话,parameter * 4/1024/1024