使用TensorFlow起步并运行您的第一个神经网络
由Google大脑团队于2015年开发的Tensorflow是最受欢迎的深度学习框架。 这主要是由于它支持多种语言,Tensorflow是用C ++编写的,但您可以通过Python,Javascript,Go和R与之交互。除了其灵活的体系结构和可扩展性之外(模型可以在GPU和CPU上进行训练 并通过Web服务,桌面应用程序或在移动设备上进行部署)。
本文是此工具的完整初学者指南。 它并不意味着要进行深入的介绍,而是旨在使您起步并运行,以开发您的第一个深度学习模型。
我认为,很难找到没有太多复杂性和繁琐数学知识的深度学习教程。 我个人通过获取足够的知识来构建可以工作的模型,然后在使用该方法解决更复杂的问题时了解了更多的复杂性,从而获得了最好的学习。
本教程旨在通过一个不太简单的数据集来演示TensorFlow的基本用法(以演示实际机器学习问题中遇到的一些复杂性),并提供足够的理论以使您能够自己构建某些东西,然后发展该知识 更复杂的文章和课程。
神经网络
在我们开始使用TensorFlow构建模型之前,我将简要介绍基于神经网络的算法的概念,因为首先对这一概念有一个基本的了解是一个好主意。
TensorFlow的主要目的是开发可扩展性强的基于神经网络的模型。 神经网络通常称为人工神经网络(ANN),是基于生物信息处理和通信节点工作方式的机器学习(称为深度学习)的一个子集。
深度神经网络(DNN)是Tensorflow中使用的一种特定形式的人工神经网络,由输入(特征)和输出(目标或预测变量)之间的许多层组成。 在训练模型时,将通过每一层执行数学计算,以计算特征代表特定输出或标签的概率。
数据准备
在本文的其余部分,我们将逐步讲解使用TensorFlow进行分类任务的示例。 我们将使用来自openml.org网站的名为" credit-g"的数据集。 这包括银行公司客户的许多功能以及一个类别,该类别指示是否发现客户存在良好或不良的信用风险。
我们可以使用另一个机器学习库Scikit-learn将数据集直接导入到Python开发环境中。 我正在使用Jupyter Lab。 在下面的代码中,我们还将标记为"类"的列重命名为"目标",以与TensorFlow命名约定更加一致,并将其转换为数字数据,因为TensorFlow无法处理目标变量的字符串数据。
import pandas as pdimport numpy as npfrom sklearn.datasets import fetch_openmlimport tensorflow as tffrom tensorflow import feature_columnfrom tensorflow.keras import layersfrom sklearn.model_selection import train_test_splitX,y = fetch_openml("credit-g", version=1, as_frame=True, return_X_y=True)data = pd.concat([X,y], axis=1)data['target'] = np.where(data['class'] == 'good', 1,0)data = data.drop('class', axis=1)data.head()
来自Openml.org的数据集倾向于将Pandas特定的数据类型" category"用于分类列。 由于TensorFlow无法识别此数据类型,因此我们需要执行另一步骤以将数据类型为"类别"的列转换为"对象"。
categorical_features = data.select_dtypes(include=['category']).drop(['class'], axis=1).columnsfor col in categorical_features: data[col] = data[col].astype('object')
接下来,我们将数据分为训练,测试和验证集。
msk = np.random.rand(len(data)) < 0.8train = data[msk]test = data[~msk]msk_train = np.random.rand(len(train)) < 0.8validation = train[~msk_train]print("Train data size:", len(train))print("Test data size:", len(test))print("Validation data size:", len(validation))
TensorFlow无法直接获取Pandas数据帧。 相反,我们需要将数据框中的列映射到可用于训练模型的要素。 TensorFlow有一种称为tf.data的方法,用于为不同数据类型构建输入管道。
def df_to_dataset(dataframe, shuffle=True, batch_size=32): dataframe = dataframe.copy() labels = dataframe.pop('target') ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels)) if shuffle: ds = ds.shuffle(buffer_size=len(dataframe)) ds = ds.batch(batch_size) return dsbatch_size = 32 train_ds = df_to_dataset(train, batch_size=batch_size)validation_ds = df_to_dataset(validation, shuffle=False, batch_size=batch_size)test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)
创建特征层
我们正在使用的数据集包含许多不同的要素类型,这些要素类型将需要不同的转换。 例如,我们具有一些分类功能,例如" personal_status"列和一些数字列。
在TensorFlow中,我们可以应用必要的变换并将其编码为feature_columns,这些特征被馈送到特征层,该特征层将成为神经网络的第一层。 作为网络的第一步,此层会将此训练数据的每个示例转换为单个Tensor。
要将列用作Tensorflow模型中的特征,我们需要使用feature_columns方法。 有许多不同的feature_column方法将执行不同的转换并将转换后的特征馈入模型。
对于我们的数据集,我们将使用三种不同的转换。
下面的代码首先创建一个名为feature_columns的空列表,我们将在其中附加不同的要素列类型。 第一个转换通过feature_column.categorical_column_with_vocabulary_list方法使用一次热编码来转换分类特征。
然后,我们使用feature_column.bucketized_column方法将"年龄"列转换为存储分区的组。
最后,我们使用feature_column.numeric_column为其余的数值数据创建要素列。
feature_columns = []# Creating one hot encoded feature columnsfor column in categorical_features: column = feature_column.categorical_column_with_vocabulary_list( column, data[column].unique().tolist()) column = feature_column.indicator_column(column) feature_columns.append(column) # Creating age bucketsage = feature_column.numeric_column("age")age_buckets = feature_column.bucketized_column(age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])feature_columns.append(age_buckets)# Remaining numeric featuresremaining_numeric = train.select_dtypes(include=['int64', 'float64']).drop(['age', 'target'], axis=1).columns.tolist()#remaining_numeric_cols = []for column in remaining_numeric: column = feature_column.numeric_column(column) feature_columns.append(column)
现在,我们可以使用feature_columns创建要在我们的神经网络中使用的特征层。
feature_layer = tf.keras.layers.DenseFeatures(feature_columns)
训练模型
现在,我们可以构建神经网络,并使用特征层中的数据训练和评估模型。 在下面的代码中,我们正在构建一种最常见的模型类型,称为顺序模型。 这是从要素图层开始的一系列图层。
第二层和第三层称为激活层。 在基本级别上,每个激活层都从要素层获取输入,并将它们乘以每个节点中的权重。 最常用的激活函数类型是整流线性激活单元(ReLU),它在下面的代码的每个激活层中指定。
在model.compile代码中,我们将算法类型指定为" adam",其他可用的优化器也可以在此处找到。
model = tf.keras.Sequential([ feature_layer, layers.Dense(128, activation='relu'), layers.Dense(128, activation='relu'), layers.Dense(1)])model.compile(optimizer='adam', loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=['accuracy'])model.fit(train_ds, validation_data=validation_ds, epochs=5)
训练后的模型的性能输出如下所示。
网络中的层数以及每层中的节点数(上述模型中两个激活层中的数目128)都会影响模型的性能。 因此,提高性能的一种方法是尝试对这些元素使用不同的数字。 此外,与其他机器学习算法一样,其他优化包括超参数调整,特征选择和增强的特征转换。
本文对使用TensorFlow解决分类任务进行了基本介绍。 如果您想探索讨论的一些概念,fastai课程针对程序员的实用深度学习课程非常好而且免费。
私信译者获得本教程的完整笔记代码。
谢谢阅读!
(本文翻译自Rebecca Vickery的文章《Beginners Guide to Deep Learning with TensorFlow》,参考:https://towardsdatascience.com/beginners-guide-to-deep-learning-with-tensorflow-ca85969b2f2)