深度学习在这十年中一直在兴起,其应用是如此广泛和惊人,以至于几乎很难相信它的进步仅仅短短几年。深度学习的核心是一个基本的“单元”,它支配着它的架构,是的,就是神经网络。

    神经网络架构由许多神经元或我们所说的激活单元组成,这个单元回路的作用是寻找数据中的潜在关系。数学证明,神经网络可以找到任何类型的关系/函数,无论其复杂性如何,只要它足够深入/优化,这就是它的潜力。

    现在,我们来学习如何使用 TensorFlow 实现神经网络

    安装 Tensorflow

    Tensorflow 是由 Google 创建并开源的库/平台。它是深度学习应用程序中最常用的库。现在,创建神经网络可能不是 TensorFlow 库的主要功能,但它经常用于此目的。因此,在继续之前,让我们安装并导入 TensorFlow 模块。

    使用 pip/conda 命令在系统中安装 TensorFlow

    # terminal/zsh/cmd command
    # pip
    pip install tensorflow --upgrade
    
    # conda
    conda install -c conda-forge tensorflow
    %tensorflow_version 2.x

    下载并读取数据

    您可以使用任何您想要的数据集,这里我使用了 Kaggle 的红葡萄酒质量数据集。这是一个分类问题,当然,你可以学习将这个概念应用到其他问题中。首先,在您的工作目录中下载数据集。现在数据已下载,让我们将数据加载为数据帧。

    • Python3 语言

    import numpy as np
    import pandas as pd
     
    # be sure to change the file path
    # if you have the dataset in another
    # directly than the working folder
    df = pd.read_csv('winequality-red.csv')
     
    df.head()

     
     

    输出:

     

    数据预处理/拆分为 Train/Valid/Test Set

     

    有多种方法可以拆分数据,您可以定义自定义函数或使用时间戳(如果存在),也可以使用预定义函数,例如 train_test_split in scikit-learn。

     

    在这里,我们使用 sample 函数获取 75% 的数据来创建训练集,然后将其余数据用于验证集。您也可以而且应该创建一个测试集,但这里我们有一个非常小的数据集,我们在这里的主要重点是熟悉该过程并训练神经网络,对吗?

     

    现在让我们划分数据集。

     

    • Python3 语言

    import tensorflow as tf
     
    # 75% of the data is selected
    train_df = df.sample(frac=0.75, random_state=4)
     
    # it drops the training data
    # from the original dataframe
    val_df = df.drop(train_df.index)

    需要注意的是,神经网络通常对相同范围内的数据执行得更好。就像你有不同的列,在 1 列中,你的值范围是 1-10,但在另一列中,它的范围是 100-1000,建议首先将所有列缩放到相同的范围以获得更好的性能。

    现在,最简单的方法是:

    值 — (列的最小值)/(列的范围)

    • Python3 语言

    # calling to (0,1) range
    max_val = train_df.max(axis= 0)
    min_val = train_df.min(axis= 0)
     
    range = max_val - min_val
    train_df = (train_df - min_val)/(range)
     
    val_df =  (val_df- min_val)/range

    既然我们已经完成了扩展数据并创建训练和验证数据集,那么让我们将其分为特征,即输入和目标,因为这就是我们将其传递给模型的方式。

    • Python3 语言

    # now let's separate the targets and labels
    X_train = train_df.drop('quality',axis=1)
    X_val = val_df.drop('quality',axis=1)
    y_train = train_df['quality']
    y_val = val_df['quality']
     
    # We'll need to pass the shape
    # of features/inputs as an argument
    # in our model, so let's define a variable
    # to save it.
    input_shape = [X_train.shape[1]]
     
    input_shape

     
     

    输出:

     

    [11]

     

    这意味着我们将 11 个特征作为输入传递到神经网络的第一层。

     

    创建模型神经网络

     

    Keras 模块构建在 TensorFlow 之上,为我们提供了创建各种神经网络架构的所有功能。我们将使用 Keras 中的 Sequential 类来构建我们的模型。首先,您可以尝试使用线性模型,因为神经网络基本上遵循与回归相同的“数学”,因此您可以使用神经网络创建线性模型,如下所示:

     

    创建线性模型

     

    • Python3 语言

    model = tf.keras.Sequential([
    tf.keras.layers.Dense(units=1,input_shape=input_shape)])
     
    # after you create your model it's
    # always a good habit to print out it's summary
    model.summary()

     
     

    输出:

     

     

    但这基本上是一个线性模型,如果你的数据集稍微复杂一些,特征之间的关系更加多样化,你想要一个非线性模型怎么办?您需要什么?答案是激活函数。这就是神经网络真正开始大放异彩的地方。在本文中,我们无法深入讨论激活函数,但基本上,这些函数为我们的模型添加/引入非线性,你使用它们的次数越多,我们的模型可以找到的模式就越复杂。

     

    创建多层神经网络

     

    我们将创建一个 3 层网络,其中包含 1 个输入层、1 个隐藏层 1(具有 64 个单元)和 1 个输出层。我们将在隐藏层中使用 'relu' 激活函数。我们将在 Keras 模块中使用 Sequential 方法,该方法通常用于创建多层神经网络。在 keras 中,我们有不同类型的神经网络层和/或转换层,你可以使用它们来构建各种类型的神经网络,但这里我们只使用了 3 个具有 relu 激活函数的 Dense 层(在 keras.layers 中)。

     

    • Python3 语言

    model = tf.keras.Sequential([
     
        tf.keras.layers.Dense(units=64, activation='relu',
                              input_shape=input_shape),
        tf.keras.layers.Dense(units=64, activation='relu'),
        tf.keras.layers.Dense(units=1)
    ])
    model.summary()

    输出:

    在 Keras 中创建模型后,您需要为其“编译”其他参数,如下所示。这有点像我们为模型设置所有参数。

    • Python3 语言

    # adam optimizer works pretty well for
    # all kinds of problems and is a good starting point
    model.compile(optimizer='adam'
                   
                  # MAE error is good for
                  # numerical predictions
                  loss='mae'

    因此,我们使用了 adam 优化器,并告诉模型计算 mae(平均绝对误差)损失。

    训练模型

    既然我们已经完成了模型的创建和实例化,现在是时候训练它了。我们将使用 fit 方法来训练我们的模型。这种方法以特征和目标为目标,我们也可以随之传递validation_data,它会自动在验证时尝试你的模型并记录损失指标。我们还提供了 batch_size,e 它的作用是将我们的数据分成小批量,并将其提供给我们的模型在每个 epoch 进行训练,当您拥有大型数据集时,这非常有用,因为它减少了机器上的 RAM 和 CPU 消耗。

    现在,我们只训练了 15 个 epoch 的模型,因为我们的目的是熟悉过程,而不是准确性本身,但您必须增加或减少机器上的 epoch 数。您可以使用一些优化方法,例如提前停止,当模型开始过拟合时会自动停止训练,因此您也可以尝试使用这些方法,如果您想阅读它,我在底部提供了一个链接。

    • Python3 语言

    losses = model.fit(X_train, y_train,
     
                       validation_data=(X_val, y_val),
                        
                       # it will use 'batch_size' number
                       # of examples per example
                       batch_size=256,
                       epochs=15# total epoch
     
                       )

    输出:

    在这里,我们只训练了 15 个 epoch,但您绝对应该训练更多并尝试更改模型本身。

    生成预测并分析准确性

    既然我们已经完成了训练过程,那么让我们实际尝试使用它来预测 “葡萄酒质量”。为了进行预测,我们将使用 model 对象的 predict 函数。我们只给出 3 个示例作为输入,并尝试预测 3 个示例的葡萄酒质量。

    • Python3 语言

    # this will pass the first 3 rows of features
    # of our data as input to make predictions
    model.predict(X_val.iloc[0:3, :])

    输出:

    array([[0.40581337],
          [0.5295989 ],
          [0.3883106 ]], dtype=float32)

    现在,让我们将预测与目标值进行比较。

    • Python3 语言

    y_val.iloc[0:3]

     
     

    输出:

     

    0     0.4
    9     0.4
    12    0.4
    Name: quality, dtype: float64

     

    正如我们所看到的,我们的预测非常接近实际值,即在所有三种情况下都是 0.4。你可以定义另一个函数,将预测转换为整数,以 1 到 10 的等级预测质量,以便更好地理解,但这是一件微不足道的事情,主要是让你理解这里描述的整个过程。

     

    可视化训练与验证损失

     

    您可以分析损失并弄清楚它是否过度拟合或不容易,然后相应地采取适当的措施。

     

    • Python3 语言

    loss_df = pd.DataFrame(losses.history)
     
    # history stores the loss/val
    # loss in each epoch
     
    # loss_df is a dataframe which
    # contains the losses so we can
    # plot it to visualize our model training
    loss_df.loc[:,['loss','val_loss']].plot()

    输出:

    在分析模型的准确性/误差时,需要注意的关键点是:

    显然,您的损失函数会不断减小,但验证数据集可能并非如此,在某些时候,您的模型将过度拟合数据,验证误差将开始增加而不是减少。因此,您可以在 validation loss 似乎正在增加的 epoch 停止。您还可以尝试一些其他优化算法,例如提前停止(Keras 中的 callback)。您可以在此处阅读相关信息。

    Logo

    有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

    更多推荐