矢量化序列的标准实现



在François Chollet的Python深度学习中,出现了以下函数:

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

我理解这个函数的作用。这个函数在这个问题和这个问题中都被问到了,在这里,这里,这里&在这里尽管传播如此广泛,但根据Chollet的书,这种矢量化是"完成"的;手动以获得最大清晰度"我感兴趣的是是否有一个标准,而不是";手动";

是否有一个与上述函数行为非常相似的函数的标准Keras/Tensorflow/Scikit-learn/Pandas/Numpy实现

MultiLabelBinarizer的解决方案

假设sequences是最大可能值为dimension-1的整数数组,我们可以使用sklearn.preprocessing中的MultiLabelBinarizer来复制函数vectorize_sequences的行为

from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer(classes=range(dimension))
mlb.fit_transform(sequences)

使用numpy播放的解决方案

假设sequences是最大可能值达到dimension-1的整数数组

(np.array(sequences)[:, :, None] == range(dimension)).any(1).view('i1')

计算示例

>>> sequences
[[4, 1, 0], 
[4, 0, 3],
[3, 4, 2]]
>>> dimension = 10
>>> mlb = MultiLabelBinarizer(classes=range(dimension))
>>> mlb.fit_transform(sequences)
array([[1, 1, 0, 0, 1, 0, 0, 0, 0, 0],
[1, 0, 0, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0, 0, 0, 0, 0]])

>>> (np.array(sequences)[:, :, None] == range(dimension)).any(1).view('i1')
array([[0, 1, 1, 1, 0, 0, 0, 0, 0, 0],
[1, 0, 1, 0, 1, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 1, 0, 0, 0, 0, 0]])

相关内容

  • 没有找到相关文章