TensorFlow学习笔记7----Large-scale Linear Models with TensorFlow

原文教程:tensorflow官方教程

记录关键内容与学习感受。未完待续。。


Large-scale Linear Models with TensorFlow

——tensorflow中,tf.learn API提供了大量可供线性模型工作的工具。这篇文档提供了关于这些工具的综述,它解释了:

  • 什么是线性模型
  • 为什么使用线性模型
  • tf.learn如何帮助构建线性模型
  • 如何结合tf.learn和深度学习的线性模型的使用,以获取二者的优势

——阅读这篇综述,然后判断tf.learn线性模型工具对你是否有用。然后尝试这篇教程交给你做的东西。这篇综述使用的代码,稍后会在后面给出详细解释。

——为了理解这篇综述,这里将有一些很熟悉、很基础的机器学习的概念,还有关于tf.learn的。

1、什么是线性模型

——线性模型经常使用一个单一的加权特征和来做预测。例如,如果你有一些关于一个人的年龄,受教育年长,每周工作时长的数据,你可以学习到对于每一个数字的权重,然后加权求和评估一个人的薪水。你可以使用线性模型来分类。

——有些线性模型将加权和转换为更方便的形式,例如,logistic regression将加权和送到logistic函数,将输出转化为一个0-1之间的数,但是你对每一个输入特征只有一个权重。

2、为什么使用线性模型

——最近的研究已经演示了多层复杂神经网络的力量,为什么还要使用这么简单的模型?

——线性模型:

  • 对比于深度神经网络,训练更快。
  • 在大型特征集上工作的很好。
  • 可以使用算法训练,不需要大量的学习速率的fidding等。
  • 比神经网络更容易理解和调试。你可以检查分配给每一个特征的权重,来算出哪个对于预测有最大的影响力。
  • 对于学习机器学习来说提供一个好的出发点。
  • 在业界广泛使用。

3、tf.learn如何帮助构建线性模型

——你可以在tensorflow上不需要任何特别的API帮助,乱写建立一个线性模型,但是tf.learn提供了一些工具可以更容易的建立大型高效的线性模型。

3.1 特征列和转换

——设计一个线性模型的大量工作都包含将原始数据转换为合适的输入特征,tf.learn使用FeatureColumn抽象概念使得这些转换成为可能。

——一个FeatureColumn代表了数据中的一个特征。一个FeatureColumn 可能代表一种量,像“height”,也可能代表了一个种类,像“eye_color”,这个eye_color来自离散可能性的集合,例如{‘blue’, ‘brown’, ‘green’}。

——在像“height”这种连续特征和eye_color这种绝对特征的情况下,在数据中一个简单的值可能在输入到模型之前转换成一个数字序列。FeatureColumn可以让你将特征抽象化一个简单的语义单元,而不管它事实上是什么。你可以指定转换并且选择一个特征,去包含那些不需要处理的喂给模型的tensors中特定的目录。

3.1.1 稀疏列

——在线性模型中,绝对特征通常转换成一个稀疏向量,在这里每个可能的值都与他的坐标或者id相关。例如,如果只有三种可能的眼睛颜色,你可以将eye_color表示成一个长度为3的向量:褐色是[1, 0, 0],蓝色是[0, 1, 0],绿色是[0, 0, 1]。这些向量称为稀疏的,是因为当可能值的集合非常大的时候(例如所有的英语单词),它们的长度很长,但有很多0。

——如果你不使用稀疏向量而使用tf.learn线性模型时,线性模型的一个优势就是他们处理大量稀疏向量的能力。稀疏特征是tf.learn线性模型工具中主要的使用实例。

3.1.1.1 编码稀疏列

——FeatureColumn掌握将绝对值自动转换成向量的能力,代码如下:

eye_color = tf.contrib.layers.sparse_column_with_keys(
    column_name = "eye_color",
    keys = ["blue", "brown","green"]
)

——其中,在你的源数据中,eye_color是列的名字。

—–如果你不知道绝对特征的所有可能性的值,你也可以生成FeatureColumns。这种情况下,你使用sparse_column_with_hash_bucket()方法,这个方法使用哈希函数将索引分配给特征值。

education = tf.contrib.layers.sparse_column_with_hash_bucket(
    \"education",
    hash_bucket_size = 1000
)

3.1.1.2 特征交叉

——因为线性模型将独立的权值分配给不同的特征,因此它们无法学会对特定特征值结合的相对重要性。如果你有一个特征favorite_sport和特征home_city,来预测一个人是否喜欢穿红色的,你的模型可能无法学到St.Louis的棒球粉丝特别喜欢穿红色。

——你可以通过创建一个新的特征favorite_sport_x_home_city,来规避这种限制。对于一个给定的人的特征值,只是对于两个源特征的串联:例如,baseball_x_stlouis。这种特征结合的方式成为特征交叉。

——crossed_column()方法使得设置交叉特征变得容易:

sport = tf.contrib.layers.sparse_column_with_hash_bucket(
    \"sport",
    hash_bucket_size = 1000
)
city = tf.contrib.layers.sparse_column_with_hash_bucket(
    \"city",
    hash_bucket_size = 1000
)
sport_x_city = tf.contrib.layers.crossed_column(
    [sport, city],
    hash_bucket_size = int(1e4)
)

3.1.2 可持续列

——你可以指定一个连续列,如下:

age = tf.contrib.layers.real_valued_column("age")

——尽管,作为一个单一的真实数字,连续列经常直接输入到模型中,tf.learn对于这种类型的列,提供了一种有用的转换。

3.1.2.1 Bucketization

——Bucketization将连续列转换成一个绝对列。这种转换在特征交叉中让你可以使用连续列,或者学习有着特殊重要性的指定值范围。

——Bucketization将可能值的范围分成子界,称为buckets:

age_buckets = tf.contrib.layers.bucketized_column(
    age,
    boundaries = [18,25,30,35,40,45,50,55,60,65]
)

——bucket将一个值变成这个值的绝对标签。

3.1.2.2 输入函数

——FeatureColumns 提供一个说明,对于模型中的输入数据,说明如何表示和转换数据。但是它们不提供数据本身,你需要通过输入函数来提供数据。

——输入函数必须返回一个tensors的字典,每个键与FeatureColumn的名字有关。每个键对应的值是一个tensor,包含了所有数据实例的特征值。从Building Input Functions with tf.contrib.learn获得关于输入函数更多的内容,并且input_fn是linear models tutorial code中对输入函数实现的一个例子。

3.2 线性评估器

——对于回归和分类模型,tf.learn的评估器类提供一个统一的训练和验证工具。他们关注训练和验证循环中的细节,并且允许用户关注模型的输入和架构。

——为了建立一个线性评估器,对于回归和分类,你可以分别使用tf.contrib.learn.LinearClassifier评估器和tf.contrib.learn.LinearRegressor评估器。

——对于所有的tf.learn评估器,如果想要运行它们,你只需要:

  • 实例化评估类。对于两个线性评估类,将FeatureColumns 列表传给构造函数。
  • 调用评估器的fit()方法来训练它。
  • 调用评估器的evaluate()方法来看它的作用如何。

——例如:

e = tf.contrib.learn.linearClassifier(
    feature_columns=[
        native_country, education, occupation,
        workclass, marital_status, race,
        age_buckets, education_x_occupation,
        age_buckets_x_race_x_occupation
    ],
    model_dir = YOUR_MODEL_DIRECTORY
)

e.fit(input_fn = input_fn_train, steps=200)

# evaluate for one step (one pass through the test data)
result = e.evaluate(input_fn = input_fn_test, steps=1)

# print the stats for the evaluation
for key in sorted(result):
    print "%s: %s" % (key, results[key])

3.3 宽度深度学习

——-tf.learnAPI提供了一个评估器类,可以让你共同训练一个线性模型和一个深度神经网。这种新奇的方法结合了线性模型记住关键特征的能力和神经网络的泛化能力。使用tf.contrib.learn.DNNLinearCombinedClassifier创建一种宽度深度模型:

e = tf.contrib.learn.DNNLinearCombinedClassifier(
    model_dir = YOUR_MODEL_DIR,
    linear_feature_columns = wide_columns,
    dnn_feature_columns = deep_columns,
    dnn_hidden_units = [100, 50]
)

—–更多信息,参见Wide and Deep Learning tutorial

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值