在这篇文章中,我们将会介绍如何使用 TF.Learn API 同时训练一个广度线性模型和一个深度前馈神经网络。这种方法结合了记忆和泛化的优势。它在一般的大规模回归和具有稀疏输入特性的分类问题(例如,分类特征存在一个很大的可能值域)上很有效。
在这篇文章中,咱们将会介绍怎么运用 TF.Learn API 一同练习一个广度线性模型和一个深度前馈神经网络。这种办法结合了回忆和泛化的优势。它在一般的大规模回归和具有稀少输入特性的分类问题(例如,分类特征存在一个很大的或许值域)上很有用。假如你有爱好学习更多关于广度和深度学习怎么作业的问题,请参阅 研讨论文Wide & Deep Spectrum of Models现在,咱们来看一个简略的比如。
上图展现了广度模型(具有稀少特征和转化性质的 logistic 回归模型),深度模型(具有一个嵌入层和多个躲藏层的前馈神经网络),广度和深度模型(两者的联合练习)的差异比较。在高层级里,只需求经过以下三个过程就能运用 TF.Learn API 装备广度,深度或广度和深度模型。
-
挑选广度部分的特征:挑选要运用的稀少根本列和穿插列。
-
挑选深度部分的特征:挑选接连列,每个分类列的嵌入维度和躲藏层巨细。
-
将它们一同放入广度和深度模型(DNNLinearCombinedClassifier)。
装置
假如想要测验本教程中的代码:
1.装置 TensorFlow ,请前往此处。
2.下载 教程代码。
3.装置 pandas 数据剖析库。因为本教程中需求运用 pandas 数据。尽管 tf.learn 不要求 pandas,可是它支撑 pandas。装置 pandas:
a. 获取 pip:
- #Ubuntu/Linux64-bit
- $sudoapt-getinstallpython-pippython-dev
- #MacOSX
- $sudoeasy_installpip
- $sudoeasy_install--upgradesix
b. 运用 pip 装置 pandas
- $sudopipinstallpandas
假如你在装置过程中遇到问题,请前往 pandas 网站上的 阐明 。
4.履行以下指令来练习教程中描绘的线性模型:
- $pythonwide_n_deep_tutorial.py--model_type=wide_n_deep
请持续阅览,了解此代码怎么构建其线性模型。
界说根本特征列
首要,界说咱们运用的根本分类和接连特征的列。这些列将被作为模型的广度部分和深度部分的构件块。
- importtensorflowastf
- gender=tf.feature_column.categorical_column_with_vocabulary_list(
- "gender",["Female","Male"])
- education=tf.feature_column.categorical_column_with_vocabulary_list(
- "education",[
- "Bachelors","HS-grad","11th","Masters","9th",
- "Some-college","Assoc-acdm","Assoc-voc","7th-8th",
- "Doctorate","Prof-school","5th-6th","10th","1st-4th",
- "Preschool","12th"
- ])
- marital_status=tf.feature_column.categorical_column_with_vocabulary_list(
- "marital_status",[
- "Married-civ-spouse","Divorced","Married-spouse-absent",
- "Never-married","Separated","Married-AF-spouse","Widowed"
- ])
- relationship=tf.feature_column.categorical_column_with_vocabulary_list(
- "relationship",[
- "Husband","Not-in-family","Wife","Own-child","Unmarried",
- "Other-relative"
- ])
- workclass=tf.feature_column.categorical_column_with_vocabulary_list(
- "workclass",[
- "Self-emp-not-inc","Private","State-gov","Federal-gov",
- "Local-gov","?","Self-emp-inc","Without-pay","Never-worked"
- ])
- #展现一个哈希的比如:
- occupation=tf.feature_column.categorical_column_with_hash_bucket(
- "occupation",hash_bucket_size=1000)
- native_country=tf.feature_column.categorical_column_with_hash_bucket(
- "native_country",hash_bucket_size=1000)
- #接连基列
- age=tf.feature_column.numeric_column("age")
- education_num=tf.feature_column.numeric_column("education_num")
- capital_gain=tf.feature_column.numeric_column("capital_gain")
- capital_loss=tf.feature_column.numeric_column("capital_loss")
- hours_per_week=tf.feature_column.numeric_column("hours_per_week")
- #转化
- age_buckets=tf.feature_column.bucketized_column(
- age,boundaries=[18,25,30,35,40,45,50,55,60,65])
广度模型:具有穿插特征列的线性模型
广度模型是一个具有稀少和穿插特征列的线性模型:
- base_columns=[
- gender,native_country,education,occupation,workclass,relationship,
- age_buckets,
- ]
- crossed_columns=[
- tf.feature_column.crossed_column(
- ["education","occupation"],hash_bucket_size=1000),
- tf.feature_column.crossed_column(
- [age_buckets,"education","occupation"],hash_bucket_size=1000),
- tf.feature_column.crossed_column(
- ["native_country","occupation"],hash_bucket_size=1000)
- ]
具有穿插特征列的广度模型能够有用地回忆特征之间的稀少交互。也就是说,穿插特征列不能归纳没有在练习数据中呈现的特征组合。让咱们选用嵌入方法来增加一个深度模型来修正这个问题。
深度模型:嵌入式神经网络
深度模型是一个前馈神经网络,如前图所示。每一个稀少,高维度分类特征首要都会被转化成一个低维度密布的实值矢量,一般被称为嵌入式矢量。这些低维度密布的嵌入式矢量与接连特征相连,然后在正向传递中馈入神经网络的躲藏层。嵌入值随机初始化,并与其他模型参数一同练习,以***化削减练习丢失。假如你有爱好了解更多关于嵌入的常识,请在查阅教程 Vector Representations of Words 或在 Wikipedia 上查阅 Word Embedding。
咱们将运用 embedding_column 装备分类嵌入列,并将它们与接连列衔接:
- deep_columns=[
- tf.feature_column.indicator_column(workclass),
- tf.feature_column.indicator_column(education),
- tf.feature_column.indicator_column(gender),
- tf.feature_column.indicator_column(relationship),
- #展现一个嵌入比如
- tf.feature_column.embedding_column(native_country,dimension=8),
- tf.feature_column.embedding_column(occupation,dimension=8),
- age,
- education_num,
- capital_gain,
- capital_loss,
- hours_per_week,
- ]
嵌入的 dimension 越高,自由度就越高,模型将不得不学习这些特性的表明。为了简略起见,咱们设置避实就虚特征列的维度为 8。从经历上看,关于维度的设定***是从 \log_{2}(n) 或 k\sqrt[4]{n} 值开端,管中窥豹的 n 代表特征列中仅有特征的数量,k 是一个很小的常量(一般小于10)。
经过密布嵌入,深度模型能够更好的归纳,并更好对之前没有在练习数据中遇见的特征进行猜测。但是,当两个特征列之间的底层交互矩阵是稀少和高等级时,很难学习特征列的有用低维度表明。在这种情况下,大多数特征对之间的交互应该为零,除了少量几个,但密布的嵌入将导致避实就虚特征对的非零猜测,然后或许过度泛化。另一方面,具有穿插特征的线性模型能够用更少的模型参数有用地记住这些“反常规矩”。
现在,咱们来看看怎么联合练习广度和深度模型,让它们优势和下风互补。
将广度和深度模型结合为一体
经过将其终究输出的对数几率作为猜测结合起来,然后将猜测提供给 logistic 丢失函数,将广度模型和深度模型相结合。避实就虚的图形界说和变量分配都现已被处理,所以你只需求创立一个 DNNLinearCombinedClassifier:
- importtempfile
- model_dir=tempfile.mkdtemp()
- m=tf.contrib.learn.DNNLinearCombinedClassifier(
- model_dir=model_dir,
- linear_feature_columns=wide_columns,
- dnn_feature_columns=deep_columns,
- dnn_hidden_units=[100,50])
练习和评价模型
在练习模型之前,请先阅览人口普查数据集,就像在 《TensorFlow Liner Model Tutorial》 中所做的相同。 输入数据处理的代码再次为你提供方便:
- importpandasaspd
- importurllib
- #为数据集界说列名
- CSV_COLUMNS=[
- "age","workclass","fnlwgt","education","education_num",
- "marital_status","occupation","relationship","race","gender",
- "capital_gain","capital_loss","hours_per_week","native_country",
- "income_bracket"
- ]
- defmaybe_download(train_data,test_data):
- """Maybedownloadstrainingdataandreturnstrainandtestfilenames."""
- iftrain_data:
- train_file_name=train_data
- else:
- train_file=tempfile.NamedTemporaryFile(delete=False)
- urllib.request.urlretrieve(
- "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data",
- train_file.name)#pylint:disable=line-too-long
- train_file_name=train_file.name
- train_file.close()
- print("Trainingdataisdownloadedto%s"%train_file_name)
- iftest_data:
- test_file_name=test_data
- else:
- test_file=tempfile.NamedTemporaryFile(delete=False)
- urllib.request.urlretrieve(
- "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test",
- test_file.name)#pylint:disable=line-too-long
- test_file_name=test_file.name
- test_file.close()
- print("Testdataisdownloadedto%s"%test_file_name)
- returntrain_file_name,test_file_name
- definput_fn(data_file,num_epochs,shuffle):
- """Inputbuilderfunction."""
- df_data=pd.read_csv(
- tf.gfile.Open(data_file),
- names=CSV_COLUMNS,
- skipinitialspace=True,
- engine="python",
- skiprows=1)
- #移除NaN元素
- df_data=df_data.dropna(how="any",axis=0)
- labels=df_data["income_bracket"].apply(lambdax:">50K"inx).astype(int)
- returntf.estimator.inputs.pandas_input_fn(
- x=df_data,
- y=labels,
- batch_size=100,
- num_epochs=num_epochs,
- shuffle=shuffle,
- num_threads=5)
阅览数据之后,你能够练习并评价模型:
- #将num_epochs设置为None,以取得***的数据流
- m.train(
- input_fn=input_fn(train_file_name,num_epochs=None,shuffle=True),
- steps=train_steps)
- #在避实就虚数据被耗费之前,为了运转评价,设置steps为None
- results=m.evaluate(
- input_fn=input_fn(test_file_name,num_epochs=1,shuffle=False),
- steps=None)
- print("modeldirectory=%s"%model_dir)
- forkeyinsorted(results):
- print("%s:%s"%(key,results[key]))
输出的***行应该相似 accuracy: 0.84429705。咱们能够看到运用广度和深度模型将广度线性模型精度约 83.6% 进步到了约 84.4%。假如你想看端对端的作业示例,你能够下载咱们的 示例代码。
请注意,本教程仅仅一个小型数据基的简略示例,为了让你快速了解 API。假如你有很多具有稀少特征列和很多或许特征值的数据集,广度和深度学习将会愈加强壮。此外,请随时重视咱们的研讨论文,以了解更多关于在实践中广度和深度学习在大型机器学习方面怎么使用的考虑。
知优网 » TensorFlow广度和深度学习的教程(深入理解tensorflow)