原文教程:tensorflow官方教程
记录关键内容与学习感受。未完待续。。
——tensorflow中,tf.learn API提供了大量可供线性模型工作的工具。这篇文档提供了关于这些工具的综述,它解释了:
——阅读这篇综述,然后判断tf.learn线性模型工具对你是否有用。然后尝试这篇教程交给你做的东西。这篇综述使用的代码,稍后会在后面给出详细解释。
——为了理解这篇综述,这里将有一些很熟悉、很基础的机器学习的概念,还有关于tf.learn的。
——线性模型经常使用一个单一的加权特征和来做预测。例如,如果你有一些关于一个人的年龄,受教育年长,每周工作时长的数据,你可以学习到对于每一个数字的权重,然后加权求和评估一个人的薪水。你可以使用线性模型来分类。
——有些线性模型将加权和转换为更方便的形式,例如,logistic regression将加权和送到logistic函数,将输出转化为一个0-1之间的数,但是你对每一个输入特征只有一个权重。
——最近的研究已经演示了多层复杂神经网络的力量,为什么还要使用这么简单的模型?
——线性模型:
——你可以在tensorflow上不需要任何特别的API帮助,乱写建立一个线性模型,但是tf.learn提供了一些工具可以更容易的建立大型高效的线性模型。
——设计一个线性模型的大量工作都包含将原始数据转换为合适的输入特征,tf.learn使用FeatureColumn抽象概念使得这些转换成为可能。
——一个FeatureColumn代表了数据中的一个特征。一个FeatureColumn 可能代表一种量,像“height”,也可能代表了一个种类,像“eye_color”,这个eye_color来自离散可能性的集合,例如{‘blue’, ‘brown’, ‘green’}。
——在像“height”这种连续特征和eye_color这种绝对特征的情况下,在数据中一个简单的值可能在输入到模型之前转换成一个数字序列。FeatureColumn可以让你将特征抽象化一个简单的语义单元,而不管它事实上是什么。你可以指定转换并且选择一个特征,去包含那些不需要处理的喂给模型的tensors中特定的目录。
——在线性模型中,绝对特征通常转换成一个稀疏向量,在这里每个可能的值都与他的坐标或者id相关。例如,如果只有三种可能的眼睛颜色,你可以将eye_color表示成一个长度为3的向量:褐色是[1, 0, 0],蓝色是[0, 1, 0],绿色是[0, 0, 1]。这些向量称为稀疏的,是因为当可能值的集合非常大的时候(例如所有的英语单词),它们的长度很长,但有很多0。
——如果你不使用稀疏向量而使用tf.learn线性模型时,线性模型的一个优势就是他们处理大量稀疏向量的能力。稀疏特征是tf.learn线性模型工具中主要的使用实例。
——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
)
——因为线性模型将独立的权值分配给不同的特征,因此它们无法学会对特定特征值结合的相对重要性。如果你有一个特征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)
)
——你可以指定一个连续列,如下:
age = tf.contrib.layers.real_valued_column("age")
——尽管,作为一个单一的真实数字,连续列经常直接输入到模型中,tf.learn对于这种类型的列,提供了一种有用的转换。
——Bucketization将连续列转换成一个绝对列。这种转换在特征交叉中让你可以使用连续列,或者学习有着特殊重要性的指定值范围。
——Bucketization将可能值的范围分成子界,称为buckets:
age_buckets = tf.contrib.layers.bucketized_column(
age,
boundaries = [18,25,30,35,40,45,50,55,60,65]
)
——bucket将一个值变成这个值的绝对标签。
——FeatureColumns 提供一个说明,对于模型中的输入数据,说明如何表示和转换数据。但是它们不提供数据本身,你需要通过输入函数来提供数据。
——输入函数必须返回一个tensors的字典,每个键与FeatureColumn的名字有关。每个键对应的值是一个tensor,包含了所有数据实例的特征值。从Building Input Functions with tf.contrib.learn获得关于输入函数更多的内容,并且input_fn是linear models tutorial code中对输入函数实现的一个例子。
——对于回归和分类模型,tf.learn的评估器类提供一个统一的训练和验证工具。他们关注训练和验证循环中的细节,并且允许用户关注模型的输入和架构。
——为了建立一个线性评估器,对于回归和分类,你可以分别使用tf.contrib.learn.LinearClassifier评估器和tf.contrib.learn.LinearRegressor评估器。
——对于所有的tf.learn评估器,如果想要运行它们,你只需要:
——例如:
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])
——-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。