请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

使用 TensorFlow Hub 构建简单的文本分类器

0
回复
1061
查看
[复制链接]

4

主题

6

帖子

24

积分

新手上路

Rank: 1

积分
24
来源: 2018-11-26 16:27:43 显示全部楼层 |阅读模式
本帖最后由 多吃蔬菜 于 2018-11-26 17:43 编辑


TensorFlow Hub 是一个共享机器学习专业知识的平台,尤其是提供预先训练过的模块,这些均包含在可重用资源中。本教程分为两个主要部分。

简介:使用 TensorFlow Hub 训练文本分类器
我们将使用 TensorFlow Hub 文本嵌入模块来训练具有合理基线准确度的简单情感分类器,然后分析其预测,以确保我们的模型是合理的,并提出改进措施,来提高其准确性。

高阶:迁移学习分析
在本节中,我们将使用各种 TensorFlow Hub 模块来比较它们对估算器准确性的影响,并论证迁移学习的优势和缺陷。


可选先决条件
  • TensorFlow 预制估算框架的基本认识
  • 熟悉 Pandas 库


准备环境
  1. <div align="left"><b>
  2. </b></div><div align="left"># Install the latest Tensorflow version.
  3. !pip install --quiet "tensorflow>=1.7"
  4. # Install TF-Hub.
  5. !pip install -q tensorflow-hub
  6. !pip install -q seaborn</div>
  7. <div align="left">更多有关安装 TensorFlow 的详细信息,请访问 <a href="https://www.tensorflow.org/install/" target="_blank">https://www.tensorflow.org/install/</a>。</div><div align="left">import tensorflow as tf
  8. import tensorflow_hub as hub
  9. import matplotlib.pyplot as plt
  10. import numpy as np
  11. import os
  12. import pandas as pd
  13. import re
  14. import seaborn as sns</div>
复制代码


入门

数据
我们将尝试解决 Mass 等人的大型电影评论数据集 v1.0 任务。 数据集由 IMDB 电影评论组成,正性标记自 1 到 10。本任务是将评论标记为负面评论或正面评论。
  1. <div align="left">
  2. </div><div align="left"># Load all files from a directory in a DataFrame.
  3. def load_directory_data(directory):
  4.   data = {}
  5.   data["sentence"] = []
  6.   data["sentiment"] = []
  7.   for file_path in os.listdir(directory):
  8.     with tf.gfile.GFile(os.path.join(directory, file_path), "r") as f:
  9.       data["sentence"].append(f.read())
  10.       data["sentiment"].append(re.match("\d+_(\d+)\.txt", file_path).group(1))
  11.   return pd.DataFrame.from_dict(data)

  12. # Merge positive and negative examples, add a polarity column and shuffle.
  13. def load_dataset(directory):
  14.   pos_df = load_directory_data(os.path.join(directory, "pos"))
  15.   neg_df = load_directory_data(os.path.join(directory, "neg"))
  16.   pos_df["polarity"] = 1
  17.   neg_df["polarity"] = 0
  18.   return pd.concat([pos_df, neg_df]).sample(frac=1).reset_index(drop=True)

  19. # Download and process the dataset files.
  20. def download_and_load_datasets(force_download=False):
  21.   dataset = tf.keras.utils.get_file(
  22.       fname="aclImdb.tar.gz",
  23.       origin="http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz",
  24.       extract=True)
  25.   
  26.   train_df = load_dataset(os.path.join(os.path.dirname(dataset),
  27.                                        "aclImdb", "train"))
  28.   test_df = load_dataset(os.path.join(os.path.dirname(dataset),
  29.                                       "aclImdb", "test"))
  30.   
  31.   return train_df, test_df

  32. # Reduce logging output.
  33. tf.logging.set_verbosity(tf.logging.ERROR)

  34. train_df, test_df = download_and_load_datasets()
  35. train_df.head()</div>
复制代码



模型

输入功能
Estimator 框架提供了包装 Pandas 数据帧的输入函数。

  1. # Training input on the whole training set with no limit on training epochs.
  2. train_input_fn = tf.estimator.inputs.pandas_input_fn(
  3.     train_df, train_df["polarity"], num_epochs=None, shuffle=True)

  4. # Prediction on the whole training set.
  5. predict_train_input_fn = tf.estimator.inputs.pandas_input_fn(
  6.     train_df, train_df["polarity"], shuffle=False)
  7. # Prediction on the test set.
  8. predict_test_input_fn = tf.estimator.inputs.pandas_input_fn(
  9.     test_df, test_df["polarity"], shuffle=False)
复制代码


功能列
TensorFlow Hub 提供了一个功能列,它在给定的文本功能上应用模块,并进一步传递模块的输出。 在本教程中,我们将使用 nnlm-en-dim128 模块。最为关键的是以下几点:

  • 模块采用一组句子以 1-D 张量的字符串作为输入
  • 该模块负责预处理句子(例如删除标点符号和拆分空格)
  • 该模块适用于任何输入(例如,在 vocabulary into ~ 20,000 buckets 中并没有出现的 nnlm-en-dim128 散列词)

  1. <ul><li>
  2. </li></ul>
  3. <div align="left">embedded_text_feature_column = hub.text_embedding_column(
  4.     key="sentence",
  5.     module_spec="https://tfhub.dev/google/nnlm-en-dim128/1")</div>
复制代码

估算器
对于分类,我们可以使用 DNN 分类器(请注意有关本教程末尾标签函数的不同建模的进一步说明)。
  1. estimator = tf.estimator.DNNClassifier(
  2.     hidden_units=[500, 100],
  3.     feature_columns=[embedded_text_feature_column],
  4.     n_classes=2,
  5.     optimizer=tf.train.AdagradOptimizer(learning_rate=0.003))
复制代码


训练
训练估算器以获得合理数量的步骤。
  1. # Training for 1,000 steps means 128,000 training examples with the default
  2. # batch size. This is roughly equivalent to 5 epochs since the training dataset
  3. # contains 25,000 examples.
  4. estimator.train(input_fn=train_input_fn, steps=1000);
复制代码



预测
运行训练和测试集的预测。
  1. <div align="left">train_eval_result = estimator.evaluate(input_fn=predict_train_input_fn)
  2. test_eval_result = estimator.evaluate(input_fn=predict_test_input_fn)

  3. print("Training set accuracy: {accuracy}".format(**train_eval_result))
  4. print("Test set accuracy: {accuracy}".format(**test_eval_result))</div>
复制代码

训练集精度:0.8025599718093872
测试集精度:0.7925599813461304

混淆矩阵
我们可以直观地检查混淆矩阵,了解错误分类的分布。
  1. <div align="left">def get_predictions(estimator, input_fn):
  2.   return [x["class_ids"][0] for x in estimator.predict(input_fn=input_fn)]

  3. LABELS = [
  4.     "negative", "positive"
  5. ]

  6. # Create a confusion matrix on training data.
  7. with tf.Graph().as_default():
  8.   cm = tf.confusion_matrix(train_df["polarity"],
  9.                            get_predictions(estimator, predict_train_input_fn))
  10.   with tf.Session() as session:
  11.     cm_out = session.run(cm)

  12. # Normalize the confusion matrix so that each row sums to 1.
  13. cm_out = cm_out.astype(float) / cm_out.sum(axis=1)[:, np.newaxis]

  14. sns.heatmap(cm_out, annot=True, xticklabels=LABELS, yticklabels=LABELS);
  15. plt.xlabel("Predicted");
  16. plt.ylabel("True");</div>
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册