自然语言大作业准备(2)

103 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

一.设置参数

1.LSTM_UNITS = 128

这个层的隐藏神经元个数,下面有三个细胞状态,一个cell里有四个黄色框框(即隐藏神经元)

image.png

2.DENSE_HIDDEN_UNITS = 4 * LSTM_UNITS

密集隐藏单元

二.构造矩阵

def build_matrix

1.pickle.loads

通过pickle模块的反序列化操作pickle.load(file),能从文件中创建上一次程序保存的对象(在这里的作用就是读取文件)

2.embedding嵌入层(词向量)

max_len=20 #每条文本单词个数最多为20

构建一个将单词(字符串)映射为其向量表示(数值向量)的索引,标准构建如下:

构建可以加载到Embedding层的嵌入矩阵

expanding_dim=100

embedding_matrix=np.zeros((max_words,expanding_dim))

for word,i in word_index.items():

    if i<max_words:

        embedding_vector=embedding_index.get(word)

        if embedding_vector is not None:

            embedding_matrix[i]=embedding_vector

3.gc.collect()

就是强制对所有代进行垃圾回收

三.spatialdropout 普通的dropout会随机地将部分元素置零,而SpatialDropout会随机地将部分区域置零

举个例子: 文本的三维张量可以表示为(samples,sequence_length,embedding_dim)

  • sequence_length表示句子的长度
  • embedding_dim表示词向量的纬度

image.png 下图就是普通的随机置零和spatialdropout区域置零的区别

image.png

1.x.unsqueeze(2)

tourch.unsqueeze(input,dim) 在指定的位置插入一个维度,有两个参数,input是输入的tensor,dim是要插到的维度。在这里就是在第2维度上插入一个维度,x是input

a = torch.ones(3,4)
'''
运行结果
tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])
'''
a = a.unsqueeze(0)
print(a.shape)
'''
运行结果
tensor([[[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]]])
torch.Size([1, 3, 4])
'''

2.x.permute

概念:permute函数的作用是对tensor进行转置(通俗点讲就是换维度) x.permute(0,3,2,1)把原来第1维度的数据换成第三维度去