深度学习年龄估计:构建 CNN





5.00/5 (3投票s)
在本文中,我们将使用 Keras 框架构建我们设计好的网络。
在本系列文章中,我们将向您展示如何使用深度神经网络 (DNN) 从图像中估计一个人的年龄。
在上一篇文章中,我们设计了用于年龄估计的 CNN 架构。 在本系列文章的第四篇中,我们将使用 Keras 框架构建我们设计好的网络。 Keras 库可以帮助您用最少的代码编写创建 CNN。
定义实例化类
在下面的 Python 代码中,我们引入了一个类,该类具有一个用于网络实例化的静态方法。
from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.normalization import BatchNormalization
from keras.layers.core import Dropout
from keras.layers.core import Flatten
from keras.layers.core import Dense
class ClassLeNet:
@staticmethod
def create(width, height, kernels, hidden, classes):
net = Sequential()
net.add(Conv2D(kernels, (5, 5), padding="same", input_shape=(height, width, 1)))
net.add(Activation("relu"))
net.add(BatchNormalization())
net.add(Conv2D(kernels, (5, 5), padding="same"))
net.add(Activation("relu"))
net.add(BatchNormalization())
net.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
net.add(Conv2D(kernels, (3, 3), padding="same"))
net.add(Activation("relu"))
net.add(BatchNormalization())
net.add(Conv2D(kernels, (3, 3), padding="same"))
net.add(Activation("relu"))
net.add(BatchNormalization())
net.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
net.add(Flatten())
net.add(Dense(hidden))
net.add(Activation("relu"))
net.add(Dropout(0.5))
net.add(Dense(hidden))
net.add(Activation("relu"))
net.add(Dense(classes))
net.add(Activation("softmax"))
return net
导入类和包
上面的代码导入了所需的 Python 包和类。 关于类名的一些说明
BatchNormalization
类是归一化层的实现- Dense 类实现了全连接层
Flatten
类是一个特殊的层,用于在多维层和一维层之间转换数据
我们相信其余的包和类名是不言自明的。
定义 Create 方法
在我们定义的类中,create
方法有五个参数
width
和height
– 输入图像数据的水平和垂直尺寸kernels
– 卷积层中可学习的核的数量hidden
– 隐藏的全连接层中的神经元数量classes
– 用于训练 CNN 的类数
由于我们的网络是前馈 CNN,我们实例化了 Sequential
模型类。
添加层
我们使用多个 add
方法调用来按所需顺序堆叠层。 所有 Conv2D
卷积层的构造函数都提供了以下参数
- 内核的数量
- 内核的大小(5 x 5 或 3 x 3)
- Padding = "same",用于零填充
第一个卷积层是使用一个额外的参数 input_shape
创建的,它指定了输入图像的尺寸。
激活层使用 ReLU 激活函数,该函数由 relu
参数值指定。 最后一个激活层是个例外:它使用 SOFTMAX 函数将输出作为每个类的概率(年龄组)。
池化层使用两个参数进行初始化:pool_size
为 2 x 2,strides
为 2 x 2。这些参数值使每个池化层将宽度和高度减少两倍。
在堆栈的最后部分有三个全连接 (Dense
) 层。 两个隐藏层使用与 hidden
参数值相等的神经元数量进行实例化。 最后一个输出层具有与类数相等的神经元数量。
在两个全连接层之间有一个 dropout 层,概率为 0.5。 注意网络卷积部分和全连接部分之间的 Flatten
层。 这是必需的,因为卷积输出具有三个维度(宽度、高度和内核数量),而全连接输入是一维的。 因此,卷积数据必须转换为 1D 数组,然后才能用作密集层的输入。
实例化模型
通过实现构建 CNN 模型的类,我们可以按如下方式实例化模型
from keras.optimizers import SGD
kernels = 16
hidden = 256
imgsize = 128
classes = 10
net = ClassLeNet.create(imgsize, imgsize, kernels, hidden, classes)
opt = SGD(lr=0.01)
net.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
首先,我们为模型参数赋值
- 图像大小为 128
- 卷积层中可学习的核的数量为 16
- 隐藏的 FC 层中的神经元数量为 256
- 类的数量(年龄组)为 10
然后,我们调用 create
方法使用上述参数值实例化网络模型。 此外,我们需要选择用于训练模型的优化方法。 随机梯度下降 (SGD) 优化器使用学习率值 lr
= 0.01 进行实例化。
最后,使用上述优化器编译模型,使用准确率作为指标,并使用交叉熵作为损失函数(这是分类问题的常见选择)。
下一步
在本文中,我们使用 Keras 框架实现了 CNN 并进行了实例化。 我们的 CNN 实例现在已准备好进行训练。
下一篇文章 将向您展示如何将数据集图像馈送到模型中,并对其进行优化以进行年龄估计。