keras 矢量化序列说明

relj7zay  于 2023-02-19  发布在  其他
关注(0)|答案(3)|浏览(187)

在学习 * 使用Python进行深度学习 * 时,我无法理解以下将整数序列编码为二进制矩阵的简单代码。

def vectorize_sequences(sequences, dimension=10000):
    # Create an all-zero matrix of shape (len(sequences), dimension)
    results = np.zeros((len(sequences), dimension))
    for i, sequence in enumerate(sequences):
       results[i, sequence] = 1.  # set specific indices of results[i] to 1s
    return results

(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

x_train = vectorize_sequences(train_data)

x_train的输出类似于
x_train[0]数组([ 0.,1.,1.,...,0.,0.,0.,0.])
1.在下一次i迭代中只有1.被追加时,有人能不能稍微解释一下0.在x_train数组中的存在?我的意思是不应该全是1?

mrphzbgm

mrphzbgm1#

这个脚本把你的数据集转换成一个二进制向量空间模型。让我们一个一个地分析一下。
首先,如果我们检查x_train的内容,我们会发现每条评论都表示为一个单词id序列,每个单词id对应一个特定的单词:

print(train_data[0])  # print the first review
[1, 14, 22, 16, 43, 530, 973, ..., 5345, 19, 178, 32]

现在,这将是非常困难的反馈网络。评论的长度不同,任何整数之间的小数值都没有意义(eidogg.如果在输出中我们得到43. 5,这意味着什么?)
因此,我们可以创建一个looong向量,大小相当于整个字典,在示例中为dictionary=10000。然后,我们将该向量的每个元素/索引与一个word/word_id相关联。因此,word id 14表示的word现在将由该向量的第14个元素表示。
每个元素要么是0(单词没有出现在评论中),要么是1(单词出现在评论中),我们可以将其视为概率,因此0和1之间的值都有意义。此外,每个评论都将由这个非常长的**(稀疏)**向量表示,该向量对于每个评论都具有恒定的长度。
因此,在较小的范围内,如果:

word      word_id
I      -> 0
you    -> 1
he     -> 2
be     -> 3
eat    -> 4
happy  -> 5
sad    -> 6
banana -> 7
a      -> 8

然后将以下列方式处理这些句子。

I be happy      -> [0,3,5]   -> [1,0,0,1,0,1,0,0,0]
I eat a banana. -> [0,4,8,7] -> [1,0,0,0,1,0,0,1,1]

现在我突出显示了稀疏这个词。这意味着,与1相比,0会多得多。我们可以利用这一点。而不是检查每个单词,无论它是否包含在评论中;我们将检查一个小得多的列表,其中只包括那些确实出现在我们的评论中的单词。
因此,我们可以让事情变得简单,通过np.zeros((len(sequences), dimension))立即创建reviews × vocabulary零矩阵。然后只需浏览每个评论中的单词,并将该单词对应位置的指示器翻转为1.0

result[review_id][word_id] = 1.0

因此,我们没有执行25000 x 10000 = 250 000 000操作,而是只执行了number of words = 5 967 841。这只是原始操作量的约2.5%。

rm5edbpk

rm5edbpk2#

这里的for循环并没有处理所有的矩阵,正如你所看到的,它枚举了序列中的元素,所以它只在一个维度上循环,让我们举一个简单的例子:
t = np.array([1,2,3,4,5,6,7,8,9]) r = np.zeros((len(t), 10))
产出

array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

然后我们用同样的方法修改元素:
for i, s in enumerate(t): r[i,s] = 1.

array([[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
   [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])

你可以看到for循环只修改了一组元素(len(t)),其索引为[i,s](在本例中;(0、1)、(1、2)、(2、3)等等))

7d7tgy0s

7d7tgy0s3#

import numpy as np

def vectorize_sequences(sequences, dimension=10000):
    results = np.zeros((len(sequences), dimension))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1.
    return results

相关问题