python 神经网络解释

时间:2020-12-22 12:18:18

标签: python dataframe neural-network

model = Sequential()

nFeatures = X.shape[1]
model.add(Dense(20,
        input_dim=nFeatures,
        activation="relu",
        kernel_initializer="random_normal",
        bias_initializer="zeros"))

nOutput = y.shape[1]
model.add(Dense(nOutput,
        activation="softmax",
        kernel_initializer="random_normal",
        bias_initializer="zeros"))

model.compile(optimizer="adam",
        loss="categorical_crossentropy",
        metrics=["categorical_accuracy"])

model.summary()

谁能给我解释一下这三个主要部分的含义? 我知道第一个是内层,第二个是输出层,第三个部分是某种编译器。 但是我在理解单个部分时遇到问题。 为什么我们使用字符串 relu、random_normal、softmax、adam....?背后的含义是什么?

2 个答案:

答案 0 :(得分:0)

model = Sequential()

我们正在使用 Keras Sequential API 来构建模型。有替代的功能 API。 Sequential API 允许为大多数问题逐层创建模型。它不允许您创建共享层或具有多个输入或输出的模型。

nFeatures = X.shape[1]

我们得到了特征的数量。 X.shape = (No_of_inputs, no_of_features)

输入的数量将等于输入层中单元/神经元的数量。

model.add(Dense(20,
        input_dim=nFeatures,
        activation="relu",
        kernel_initializer="random_normal",
        bias_initializer="zeros"))
    
    

我们用 nFeatures 单元定义第一个输入层,以及另一个 20 个单元的密集层。 密集层具有线性部分和非线性部分。线性部分是线 Wx+b 的方程,其中 W 是权重矩阵,b 是偏置向量。 非线性部分将是一个激活函数,它只是一个非线性函数,它为权重增加了随机性,这些也会影响模型收敛速度或训练收敛时间、损失等。 使用 ReLU 整流线性单元函数这里。 偏差和内核初始化器定义了偏差和内核/权重矩阵应该如何初始化。某些启发式和研究证明方法,例如 Xavier 初始化器、Glorot 法线初始化器、random_normal 用于初始化权重矩阵,因为这些有助于防止梯度爆炸和消失。偏置向量必须为零。

nOutput = y.shape[1]
model.add(Dense(nOutput,
        activation="softmax",
        kernel_initializer="random_normal",
        bias_initializer="zeros"))
    

用 nOutput 单元定义第一个输入层。输出层中单元/神经元的数量将取决于类的数量。 例如:二元分类器 1 输出。类 0 或 1。这是一个多类分类器。所以输出层中的单元/神经元数 = 类数。

model.compile(optimizer="adam",
        loss="categorical_crossentropy",
        metrics=["categorical_accuracy"])
    
    

我们定义了优化器,它是用于在训练期间最小化损失函数以收敛网络的优化算法。 Adam 代表自适应动量。这里可以使用梯度下降、Nadam、SGD 等。该算法定义了计算梯度以最小化损失函数的方式,这些梯度以链式计算从输出单元开始返回到第 1 层,并相应地调整权重和偏置矩阵。 最后,损失函数是用于在每次迭代时评估网络并确定在迭代训练过程中应如何调整权重的度量。 'metric' 参数通常用于监控其他损失函数/指标。对于这里的分类器,它可以是精度、召回率、准确率等。我们已经在训练期间将 categorical_crossentropy 值视为“损失”,因此它不会作为指标传递。

现在可以调用 model.fit 函数,传递训练数据(或训练和验证数据)、epoch 计数、batch_size 等以开始训练。

希望有帮助!谢谢!

答案 1 :(得分:0)

首先,在这一行:

model = Sequential()

您正在使用包装类来构建顺序模型,该模型的每一层输出都连接到下一层的输入。 您的模型由两层组成,第一层:

  • 获取维度 nFeatures 的输入。
  • 正在使用 relu 函数作为激活。整流器线性单元是一个看起来像这样的函数:
    Relu graph
    对于每个激活函数,它都应用于层的内矩阵积:layers_weights @ input + bias
  • 您可以指定如何初始化 Dense 层的权重,这是通过 kernel_initializer 参数完成的,这里的 random_normal 表示每个权重都将具有正态分布。
  • bias_initializer 与偏置项(添加到内矩阵乘法的项)的想法相同

您的第二层使用另一个激活函数,例如softmax 这在您想要预测概率分布时很有用,例如用于分类任务。\

第三段代码是您编译模型的地方,要编译它,您必须指定两个参数 lossoptimizer

  • loss 是一个函数,它采用模型的预测和真实值,并评估预测的优劣。它们有很多,每个损失函数都有其特殊性。你甚至可以自己定义一个。每一种损失都有一个共同的特点,越少越好。在这里,您使用 categorical_crossentropy 函数,这是一个很好的损失函数来进行多类分类(我假设您就是这样做的)。
  • optimizer 参数采用损失函数输出。并计算模型的每个权重/参数的梯度。有许多不同的优化器,adam 优化器是 AdaGradrmsprop 优化器的组合。如果这些对您没有任何意义,请不要担心。您将在此处找到对 adam 优化器的简要介绍。 Gentle Introduction to the Adam Optimization Algorithm for Deep Learning