Google TensorFlow课程 编程笔记(11)———稀疏数据和嵌套简介

这篇博客介绍了如何在TensorFlow中使用稀疏数据和嵌入进行情感分析。首先,从创建稀疏特征矢量开始,接着构建线性模型,然后转向使用DNN模型和嵌入。通过训练和可视化嵌入,展示了模型如何学习词语之间的关系,并探讨了在稀疏数据处理中使用嵌入的优缺点。
摘要由CSDN通过智能技术生成

稀疏数据和嵌入简介

学习目标:

  • 将影评字符串数据转换为稀疏特征矢量
  • 使用稀疏特征矢量实现情感分析线性模型
  • 通过将数据投射到二维空间的嵌入来实现情感分析 DNN 模型
  • 将嵌入可视化,以便查看模型学到的词语之间的关系

在此练习中,我们将探讨稀疏数据,并使用影评文本数据(来自 ACL 2011 IMDB 数据集)进行嵌入。这些数据已被处理成 tf.Example 格式。

设置

我们导入依赖项并下载训练数据和测试数据。tf.keras 中包含一个文件下载和缓存工具,我们可以用它来检索数据集。

from __future__ import print_function

import collections
import io
import math

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf
from IPython import display
from sklearn import metrics

tf.logging.set_verbosity(tf.logging.ERROR)
train_url = 'https://download.mlcc.google.com/mledu-datasets/sparse-data-embedding/train.tfrecord'
train_path = tf.keras.utils.get_file(train_url.split('/')[-1], train_url)
test_url = 'https://download.mlcc.google.com/mledu-datasets/sparse-data-embedding/test.tfrecord'
test_path = tf.keras.utils.get_file(test_url.split('/')[-1], test_url)

构建情感分析模型


我们根据这些数据训练一个情感分析模型,以预测某条评价总体上是好评(标签为 1)还是差评(标签为 0)。

为此,我们会使用词汇表(即我们预计将在数据中看到的每个术语的列表),将字符串值 terms 转换为特征矢量。在本练习中,我们创建了侧重于一组有限术语的小型词汇表。其中的大多数术语明确表示是好评差评,但有些只是因为有趣而被添加进来。

词汇表中的每个术语都与特征矢量中的一个坐标相对应。为了将样本的字符串值 terms 转换为这种矢量格式,我们按以下方式处理字符串值:如果该术语没有出现在样本字符串中,则坐标值将为 0;如果出现在样本字符串中,则值为 1。未出现在该词汇表中的样本中的术语将被弃用。


注意我们当然可以使用更大的词汇表,而且有创建此类词汇表的专用工具。此外,我们可以添加少量的 OOV(未收录词汇)分桶,您可以在其中对词汇表中未包含的术语进行哈希处理,而不仅仅是弃用这些术语。我们还可以使用特征哈希法对每个术语进行哈希处理,而不是创建显式词汇表。这在实践中很有效,但却不具备可解读性(这对本练习非常实用)。如需了解处理此类词汇表的工具,请参阅 tf.feature_column 模块。

构建输入管道


首先,我们来配置输入管道,以将数据导入 TensorFlow 模型中。我们可以使用以下函数来解析训练数据和测试数据(格式为 TFRecord),然后返回一个由特征和相应标签组成的字典。

def _parse_function(record):
  """Extracts features and labels.
  
  Args:
    record: File path to a TFRecord file    
    参数是一个TFRcord文件的路径
  Returns:
    A `tuple` `(labels, features)`:
      features: A dict of tensors representing the features
      labels: A tensor with the corresponding labels.
      返回一个字典格式的数据,矢量以及代表的特征
      以及一个标签和矢量对应的标签
  """
  features = {
    "terms": tf.VarLenFeature(dtype=tf.string), # terms are strings of varying lengths
    "labels": tf.FixedLenFeature(shape=[1], dtype=tf.float32) # labels are 0 or 1
  }
 #先定义一个特征结构
  
  parsed_features = tf.parse_single_example(record, features)
  #从record里面解析特征数据
  
  terms = parsed_features['terms'].values    #解析到的术语
  labels = parsed_features['labels']         #解析到的lables

  return  {'terms':terms}, labels            #返回一个字典{术语:术语的矢量}标签(0或者1)

为了确认函数是否能正常运行,我们为训练数据构建一个 TFRecordDataset,并使用上述函数将数据映射到特征和标签。

# Create the Dataset object
ds = tf.data.TFRecordDataset(train_path)
# Map features and labels with the parse function
#将train_path的数据导入ds,并用parse_function(解析方程)map  ds。以解析ds中的数据
ds = ds.map(_parse_function)

ds

运行以下单元,以从训练数据集中获取第一个样本。

n = ds.make_one_shot_iterator().get_next()
sess = tf.Session()
sess.run(n)

现在,我们构建一个正式的输入函数,可以将其传递给 TensorFlow E

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值