深度学习是机器学习的一个新兴领域,属于机器学习的子集,通过人工神经网络从过去的样本或经验中进行学习。深度学习使用深层神经网络,其中“深度”一词表示除了输入和输出层之外,还包含一个或多个隐藏层。
人工神经网络由神经元构成,这些神经元是网络的核心处理单元。为了更好地理解,可以参考下面的图表。在给定的图表中,首先有“输入层”,其中神经元被输入的训练观察值所激活。然后是“隐藏层”,它执行网络所需的大部分计算。最后是“输出层”,它预测从前两层提取的最终输出。
例如,如果将图像作为输入,每个像素作为输入传递给第一层的每个神经元。一个层的神经元通过“通道”连接到下一层。每个通道都被赋予一个数值,称为“权重”。输入(x1, x2, ..., xn)乘以它们对应的权重,它们的和被发送到隐藏层的神经元。每个神经元都与一个数值相关联,称为“偏置”,进一步加到输入和上。这个值然后通过一个称为“激活函数”的阈值函数,决定特定的神经元是否会被激活。激活的神经元将数据传输到下一层的神经元。因此,数据通过网络传播,具有最高值的神经元决定输出。
深度神经网络包括以下几种类型:人工神经网络、多层感知器、递归神经网络和卷积神经网络。
卷积神经网络是一种深度神经网络,它从输入图像中提取特征,以执行特定任务,如图像分类、面部识别和语义图像系统。CNN具有一个或多个卷积层,用于简单的特征提取,执行卷积操作(即与输入的一组权重相乘)同时保留关键特征(空间和时间信息),无需人为监督。
CNN是必要的,因为它是图像分类问题的一种重要且更准确的方法。使用人工神经网络时,2D图像首先需要转换为1维向量,然后才能训练模型。此外,随着图像大小的增加,训练参数的数量会呈指数级增长,导致存储空间的损失。而且,ANN无法捕获序列数据所需的顺序信息。因此,CNN始终是处理2D图像分类问题的优选方法,因为它能够将图像作为数据进行处理,从而提供更高的准确性。
定义卷积神经网络结构的三个主要层是:卷积层、池化层和全连接层。
1) 卷积层:这是卷积网络的第一层,通过在输入图像上滑动滤波器来执行特征提取。输出或卷积特征是滤波器在图像中的元素乘积和每次滑动动作的总和。输出层,也称为特征图,对应于原始图像中的曲线、锐利边缘、纹理等。在具有更多卷积层的网络中,初始层用于提取通用特征,而随着网络的深入,复杂部分被移除。
2) 池化层:这层的主要目的是通过减少图像的空间尺寸来减少可训练参数的数量,从而降低计算成本。图像深度保持不变,因为池化是在每个深度维度上独立进行的。最大池化是最常见的池化方法,它从特征图中获取最重要的元素作为输入。然后执行最大池化,以在保留关键信息的同时大大减少输出图像的尺寸。
# 导入必要的库
import cv2
import os
import numpy as np
import pandas as pd
import sklearn
import keras
from keras.models import Sequential
import tensorflow as tf
from keras.preprocessing.image import ImageDataGenerator
# 数据预处理
train_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)
train_generator = train_datagen.flow_from_directory(r"C:/dogs_vs_cats/train", target_size=(64,64), batch_size=32, class_mode='binary')
test_datagen = ImageDataGenerator(rescale=1./255)
validation_generator = test_datagen.flow_from_directory(r"C:/dogs_vs_cats/test", target_size=(64,64), batch_size=32, class_mode='binary')
# 构建CNN模型
cnn = tf.keras.models.Sequential()
cnn.add(tf.keras.layers.Conv2D(filters=32, kernel_size=3, activation='relu', input_shape=[64,64,3]))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))
cnn.add(tf.keras.layers.Conv2D(filters=32, kernel_size=3, activation='relu'))
cnn.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))
cnn.add(tf.keras.layers.Flatten())
cnn.add(tf.keras.layers.Dense(units=128, activation='relu'))
cnn.add(tf.keras.layers.Dense(units=128, activation='relu'))
cnn.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
cnn.summary()
# 训练模型
cnn.fit(x=train_generator, validation_data=validation_generator, epochs=25)