一、说明
卷积,池化,激活函数,这三者号称是深度神经网络的三驾马车;其中卷积是最复杂的一个,因此,对卷积这个东西需要精心认知,这样对后面学习大有帮助。本篇为系列博文,专门介绍Ceras库的各种API的应用方法,力求从根本上学习 。
二、卷积层(Conv2D层)
该层一个流动性创建,该流动性与层输入以产生输出张量。如果 use_bias 为 True,则创建一个偏置允许将其添加到输出中。最后,如果激活不是无,则创建一个偏置评估输出。
启用图层模型中的第一层时,请提供关键字参数input_shape(整数元组或None,不包括结束轴),例如input_shape=(128, 128, 3)对于data_format=“中的128x128 RGB图片channels_last。
- 函数名称:
keras_core.layers.Conv2D()
- 函数原型:
keras_core.layers.Conv2D(
filters,
kernel_size,
strides=(1, 1),
padding="valid",
data_format=None,
dilation_rate=(1, 1),
groups=1,
activation=None,
use_bias=True,
kernel_initializer="glorot_uniform",
bias_initializer="zeros",
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
**kwargs
)
- 2D 卷积层描述。
该层创建一个卷积核,该卷积核与单个空间(或时间)维度上的层输入进行卷积,以产生输出张量。如果use_bias
为 True,则创建偏置向量并将其添加到输出中。最后,如果activation
不是None
,它也应用于输出。
- 参数解释
参数名称 | 格式 | 意义 | 描述对象【输入,输出 】 |
---|---|---|---|
filters | int | 输出空间的维度(卷积中过滤器的数量) | 是输出 |
kernel_size | (int,int) | 一个整数或 2 个整数的元组/列表,指定 2D 卷积窗口的高度和宽度。可以是单个整数,为所有空间维度指定相同的值。 | 内部 |
strides | (int,int) | int 或 2 个整数的元组/列表,指定卷积的步长。strides > 1 与 dilation_rate > 1 不兼容。(dilation_rate是膨胀卷积,以后再谈 ) | 内部 |
padding | 字符串(‘
| ,"valid" 或者"same" (不区分大小写)。 "valid" 意味着没有填充。"same" 结果均匀地填充到输入的左/右或上/下,使得输出具有与输入相同的高度/宽度尺寸。 | 内部 |
data_format | 字符串
| 或
如果您从未设置过它,那么它将是 | |
dilation_rate | int | 或 2 个整数的元组/列表,指定用于扩张卷积的扩张率。 | |
groups | int | 一个正整数,指定输入沿通道轴分割的组数。每组分别与filters // groups 滤波器进行卷积。输出是所有结果groups 沿通道轴的串联。输入通道 和filters 必须都能被 整除groups 。 | |
activation | 字符串 | 激活函数。如果None ,则不应用任何激活。 | |
use_bias | bool | 如果True ,偏差将添加到输出中。 | |
kernel_initializer | 函数指针 | 卷积核的初始化器。如果,则将使用None 默认初始化程序 ( )。"glorot_uniform" | |
bias_initializer | 函数指针 | :偏置向量的初始化器。如果,则将使用None 默认初始化程序 ( )。"zeros" | |
kernel_regularizer | 函数指针 | 卷积核的可选正则化器。 | |
bias_regularizer | 函数指针 | :偏置向量的可选正则化器。 | |
Activity_regularizer | 函数指针 | :输出的可选正则化函数。 | |
kernel_constraint: | 函数指针 | 可选的投影函数,在更新后应用于内核Optimizer (例如,用于实现层权重的范数约束或值约束)。该函数必须将未投影变量作为输入,并且必须返回投影变量(必须具有相同的形状)。进行异步分布式训练时,使用约束并不安全。 | |
bias_constraint | 函数指针 | 可选的投影函数,在由 更新后应用于偏差Optimizer 。 |
输入形状
形状为batch_shape + (channels, rows, cols)
if 的 4+D 张量data_format='channels_first'
或 形状为batch_shape + (rows, cols, channels)
if 的 4+D 张量data_format='channels_last'
。
输出形状
形状为batch_shape + (filters, new_rows, new_cols)
if 的 4+D 张量data_format='channels_first'
或 形状为batch_shape + (new_rows, new_cols, filters)
if的 4+D 张量data_format='channels_last'
。 rows
并且cols
值可能由于填充而发生变化。
返回
表示 的 4D 张量activation(conv2d(inputs, kernel) + bias)
。
提高
- ValueError:当
strides > 1
和 都存在时dilation_rate > 1
。
三、参考示例
3.1 验证输入和输出
>>> # The inputs are 28x28 RGB images with `channels_last` and the batch
>>> # size is 4.
>>> input_shape = (4, 28, 28, 3)
>>> x = tf.random.normal(input_shape)
>>> y = tf.keras.layers.Conv2D(
... 2, 3, activation='relu', input_shape=input_shape[1:])(x)
>>> print(y.shape)
(4, 26, 26, 2)
3.2 验证膨胀卷积
>>> # With `dilation_rate` as 2.
>>> input_shape = (4, 28, 28, 3)
>>> x = tf.random.normal(input_shape)
>>> y = tf.keras.layers.Conv2D(
... 2, 3,
... activation='relu',
... dilation_rate=2,
... input_shape=input_shape[1:])(x)
>>> print(y.shape)
(4, 24, 24, 2)
3.3 验证卷积前填充
>>> # With `padding` as "same".
>>> input_shape = (4, 28, 28, 3)
>>> x = tf.random.normal(input_shape)
>>> y = tf.keras.layers.Conv2D(
... 2, 3, activation='relu', padding="same", input_shape=input_shape[1:])(x)
>>> print(y.shape)
(4, 28, 28, 2)
3.4 验证将batch-size扩展成张量维度
>>> # With extended batch shape [4, 7]:
>>> input_shape = (4, 7, 28, 28, 3)
>>> x = tf.random.normal(input_shape)
>>> y = tf.keras.layers.Conv2D(
... 2, 3, activation='relu', input_shape=input_shape[2:])(x)
>>> print(y.shape)
(4, 7, 26, 26, 2)
四、实现一个深度网络
4.1 代码和项目介绍
我们搭建简单网络,该网络能跑起来,但并不保证有多么有效,相反,我们要逐步改进其弱点,实现更高效能。
4.2 数据集导入
导入cifar10数据集,以下两步完成:
from tensorflow.keras.datasets import cifar10
# Load the CIFAR-10 dataset
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
4.3 项目设计
网络结构预先设计好,比如,下图详细描述了一个图片输入,卷积-连接层的分类神经网络,以及实现步骤。详细代码见下端。
4.4 模型实现
- 模型实现是通过管道完成:model = Sequential( [ list ] )
- 模型生成后需要编译,编译过后执行速度提升。model.compile。此处定义代价函数。
- 训练定义和执行。model.fit 训练。
4.5 代码实现
# Image Classification with Convolutional Neural Networks (CNN)
import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
# Load the CIFAR-10 dataset
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
# Preprocess the data
x_train, x_test = x_train / 255.0, x_test / 255.0
# Build a CNN model
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),
MaxPooling2D((2, 2)),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D((2, 2)),
Conv2D(64, (3, 3), activation='relu'),
Flatten(),
Dense(64, activation='relu'),
Dense(10)
])
# Compile the model
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
# Train the model
model.fit(x_train, y_train, epochs=20, validation_data=(x_test, y_test))