理解嵌入(UnderstandingEmbeddings)

云的事情不好说 2024-03-08 15:20:44

嵌入(Embeddings)将项目(如单词、图像、用户、产品等)表示为数字向量。

它将高维数据转换为低维数据,同时保留关键方面,如关系或结构。

在单词方面,king(国王)和queen(女王)将有相似的数字列表(嵌入),表明它们之间的相似性。对于图像,两张狗的照片应该会产生相似的嵌入。

这些数字列表作为机器学习模型的输入,帮助做出更准确的预测。

我们来看一个关于单词的简单例子。假设我们有单词dog(狗)、cat(猫)、fish(鱼)和bicycle(自行车)。我们可以在一个非常简单的二维嵌入空间中表示这些单词,其中一个轴代表“动物性”而另一个轴代表“陆地性”。

“狗”可能被表示为 [0.9, 0.8],因为它是动物,并且主要是陆地生物。

“猫”可能是 [0.9, 0.7],因为它是动物,并且主要是陆地生物,但不如狗那么多。

“鱼”可能是 [0.9, 0.1],因为它是动物,但不是陆地生物。

“自行车”可能被表示为 [0.1, 0.8],因为它不是动物,但在陆地上使用。

嵌入通常是使用机器学习模型创建的。例如,Word2Vec、FastText 和 BERT 是用于创建词嵌入的流行模型。

下面看看如何转换文本为嵌入向量:

import gensim.downloader as api # 导入gensim的下载器模块from sklearn.manifold import TSNE # 导入t-SNE算法import matplotlib.pyplot as plt # 导入绘图工具matplotlib的pyplot子库import numpy as np # 导入科学计算库numpy# 加载预训练的word2vec模型model = api.load('word2vec-google-news-300')# 定义要可视化的一组单词words = ['king', 'queen', 'man', 'woman', 'boy', 'girl', 'bread', 'butter', 'doctor', 'nurse','hospital']# 获取每个单词对应的向量表示vectors = [model[word] for word in words]# 将向量列表转换为numpy数组,以便进行t-SNE降维n_samples = len(vectors)vectors_array = np.array(vectors)# 初始化t-SNE模型,设置perplexity为样本数减1tsne = TSNE(n_components=2, perplexity=n_samples-1)# 对词向量进行t-SNE降维vectors_2d = tsne.fit_transform(vectors_array)# 绘制二维平面上的词向量分布plt.figure(figsize=(6, 6))plt.scatter(vectors_2d[:, 0], vectors_2d[:, 1])# 在对应的位置上标注每个单词for i, word in enumerate(words): plt.annotate(word, (vectors_2d[i, 0], vectors_2d[i, 1]))# 显示绘制的图像plt.show()

这段代码主要实现了利用t-SNE算法对一组预定义的单词的word2vec向量进行二维可视化。通过加载预训练的Google News word2vec模型获取单词向量,然后使用t-SNE降维方法将高维的向量空间映射到二维平面上,最后通过matplotlib库进行可视化展示。

创建图像嵌入,示例代码:

# 导入TensorFlow库import tensorflow as tf# 从Keras的applications模块中导入预训练的ResNet50模型及其预处理函数from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input# 导入CIFAR-10数据集from tensorflow.keras.datasets import cifar10# 引入t-SNE降维算法from sklearn.manifold import TSNE# 引入numpy用于科学计算import numpy as np# 引入matplotlib进行数据可视化import matplotlib.pyplot as plt# 加载CIFAR-10数据集,保留前10000个训练样本(x_train, y_train), (x_test, y_test) = cifar10.load_data()x_train = x_train[:10000]# 初始化ResNet50模型,不包含顶层分类器,并加载预训练权重(基于ImageNet)model = ResNet50(include_top=False, weights='imagenet', pooling='avg')# 对训练集图片进行预处理x_train_preprocessed = preprocess_input(x_train)# 使用ResNet50模型对预处理后的训练图片提取特征向量embeddings = model.predict(x_train_preprocessed)# 应用t-SNE算法将高维特征向量降至二维空间tsne = TSNE(n_components=2)embeddings_2d = tsne.fit_transform(embeddings)# 绘制二维嵌入空间中的点,颜色对应于训练样本的真实标签plt.figure(figsize=(10, 10))plt.scatter(embeddings_2d[:, 0], embeddings_2d[:, 1], c=y_train[:10000], cmap='tab10')# 显示降维后的二维嵌入图plt.show()

Towhee 是一个开源的机器学习pipeline,它可以帮助我们将非结构化数据编码成嵌入。不需要编写任何代码。只需调用流水线然后进行转换即可。

示例代码,将上述图片转换为嵌入向量:

from towhee import AutoPipesimport numpy as np# 创建一个用于图像嵌入的自动管道p = AutoPipes.pipeline('image-embedding')# 对指定图片进行处理并获取输出结果output = p('./files/towhee.png').get()# 打印输出结果# print(output)# 打印输出结果的长度以及每个元素的内容,以了解其具体结构和内容print("Output list 长度: ", len(output))for i, feature in enumerate(output): print(f"元素 {i+1} 明细:") # 这里假设feature是一个numpy数组,你可以根据实际情况替换为相应类型的处理方式 if isinstance(feature, np.ndarray): print("Shape: ", feature.shape) print("Data: ", feature.tolist()) else: print(feature)

这段代码主要实现的功能是对指定图片使用预定义的图像嵌入管道提取特征,并详细展示提取出的所有特征向量(或特征矩阵)的信息。

输出信息:



0 阅读:5

云的事情不好说

简介:感谢大家的关注