import torch
import torch.nn as nn
# import torch.nn.functional as F
# import torch.optim as optim
# from torchvision import datasets, transforms
# from torch.autograd import Variable
# from torch.utils.data import Dataset, DataLoader
from torch.nn.utils.rnn import pad_sequence, pack_padded_sequence, pad_packed_sequence
a = [torch.randn(5,12), torch.randn(3,12), torch.randn(2,12), torch.randn(1,12)]
seq = [5,3,2,1]
b = pad_sequence(a, batch_first=True, padding_value=0) # b.shape (4, 5, 12)
c = pack_padded_sequence(b, seq, batch_first=True) # c.data.shape (11, 12)
# TF
encoder_layer = nn.TransformerEncoderLayer(d_model=12, nhead=4) # d_model 必须整除 nhead
transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=6)
b_result = transformer_encoder(b) # 🀄
print(b_result.data.shape) # # 输出维度 (4, 5, 12)
# c_result = transformer_encoder(c) # 不🀄,不允许packed sequence 做输入
# TF - batch测试
result1 = transformer_encoder(b)[0]
result2 = transformer_encoder(a[0].resize(1,5,12))[0]
print(result1)
print(result2)
# 不一样
# LSTM
lstm_layer = nn.LSTM(input_size = 12, hidden_size = 16, batch_first = True, bidirectional = False, num_layers = 1)
b_result, hidden = lstm_layer(b)
print(b_result.shape) # b_result.shape (4, 5, 16)
c_result, hidden = lstm_layer(c)
print(c_result.data.shape) # c_result.data.shape (11, 16)
# LSTM - bidirectional
lstm_layer = nn.LSTM(input_size = 12, hidden_size = 16, batch_first = True, bidirectional = True, num_layers = 1)
b_result, hidden = lstm_layer(b)
print(b_result.shape) # b_result.shape (4, 5, 32)
c_result, hidden = lstm_layer(c)
print(c_result.data.shape) # c_result.data.shape (11, 32)
# LSTM - layers - 不影响输入输出维度
Pytorch:批次序列数据的pad,pack与unpack
于 2020-01-09 14:03:35 首次发布