pytorch
广播矩阵
当自定义矩阵来和一个 batch 的数据 X 做乘法的时候,设X.shape = [batch_size, dimx, dimy]
,那么自定义的矩阵 W.shape = [input_dim, output_dim]
只需要input_dim==dimy
就可以使用torch.matmul(X, W)
,pytorch在计算的时候会自动广播矩阵W,但计算完 W.shape 不会发生变化,也可以使用torch.matmul(W, X)
,同理只需要output_dim==dimx
即可。
还有一个方法是torch.bmm
,其实 bmm 就是 batch matrix multiply 的意思,用法和上面是一样的。
X = torch.randn(3, 2, 3)
W = torch.randn(3, 3, 4)
result = torch.matmul(X, W)
# result = torch.bmm(X, W) 与上面那行效果一致
result.size()
# torch.Size([3, 2, 4])
torchtext
数据预处理流程
Load data:加载各种文件格式的语料 corpus
Tokenization: 将每个句子分解成其包含的单词组成的列表
Build vocab: 构建当前 corpus 的词汇表
Numericalize: 将单词映射成在词汇表中的索引 index
Embedding: 构建 word embedding 矩阵
torchtext.data.Field
Field对象定义了如何处理数据
# tokenizer = lambda x: x.split() 如果语料已经全部是处理好的句子,直接分词就可以了
import spacy
spacy_en = spacy.load('en')
def tokenizer(text):
return [toke.text for toke in spacy_en.tokenizer(text)]
# 也可以直接在Field里用 tokenize='spacy',效果等同于上面自定义的tokenizer函数,只不过需要先link好,这里不展开说了
# REVIEW 用来存储用户评论,include_lengths 设为 True 方便后续使用 pack_padded_sequence
REVIEW = data.Field(sequential=True,tokenize=tokenizer, include_lengths=True)
ASPECT = data.Field(sequential=False)
POLARITY = data.LabelField(sequential=False, dtype = torch.float)
# fields字典里,元组的第一个元素将成为接下来从数据sample出的每个batch的属性,里面存放着对应的数据,第二个元素是对应的Field
fields = [('review', REVIEW), ('aspect', ASPECT), ('polarity', POLARITY)]
torchtext.data.TabularDataset
加载csv/tsv文件
csv文件的每一列必须和fields字典存储的数据顺序相对应,即第一列存放 review,第二列 aspect,第三列 polarity,如果需要跳过aspect,那么应该写成这样fields = [('review', REVIEW), (