神经网络的搭建

神经网络的搭建

接下来我们来构建如下图所示的神经网络模型:

tf.Keras中构建模有两种方式,一种是通过Sequential构建,一种是通过Model类构建。前者是按一定的顺序对层进行堆叠,而后者可以用来构建较复杂的网络模型。首先我们介绍下用来构建网络的全连接层:

tf.keras.layers.Dense(
    units, activation=None, use_bias=True, kernel_initializer='glorot_uniform',
    bias_initializer='zeros')

主要参数:

  • units: 当前层中包含的神经元个数
  • Activation: 激活函数,relu,sigmoid等
  • use_bias: 是否使用偏置,默认使用偏置
  • Kernel_initializer: 权重的初始化方式,默认是Xavier初始化
  • bias_initializer: 偏置的初始化方式,默认为0

Sequential() 提供一个层的列表,就能快速地建立一个神经网络模型,实现方法如下所示:

导入相关的工具包
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
定义一个Sequential模型,包含3层
model = keras.Sequential(
    [
        # 第一层:激活函数为relu,权重初始化为he_normal
        layers.Dense(3, activation="relu",
                     kernel_initializer="he_normal", name="layer1",input_shape=(3,)),
        # 第二层:激活函数为relu,权重初始化为he_normal
        layers.Dense(2, activation="relu",
                     kernel_initializer="he_normal", name="layer2"),
        # 第三层(输出层):激活函数为sigmoid,权重初始化为he_normal
        layers.Dense(2, activation="sigmoid",
                     kernel_initializer="he_normal", name="layer3"),
    ],
    name="my_Sequential"
)

接下来我们使用:

展示模型结果
model.summary()

如下所示:

Model: "my_Sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
layer1 (Dense)               (None, 3)                 12
_________________________________________________________________
layer2 (Dense)               (None, 2)                 8
_________________________________________________________________
layer3 (Dense)               (None, 2)                 6
=================================================================
Total params: 26
Trainable params: 26
Non-trainable params: 0
_________________________________________________________________

通过这种sequential的方式只能构建简单的序列模型,较复杂的模型没有办法实现。

【扩展📚:参数量计算】

以第一个隐层为例:该隐层有3个神经元,每个神经元的参数为:4个(w1,w2,w3,b1),所以一共用3×4=12个参数。

tf.keras 提供了 Functional API,建立更为复杂的模型,使用方法是将层作为可调用的对象并返回张量,并将输入向量和输出向量提供给 tf.keras.Modelinputsoutputs 参数,实现方法如下:

导入工具包
import tensorflow as tf
定义模型的输入
inputs = tf.keras.Input(shape=(3,),name = "input")
第一层:激活函数为relu,其他默认
x = tf.keras.layers.Dense(3, activation="relu",name = "layer1")(inputs)
第二层:激活函数为relu,其他默认
x = tf.keras.layers.Dense(2, activation="relu",name = "layer2")(x)
第三层(输出层):激活函数为sigmoid
outputs = tf.keras.layers.Dense(2, activation="sigmoid",name = "layer3")(x)
使用Model来创建模型,指明输入和输出
model = tf.keras.Model(inputs=inputs, outputs=outputs,name="my_model")

同样通过:

展示模型结果
model.summary()

结果如下所示:

Model: "my_model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input (InputLayer)           [(None, 3)]               0
_________________________________________________________________
layer1 (Dense)               (None, 3)                 12
_________________________________________________________________
layer2 (Dense)               (None, 2)                 8
_________________________________________________________________
layer3 (Dense)               (None, 2)                 6
=================================================================
Total params: 26
Trainable params: 26
Non-trainable params: 0
_________________________________________________________________

另外也可以通过:

模型展示
keras.utils.plot_model(model,show_shapes=True)

通过model的子类构建模型,此时需要在__init__中定义神经网络的层,在call方法中定义网络的前向传播过程,实现方法如下:

导入工具包
import tensorflow as tf
定义model的子类
class MyModel(tf.keras.Model):
    # 在init方法中定义网络的层结构
    def __init__(self):
        super(MyModel, self).__init__()
        # 第一层:激活函数为relu,权重初始化为he_normal
        self.layer1 = tf.keras.layers.Dense(3, activation="relu",
                     kernel_initializer="he_normal", name="layer1",input_shape=(3,))
        # 第二层:激活函数为relu,权重初始化为he_normal
        self.layer2 =tf.keras.layers.Dense(2, activation="relu",
                     kernel_initializer="he_normal", name="layer2")
        # 第三层(输出层):激活函数为sigmoid,权重初始化为he_normal
        self.layer3 =tf.keras.layers.Dense(2, activation="sigmoid",
                     kernel_initializer="he_normal", name="layer3")
    # 在call方法中万完成前向传播
    def call(self, inputs):
        x = self.layer1(inputs)
        x = self.layer2(x)
        return self.layer3(x)
实例化模型
model = MyModel()
设置一个输入,调用模型(否则无法使用summay())
x = tf.ones((1, 3))
y = model(x)

同样的我们也可以通过summay方法来查看模型构建的结果

5 神经网络的优缺点

  • 黑箱,很难解释模型是怎么工作的
  • 训练时间长,需要大量的计算力
  • 网络结构复杂,需要调整超参数
  • 小数据集上表现不佳,容易发生过拟合

Original: https://blog.csdn.net/weixin_46556352/article/details/124076145
Author: AI耽误的大厨
Title: 神经网络的搭建

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/691685/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球