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

TensorFlow2入门指南,新手必备!

时间:2023-03-16 16:23:06 科技观察

什么是TensorFlow?TensorFlow是谷歌推出的深度学习框架,于2019年发布了第二个版本,是世界上最著名的深度学习框架之一,被业界专家和研究人员广泛使用。Tensorflowv1因为不太像Pythonic而难以使用和理解,但是与Keras一起发布的v2现在与Tensorflow.keras完全同步,易于使用、易学且易于理解。请记住,这不是一篇关于深度学习的文章,所以我希望您了解深度学习的术语及其背后的基本思想。我们将使用非常著名的数据集IRIS数据集探索深度学习的世界。话不多说,我们直接看代码。从sklearn.datasetsimportload_irisiris=load_iris()导入和理解数据集现在,这个iris是一个字典。我们可以使用如下代码查看键值>>>iris.keys()dict_keys(['data','target','frame','target_names','DESCR','feature_names','filename'])因此,我们的数据在数据键中,目标在目标键中,依此类推。如果要查看此数据集的详细信息,可以使用iris[['DESCR']。现在,我们必须导入其他重要的库来帮助我们创建神经网络。fromsklearn.model_selectionimporttrain_test_split#tosplitdataimportnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimporttensorflowastfromtensorflow.keras.layersimportDensefromtensorflow.keras.modelsimportSequential在这里,我们从tensorflow导入了2个主要的东西,即Dense和Sequential。从tensorflow.keras.layers导入的Dense是一种密集连接层。密集连接层意味着前一层的所有节点都连接到当前层的所有节点。Sequential是Keras的API,俗称SequentialAPI,我们将用它来构建神经网络。为了更好地理解数据,我们可以将其转换为数据框。我们开始做吧。X=pd.DataFrame(data=iris.data,columns=iris.feature_names)print(X.head())X.head()请注意,这里我们设置column=iris.feature_names,其中feature_names有所有4个A键一个功能名称。同样对于目标,y=pd.DataFrame(data=iris.target,columns=['irisType'])y.head()要查看目标集合中的类数,我们可以使用y.irisType.value_counts()这里我们可以看到我们有3个类,每个类都有标签0、1、2。iris.target_names#是iris字典的键值这些是我们要预测的类名。机器学习的数据预处理目前,机器学习的第一步是数据预处理。数据预处理的主要步骤是:填充缺失值将数据拆分为训练集和验证集将数据归一化将分类数据转换为单热向量缺失值检查缺失值我们可以使用pandas.DataFrame.info()检查。X.info()所以我们可以看到我们(幸运的是)没有缺失值并且所有特征都是float64格式。拆分为训练集和测试集要将数据集拆分为训练集和测试集,我们可以使用前面介绍过的sklearn.model_selection中的train_test_split。X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.1)其中test_size是声明我们希望整个数据集的10%作为测试数据。数据标准化一般情况下,当数据的偏差很大时,我们会对数据进行标准化。为了查看偏差值,我们可以使用pandas.DataFrame中的var()函数来查看所有列的偏差值。X_train.var(),X_test.var()所以我们可以看到X_train和X_test的偏差值很低,所以不需要对数据进行标准化。将分类数据转换为单热向量因为我们知道我们的输出数据是已经使用iris.target_name检查的3个类之一,好消息是当我们加载目标时,它们已经是0、1、2格式,其中0=1级,1=2级,依此类推。这种表示的问题是我们的模型可能会优先考虑较高的数字,这可能会使结果产生偏差。因此,为了解决这个问题,我们将使用one-hot表示法。您可以在此处了解有关热门运营商的更多信息。我们可以使用内置的KERSTO_CATEGRICAL,或者使用skLearn的OneHotEncoding。我们将使用to_classical。y_train=tf.keras.utils.to_categorical(y_train)y_test=tf.keras.utils.to_categorical(y_test)我们将只检查前5行以检查它是否已正确转换。y_train[:5,:]是的,我们已经将它转换为one-hot表示。最后一件事我们可以做的最后一件事是将我们的数据转换回Numpy数组,这样我们就可以使用一些额外的函数来帮助我们稍后在模型中。为此,我们可以使用X_train=X_train.valuesX_test=X_test.values让我们看看第一个训练示例的结果是什么。X_train[0]在这里我们可以看到第一个训练示例中的4个特征的值,它具有形状(4)并且当我们对它们使用to_Category时,我们的目标标签已经是数组格式。机器学习模型现在我们终于准备好创建我们的模型并训练它了。我们将从一个简单的模型开始,然后我们将转向复杂的模型结构,我们将在Keras中介绍不同的技巧和技术。让我们编写基本模型model1=Sequential()#SequentialObject首先,我们必须创建一个Sequential对象。现在,要创建一个模型,我们所要做的就是根据我们的选择添加不同类型的层。我们将制作一个10层的Dense层模型,以便我们可以观察过度拟合并在以后使用不同的正则化技术减少它。model1.add(Dense(64,activation='relu',input_shape=X_train[0].shape))model1.add(Dense(128,activation='relu')model1.add(Dense(128,activation='relu')')model1.add(密集(128,activation='relu')model1.add(密集(128,activation='relu')model1.add(密集(64,activation='relu')model1.add(密集(64,激活='relu')model1.add(密集(64,activation='relu')model1.add(密集(64,activation='relu')model1.add(密集(3,activation='softmax')请注意,在我们的第一层中,我们使用了一个额外的参数INPUT_Shape。该参数指定了第一层的维度。在这种情况下,我们不关心训练示例的数量。相反,我们只关心数量.所以我们传入任意训练样例的形状,在我们的例子中是input_Shape里面的(4,).注意我们在输出层使用了Softmax(激活函数)因为它是一个多类分类问题.如果这是一个二元分类问题,我们会使用sigmoid激活函数。我们可以传入任何激活函数我们想要的函数,例如sigmoid或linear或tanh,但实验表明relu在这些类型的模型中表现最好。现在,当我们定义模型的形状时,下一步是指定其损失、优化器和度量。我们使用keras中的Compile方法来指定这些参数。model1.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['acc'])在这里,我们可以使用任何优化器,如随机梯度下降、RMSProp等,但我们将使用Adam。我们在这里使用CATEGRICAL_CROSENTROPY是因为我们有一个多分类问题,如果我们有一个二元分类问题,我们将使用BINARY_CROSENTROPY。指标对于评估一个人的模型很重要。我们可以根据不同的指标评估我们的模型。对于分类问题,最重要的衡量标准是准确性,它显示了我们的预测有多准确。我们模型的最后一步是将其与训练数据和训练标签相匹配。让我们编码吧。history=model1.fit(X_train,y_train,batch_size=40,epochs=800,validation_split=0.1fit返回一个包含我们所有训练历史的回调,我们可以用它来执行不同的有用任务,比如绘图等。历史回调有一个名为history的属性,我们可以将其作为history.history访问,它是一个包含所有损失和指标历史的字典,即在我们的示例中它具有Loss、Acc、val_loses和val_acc历史,我们可以将每个单独的历史作为history访问.history.loss或history.history['val_acc']等。我们有一个指定的epoch数800,批量大小40,验证拆分0.1的分数意味着我们现在有10%的验证数据,我们将使用它来分析我们的训练。使用800个epoch会过度拟合数据,这意味着它将在训练数据上表现得非常好,但在测试数据上表现不佳。随着模型的训练,我们可以看到我们在训练集和验证集上的损失和准确性.在这里,我们可以看到训练的准确性set为100%,验证集上的准确率为67%,对于这样的模型来说已经很不错了。接下来,让我们绘制图表。plt.plot(history.history['acc'])plt.plot(history.history['val_acc'])plt.xlabel('Epochs')plt.ylabel('Acc')plt.legend(['训练','Validation'],loc='upperright')我们可以很清楚的看出在训练集上的准确率远高于在验证集上。同样,我们绘制损失:plt.legend(['Training','Validation'],loc='upperleft')在这里,我们可以清楚的看到在验证集上的loss比在训练集上的损失大很多,这是因为数据过度拟合。要查看模型是否表现良好,我们可以使用model.evaluate来查看。我们将把数据和标签放入评估函数中。model1.evaluate(X_test,y_test)这样我们可以看到模型的准确率为88%,对于一个过拟合的模型来说已经非常不错了。正则化让我们通过向模型添加正则化来使我们的模型更好。正则化将减少我们模型的过度拟合并改进我们的模型。我们将向我们的模型添加L2正则化。单击此处了解有关L2正则化的更多信息。要将L2正则化添加到我们的模型中,我们必须指定要添加正则化的层,并提供一个额外的参数kernel_Regularizer,然后传递tf.keras.Regularizers.l2()。我们还将在我们的模型中实现一些dropout,这将帮助我们更好地减少过度拟合,从而获得更好的性能。要了解更多关于辍学背后的理论和动机,请参阅这篇文章。让我们重新定义这个模型。model2=Sequential()model2.add(Dense(64,activation='relu',input_shape=X_train[0].shape))model2.add(Dense(128,activation='relu',kernel_regularizer=tf.keras.regularizers.l2(0.001)))model2.add(Dense(128,activation='relu',kernel_regularizer=tf.keras.regularizers.l2(0.001)))model2.add(tf.keras.layers.Dropout(0.5)model2.add(密集(128,activation='relu',kernel_regularizer=tf.keras.regularizers.l2(0.001)))model2.add(密集(128,activation='relu',kernel_regularizer=tf.keras.regularizers.l2(0.001)))model2.add(密集(64,activation='relu',kernel_regularizer=tf.keras.regularizers.l2(0.001)))model2.add(密集(64,activation='relu',kernel_regularizer=tf.keras.regularizers.l2(0.001)))model2.add(tf.keras.layers.Dropout(0.5)model2.add(Dense(64,activation='relu',kernel_regularizer=tf.keras.regularizers.l2(0.001)))model2.add(Dense(64,activation='relu',kernel_regularizer=tf.keras.regularizers.l2(0.001)))model2.add(Dense(3,activation='softmax',kernel_regularizer=tf.keras.regularizers.l2(0.001)))如果你仔细观察,我们所有的层和参数都是相同的,除了我们向每个密集层添加2个丢弃层和正则化,我们保留其他一切(损失、优化器、纪元等)。model2.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['acc'])history2=model2.fit(X_train,y_train,epochs=800,validation_split=0.1,batch_size=40)现在让我们评估一下在模型上。你猜怎么了?通过添加正则化层和dropout层,我们的准确率从88%提高到94%。如果我们添加BN层,它将进一步改进。让我们把它画出来。精度plt.plot(history2.history['acc'])plt.plot(history2.history['val_acc'])plt.title('Accuracyvs.epochs')plt.ylabel('Acc')plt.xlabel('Epoch')plt.legend(['Training','Validation'],loc='lowerright')plt.show()plt.plot(history2.history['loss'])plt.plot(history2.history['val_loss'])plt.title('Lossvs.epochs')plt.ylabel('Loss')plt.xlabel('Epoch')plt.legend(['Training','Validation'],loc='upperright')plt.show()insight通过这种方式,我们非常成功地改善了模型的过拟合,将模型准确率提高了将近6%,这对于小数据集来说是一个很好的改进。本文转载自雷锋网。如需转载,请在雷锋网官网申请授权。