当前位置: 首页 > news >正文

无涯教程-TensorFlow - 单词嵌入

Word embedding是从离散对象(如单词)映射到向量和实数的概念,可将离散的输入对象有效地转换为有用的向量。

Word embedding的输入如下所示:

blue: (0.01359, 0.00075997, 0.24608, ..., -0.2524, 1.0048, 0.06259)
blues: (0.01396, 0.11887, -0.48963, ..., 0.033483, -0.10007, 0.1158)
orange: (-0.24776, -0.12359, 0.20986, ..., 0.079717, 0.23865, -0.014213)
oranges: (-0.35609, 0.21854, 0.080944, ..., -0.35413, 0.38511, -0.070976)

Word2vec

Word2vec是用于无监督最常见方法,它以一种方式训练模型,即给定的输入单词通过使用跳跃语法来预测单词的上下文。

TensorFlow提供了多种方法来实现这种模型,从而提高了复杂性和优化级别,并使用了多线程概念和更高级别的抽象。

import os 
import math 
import numpy as np 
import tensorflow as tf from tensorflow.contrib.tensorboard.plugins import projector 
batch_size = 64 
embedding_dimension = 5 
negative_samples = 8 
LOG_DIR = "logs/word2vec_intro" digit_to_word_map = {1: "One", 2: "Two", 3: "Three", 4: "Four", 5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"} 
sentences = [] # 创建两种句子 - 奇数和偶数序列。for i in range(10000): rand_odd_ints = np.random.choice(range(1, 10, 2), 3) sentences.append(" ".join([digit_to_word_map[r] for r in rand_odd_ints])) rand_even_ints = np.random.choice(range(2, 10, 2), 3) sentences.append(" ".join([digit_to_word_map[r] for r in rand_even_ints])) # 将单词映射到索引
word2index_map = {} 
index = 0 for sent in sentences: for word in sent.lower().split(): if word not in word2index_map: word2index_map[word] = index index += 1 
index2word_map = {index: word for word, index in word2index_map.items()} vocabulary_size = len(index2word_map) # 生成skip-gram对
skip_gram_pairs = [] for sent in sentences: tokenized_sent = sent.lower().split() for i in range(1, len(tokenized_sent)-1):        word_context_pair = [[word2index_map[tokenized_sent[i-1]], word2index_map[tokenized_sent[i+1]]], word2index_map[tokenized_sent[i]]] skip_gram_pairs.append([word_context_pair[1], word_context_pair[0][0]]) skip_gram_pairs.append([word_context_pair[1], word_context_pair[0][1]]) def get_skipgram_batch(batch_size): instance_indices = list(range(len(skip_gram_pairs))) np.random.shuffle(instance_indices)batch = instance_indices[:batch_size] x = [skip_gram_pairs[i][0] for i in batch] y = [[skip_gram_pairs[i][1]] for i in batch] return x, y #批处理示例
x_batch, y_batch = get_skipgram_batch(8) 
x_batch 
y_batch 
[index2word_map[word] for word in x_batch] [index2word_map[word[0]] for word in y_batch] #输入数据,标签 train_inputs=tf.placeholder(tf.int32, shape=[batch_size])train_labels = tf.placeholder(tf.int32, shape = [batch_size, 1]) # 嵌入查找表目前仅在 CPU 中实现tf.name_scope("embeddings"): embeddings = tf.Variable(    tf.random_uniform([vocabulary_size, embedding_dimension], -1.0, 1.0), name = embedding) # 这本质上是一个查找表embed = tf.nn.embedding_lookup(embeddings, train_inputs) # 为 NCE 损失创建变量
nce_weights = tf.Variable(     tf.truncated_normal([vocabulary_size, embedding_dimension], stddev = 1.0/math.sqrt(embedding_dimension))) nce_biases = tf.Variable(tf.zeros([vocabulary_size])) loss = tf.reduce_mean(     tf.nn.nce_loss(weights = nce_weights, biases = nce_biases, inputs = embed, labels = train_labels,num_sampled = negative_samples, num_classes = vocabulary_size)) tf.summary.scalar("NCE_loss", loss) # 学习率衰减
global_step = tf.Variable(0, trainable = False) learningRate = tf.train.exponential_decay(learning_rate = 0.1, global_step = global_step, decay_steps = 1000, decay_rate = 0.95, staircase = True) train_step = tf.train.GradientDescentOptimizer(learningRate).minimize(loss) merged = tf.summary.merge_all() 
with tf.Session() as sess: train_writer = tf.summary.FileWriter(LOG_DIR,    graph = tf.get_default_graph()) saver = tf.train.Saver() with open(os.path.join(LOG_DIR, metadata.tsv), "w") as metadata: metadata.write(Name	Class
) for k, v in index2word_map.items(): metadata.write(%s	%d
 % (v, k)) config = projector.ProjectorConfig() embedding = config.embeddings.add() embedding.tensor_name = embeddings.name # 将此张量链接到其元数据文件(例如标签)。embedding.metadata_path = os.path.join(LOG_DIR, metadata.tsv) projector.visualize_embeddings(train_writer, config) tf.global_variables_initializer().run() for step in range(1000): x_batch, y_batch = get_skipgram_batch(batch_size) summary, _ = sess.run([merged, train_step], feed_dict = {train_inputs: x_batch, train_labels: y_batch})train_writer.add_summary(summary, step)if step % 100 == 0:saver.save(sess, os.path.join(LOG_DIR, "w2v_model.ckpt"), step)loss_value = sess.run(loss, feed_dict = {train_inputs: x_batch, train_labels: y_batch})print("Loss at %d: %.5f" % (step, loss_value))# 在使用之前规范化嵌入norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims = True))normalized_embeddings = embeddings /norm normalized_embeddings_matrix = sess.run(normalized_embeddings)ref_word = normalized_embeddings_matrix[word2index_map["one"]]cosine_dists = np.dot(normalized_embeddings_matrix, ref_word)
ff = np.argsort(cosine_dists)[::-1][1:10] for f in ff: print(index2word_map[f])
print(cosine_dists[f])

上面的代码生成以下输出-

Word2vec

TensorFlow - 单词嵌入 - 无涯教程网无涯教程网提供Word embedding是从离散对象(如单词)映射到向量和实数的概念,可将离散的输入对象有效...https://www.learnfk.com/tensorflow/tensorflow-word-embedding.html

http://www.lryc.cn/news/131469.html

相关文章:

  • Facebook AI mBART:巴别塔的硅解
  • BDA初级分析——SQL清洗和整理数据
  • 汽车后视镜反射率测定仪
  • Redis学习笔记
  • 韩顺平Linux 四十四--
  • 【支付宝小程序】分包优化教程
  • 语言基础2 矩阵和数组
  • springMVC中过滤器抛出异常,自定义异常捕获
  • 图像检索技术研究:深度度量与深度散列在相似性学习中的应用比较与实践 - 使用Python与Jupyter环境
  • CSS加载失败的6个原因
  • react之路由的安装与使用
  • 基于RoCE的应用程序的MTU注意事项
  • springboot集成Graphql相关问题汇总
  • Angular16的路由守卫基础使用
  • leetcode228. 汇总区间
  • 删除有序链表中重复的元素-II(链表)
  • element单独检验form表单中的一项
  • Webpack node、output.jsonpFunction 配置详解
  • 要跟静音开关说再见了!iPhone15新变革,Action按钮引领方向
  • 论文笔记 Graph Attention Networks
  • 看上去就很像的agree和degree有什么联系
  • 2023前端面试题第二弹(真实,一般人我还不给看)
  • 零基础如何学习 Web 安全,如何让普通人快速入门网络安全?
  • 安全学习DAY18_信息打点-APP资产搜集
  • react 矩形波浪
  • 【GitHub】Pycharm本地项目打包上传到Github仓库的操作步骤
  • 计算机网络基础
  • 【图像分类】基于LIME的CNN 图像分类研究(Matlab代码实现)
  • 回归预测 | MATLAB实现TSO-SVM金枪鱼群算法优化支持向量机多输入单输出回归预测(多指标,多图)
  • Pixar、Adobe 和苹果等成立 OpenUSD 联盟推行 3D 内容开放标准