当前位置: 首页 > 科技观察

TensorFlowWideandDeepLearningTutorial

时间:2023-03-18 17:52:42 科技观察

在本文中,我们将介绍如何使用TF.LearnAPI同时训练宽线性模型和深度前馈神经网络。这种方法结合了记忆和泛化的优点。它适用于一般的大规模回归和具有稀疏输入特征的分类问题(例如,分类特征具有大范围的可能值)。如果您有兴趣了解更多关于广度和深度学习的工作原理,请参阅研究论文Wide&DeepSpectrumofModels现在,让我们看一个简单的例子。上图展示了宽模型(具有稀疏特征和变换属性的逻辑回归模型)、深模型(具有一个嵌入层和多个隐藏层的前馈神经网络)、宽模型和深模型(两者联合训练)的差异比较。在较高级别,您可以使用TF.LearnAPI通过以下三个步骤配置宽、深或宽和深模型。选择广度截面的特征:选择稀疏基和交叉列使用。为深层选择特征:为每个分类列选择连续列、嵌入维度和隐藏层大小。将它们组合成一个广度和深度模型(DNNLinearCombinedClassifier)。安装如果您想尝试本教程中的代码:1.安装TensorFlow,请转到此处。2.下载教程代码。3.安装pandas数据分析库。因为本教程需要用到pandas数据。虽然tf.learn不需要pandas,但它支持pandas。安装熊猫:获取pip:#Ubuntu/Linux64-bit$sudoapt-getinstallpython-pippython-dev#MacOSX$sudoeasy_installpip$sudoeasy_install--upgradesixb。使用pip安装pandas$sudopiinstallpandas如果在安装过程中遇到问题,请前往pandas官网使用说明。4.执行以下命令训练教程中描述的线性模型:$pythonwide_n_deep_tutorial.py--model_type=wide_n_deep继续阅读以了解此代码如何构建其线性模型。定义基本特征列首先,定义我们将使用的基本分类和连续特征列。这些列将用作模型的广度和深度部分的构建块。importtensorflowastfgender=tf.feature_column.categorical_column_with_vocabulary_list("性别",["女","男"])education=tf.feature_column.categorical_column_with_vocabulary_list("教育",["学士","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","未婚”,“分居”,“已婚-AF-配偶”,“丧偶”])relationship=tf.feature_column.categorical_column_with_vocabulary_list("relationship",["Husband","非亲属","妻子","亲生孩子","未婚","其他亲戚"])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","Neverworked"])#展示展示个哈希:职业=tf.feature_column.categorical_columt_column_with_with_hash_bucket(“职业”,hash_bucket_size=1000)bucket_size=1000)antible_country=tf.feature_column.column_calumn_column_column_column_column__column_with_with_withhistry_bucktrtry。feature_column.数字列(“年龄”).nu??meric_column("hours_per_week")#Conversionage_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","职业"],hash_bucket_size=1000),tf.feature_column.crossed_column([age_buckets,"教育","职业"),hash_bucket_size=1000),tf.feature_column.crossed_column(["native_country","职业"],hash_bucket_size=1000)]具有交叉特征列的宽模型可以有效地记忆特征之间的稀疏交互,即交叉特征列不能泛化没有出现在训练数据中的特征组合。让我们通过使用嵌入添加深度模型来解决这个问题。深度模型:嵌入式神经网络深度模型是一个前馈神经网络,如上图所示。每个稀疏的高维分类特征首先被转换为低维密集实值向量,通常称为嵌入向量。这些低维密集嵌入向量与连续特征连接,然后在前向传递中馈入神经网络的隐藏层。嵌入值随机初始化,与其他模型参数一起训练,以尽量减少训练损失。如果您有兴趣了解有关嵌入的更多信息,请查看教程VectorRepresentationsofWords或查看Wikipedia上的WordEmbedding。我们将使用embedding_column配置分类嵌入列并将它们与连续列连接:(关系),#showanembeddedexampletf.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,]embedded越高维度,自由度越高,模型将必须学习这些特征的表示。为了简单起见,我们将所有特征列的维度设置为8。根据经验,维度***的设置从\log_{2}(n)或k\sqrt[4]{n}的值开始,其中n表示特征列中唯一特征的数量,k是一个小常数(通常小于10)。通过密集嵌入,深度模型可以更好地概括并对训练数据中以前未遇到的特征做出更好的预测。然而,当两个特征列之间的基础交互矩阵是稀疏和高秩时,很难学习特征列的有效低维表示。在这种情况下,大多数特征对之间的交互应该为零,但少数特征对除外,但密集嵌入将导致对所有特征对的非零预测,从而可能过度泛化。另一方面,具有交叉特征的线性模型可以用更少的模型参数有效地记住这些“异常规则”。现在,让我们看看如何联合训练wide和deep模型,使它们的优势和劣势相互补充。结合广度和深度模型通过结合它们最终输出的对数优势作为预测,然后将预测提供给逻辑损失函数来结合广度和深度模型。所有图形定义和变量分配都已经处理好,所以您只需要创建一个DNNLinearCombinedClassifier:dunn=[100,50])训练和评估模型在训练模型之前,阅读人口普查数据集,就像在《TensorFlow Liner Model Tutorial》中所做的那样。输入数据处理的代码再次方便大家:importpandasaspdimporturllib#定义数据集的列名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_dataelse: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-longtrain_file_name=train_file.nametrain_file.close()print("Trainingdataisdownloadedto%s"%train_file_name)iftest_data:test_file_name=test_dataelse: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-longtest_file_name=test_file.nametest_file.close()print("Testdataisdownloadedto%s"%test_file_name)returntrain_file_name,test_file_namedefinput_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设置为Noneresults=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。如果您拥有具有稀疏特征列和大量可能特征值的大型数据集,则广度和深度学习会更加强大。此外,请密切关注我们的研究论文,了解更多有关如何将广度和深度学习应用于大规模机器学习实践的想法。