都2020年了,汇总tf.keras模型层layers都有哪些

文章目录

      • 1基础层
      • 2卷积网络相关层
      • 3使用示例
        • **示例代码一、搭建LeNet-5神经网络**
        • **示例代码二、搭建AlexNet神经网络**
        • **示例代码三、搭建VGG11神经网络**

tf.keras.layers内置了非常丰富的各种功能的模型层

1基础层

tf.keras.layers.Dense():密集连接层。参数个数 = 输入层特征数× 输出层特征数(weight)+ 输出层特征数(bias)

tf.keras.layers.Activation():激活函数层。一般放在Dense层后面,等价于在Dense层中指定activation。

tf.keras.layers.Dropout():随机置零层。训练期间以一定几率将输入置0,一种正则化手段。

tf.keras.layers.BatchNormalization():批标准化层。通过线性变换将输入批次缩放平移到稳定的均值和标准差。可以增强模型对输入不同分布的适应性,加快模型训练速度,有轻微正则化效果。一般在激活函数之前使用。

tf.keras.layers.SpatialDropout2D():空间随机置零层。训练期间以一定几率将整个特征图置0,一种正则化手段,有利于避免特征图之间过高的相关性。

tf.keras.layers.Input():输入层。通常使用Functional API方式构建模型时作为第一层。

tf.keras.layers.DenseFeature():特征列接入层,用于接收一个特征列列表并产生一个密集连接层。

tf.keras.layers.Flatten():压平层,用于将多维张量压成一维。

tf.keras.layers.Reshape():形状重塑层,改变输入张量的形状。

tf.keras.layers.Concatenate():拼接层,将多个张量在某个维度上拼接。

tf.keras.layers.Add():加法层。

tf.keras.layers.Subtract(): 减法层。

tf.keras.layers.Maximum():取最大值层。

tf.keras.layers.Minimum():取最小值层。

2卷积网络相关层

tf.keras.layers.Conv1D():普通一维卷积,常用于文本。参数个数 = 输入通道数×卷积核尺寸(如3)×卷积核个数

tf.keras.layers.Conv2D():普通二维卷积,常用于图像。参数个数 = 输入通道数×卷积核尺寸(如3乘3)×卷积核个数

tf.keras.layers.Conv3D():普通三维卷积,常用于视频。参数个数 = 输入通道数×卷积核尺寸(如3乘3乘3)×卷积核个数

tf.keras.layers.SeparableConv2D():二维深度可分离卷积层。不同于普通卷积同时对区域和通道操作,深度可分离卷积先操作区域,再操作通道。即先对每个通道做独立卷即先操作区域,再用1乘1卷积跨通道组合即再操作通道。参数个数 = 输入通道数×卷积核尺寸 + 输入通道数×1×1×输出通道数。深度可分离卷积的参数数量一般远小于普通卷积,效果一般也更好。

tf.keras.layers.DepthwiseConv2D():二维深度卷积层。仅有SeparableConv2D前半部分操作,即只操作区域,不操作通道,一般输出通道数和输入通道数相同,但也可以通过设置depth_multiplier让输出通道为输入通道的若干倍数。输出通道数 = 输入通道数 × depth_multiplier。参数个数 = 输入通道数×卷积核尺寸× depth_multiplier。

tf.keras.layers.Conv2DTranspose():二维卷积转置层,俗称反卷积层。并非卷积的逆操作,但在卷积核相同的情况下,当其输入尺寸是卷积操作输出尺寸的情况下,卷积转置的输出尺寸恰好是卷积操作的输入尺寸。

tf.keras.layers.LocallyConnected2D(): 二维局部连接层。类似Conv2D,唯一的差别是没有空间上的权值共享,所以其参数个数远高于二维卷积。

tf.keras.layers.MaxPooling2D(): 二维最大池化层。也称作下采样层。池化层无参数,主要作用是降维。

tf.keras.layers.AveragePooling2D(): 二维平均池化层。

tf.keras.layers.GlobalMaxPool2D(): 全局最大池化层。每个通道仅保留一个值。一般从卷积层过渡到全连接层时使用,是Flatten的替代方案。

tf.keras.layers.GlobalAvgPool2D(): 全局平均池化层。每个通道仅保留一个值。

3使用示例

用到的是tensorflow2.0.0,代码已用中文注释解释。在这里我解释一点如何使用这些模型层函数,我怎么知道要填充什么参数呢?答案就是,一方面从你实际所需出发,一方面可以百度这个函数,用上面我所列举的函数名字。例如你百度“tf.keras.layers.MaxPooling2D”,这个函数的所有解释都出来了。你要做的事情就是收藏好本文,方便自己下次查询即可

示例代码一、搭建LeNet-5神经网络

import tensorflow as tf
from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics, losses

# 1.数据集准备
(x, y), (x_val, y_val) = datasets.mnist.load_data()  # 加载数据集,返回的是两个元组,分别表示训练集和测试集
x = tf.convert_to_tensor(x, dtype=tf.float32) / 255.  # 转换为张量,并缩放到0~1
y = tf.convert_to_tensor(y, dtype=tf.int32)  # 转换为张量(标签)
print(x.shape, y.shape)
train_dataset = tf.data.Dataset.from_tensor_slices((x, y))  # 构建数据集对象
train_dataset = train_dataset.batch(32).repeat(10)  # 设置批量训练的batch为32,要将训练集重复训练10遍

# 2.搭建网络
network = Sequential([  # 搭建网络容器
    layers.Conv2D(6, kernel_size=3, strides=1),  # 第一个卷积层,6个3*3*1卷积核
    layers.MaxPooling2D(pool_size=2, strides=2),  # 池化层,卷积核2*2,步长2
    layers.ReLU(),  # 激活函数
    layers.Conv2D(16, kernel_size=3, strides=1),  # 第二个卷积层,16个3*3*6卷积核
    layers.MaxPooling2D(pool_size=2, strides=2),  # 池化层
    layers.ReLU(),  # 激活函数
    layers.Flatten(),  # 拉直,方便全连接层处理
    layers.Dense(120, activation='relu'),  # 全连接层,120个节点
    layers.Dense(84, activation='relu'),  # 全连接层,84个节点
    layers.Dense(10)  # 输出层,10个节点
])
network.build(input_shape=(None, 28, 28, 1))  # 定义输入,batch_size=32,输入图片大小是28*28,通道数为1。
network.summary()  # 显示出每层的待优化参数量

# 3.模型训练(计算梯度,迭代更新网络参数)
optimizer = optimizers.SGD(lr=0.01)  # 声明采用批量随机梯度下降方法,学习率=0.01
acc_meter = metrics.Accuracy()  # 新建accuracy测量器
for step, (x, y) in enumerate(train_dataset):  # 一次输入batch组数据进行训练
    with tf.GradientTape() as tape:  # 构建梯度记录环境
        x = tf.reshape(x, (32, 28, 28, 1))  # 将输入拉直,[b,28,28]->[b,784]
        # x = tf.extand_dims(x, axis=3)
        out = network(x)  # 输出[b, 10]
        y_onehot = tf.one_hot(y, depth=10)  # one-hot编码
        loss = tf.square(out - y_onehot)
        loss = tf.reduce_sum(loss) / 32  # 定义均方差损失函数,注意此处的32对应为batch的大小
        grads = tape.gradient(loss, network.trainable_variables)  # 计算网络中各个参数的梯度
        optimizer.apply_gradients(zip(grads, network.trainable_variables))  # 更新网络参数
        acc_meter.update_state(tf.argmax(out, axis=1), y)  # 比较预测值与标签,并计算精确度(写入数据,进行求精度)

    if step % 200 == 0:  # 每200个step,打印一次结果
        print('Step', step, ': Loss is: ', float(loss), ' Accuracy: ', acc_meter.result().numpy())  # 读取数据
        acc_meter.reset_states()  # 清零测量器l

示例代码二、搭建AlexNet神经网络

# coding=utf-8
from tensorflow.keras import layers, optimizers, datasets, Sequential, metrics  # 导入TF子库


# 2.网络搭建
network = Sequential([
    # 第一层
    layers.Conv2D(48, kernel_size=11, strides=4, padding=[[0, 0], [2, 2], [2, 2], [0, 0]], activation='relu'),  # 55*55*48
    layers.MaxPooling2D(pool_size=3, strides=2),  # 27*27*48
    # 第二层
    layers.Conv2D(128, kernel_size=5, strides=1, padding=[[0, 0], [2, 2], [2, 2], [0, 0]], activation='relu'),  # 27*27*128
    layers.MaxPooling2D(pool_size=3, strides=2),  # 13*13*128
    # 第三层
    layers.Conv2D(192, kernel_size=3, strides=1, padding=[[0, 0], [1, 1], [1, 1], [0, 0]], activation='relu'),  # 13*13*192
    # 第四层
    layers.Conv2D(192, kernel_size=3, strides=1, padding=[[0, 0], [1, 1], [1, 1], [0, 0]], activation='relu'),  # 13*13*192
    # 第五层
    layers.Conv2D(128, kernel_size=3, strides=1, padding=[[0, 0], [1, 1], [1, 1], [0, 0]], activation='relu'),  # 13*13*128
    layers.MaxPooling2D(pool_size=3, strides=2),  # 6*6*128
    layers.Flatten(),  # 6*6*128=4608
    # 第六层
    layers.Dense(1024, activation='relu'),
    layers.Dropout(rate=0.5),
    # 第七层
    layers.Dense(128, activation='relu'),
    layers.Dropout(rate=0.5),
    # 第八层(输出层)
    layers.Dense(5)
])
network.build(input_shape=(32, 224, 224, 3))  # 设置输入格式
network.summary()  # 显示出每层的待优化参数量

示例代码三、搭建VGG11神经网络

# 搭建VGG11  实验A
network_VGG11 = Sequential([
    # 第一层,padding设置为SAME,则说明输入图片大小和输出图片大小是一致的
    layers.Conv2D(64, kernel_size=3, strides=1, padding='same', activation='relu'),  # 224*224*64
    layers.MaxPooling2D(pool_size=2, strides=2),  # 112*112*64
    # 第二层
    layers.Conv2D(128, kernel_size=3, strides=1, padding='same', activation='relu'),  # 112*112*128
    layers.MaxPooling2D(pool_size=2, strides=2),  # 56*56*128
    # 第三层
    layers.Conv2D(256, kernel_size=3, strides=1, padding='same', activation='relu'),  # 56*56*256
    # 第四层
    layers.Conv2D(256, kernel_size=3, strides=1, padding='same', activation='relu'),  # 56*56*256
    layers.MaxPooling2D(pool_size=2, strides=2),  # 28*28*256
    # 第五层
    layers.Conv2D(512, kernel_size=3, strides=1, padding='same', activation='relu'),  # 28*28*512
    # 第六层
    layers.Conv2D(512, kernel_size=3, strides=1, padding='same', activation='relu'),  # 28*28*512
    layers.MaxPooling2D(pool_size=2, strides=2),  # 14*14*512
    # 第七层
    layers.Conv2D(512, kernel_size=3, strides=1, padding='same', activation='relu'),  # 14*14*512
    # 第八层
    layers.Conv2D(512, kernel_size=3, strides=1, padding='same', activation='relu'),  # 14*14*512
    layers.MaxPooling2D(pool_size=2, strides=2),  # 7*7*512
    layers.Flatten(),  # 拉直 7*7*512
    # 第九层
    layers.Dense(1024, activation='relu'),
    layers.Dropout(rate=0.5),
    # 第十层
    layers.Dense(128, activation='relu'),
    layers.Dropout(rate=0.5),
    # 第十一层
    layers.Dense(5, activation='softmax')
])
network_VGG11.build(input_shape=(None, 224, 224, 3))  # 设置输入格式
# network_VGG11.summary()  # 打印各层参数表

示例代码只是帮助你领悟出搭建模型框架的方法,希望你能自己领悟到我想告诉你的万变不离其宗的思想,搭建出任何自己想要的神经网络

如何搭建自己想要的神经网络模型,看我写的下面的这些文章:
全面小白分析如何使用tensorflow2.0中的Sequential按层顺序创建模型
全面小白分析如何使用tensorflow2.0中的函数式API创建任意结构模型
全面小白分析如何使用tensorflow2.0中Model子类化创建自定义模型

你可能感兴趣的:(都2020年了,汇总tf.keras模型层layers都有哪些)