利用深度学习实现猫狗动物识别,采用Kaggle提供的公开数据集,训练深度学习模型,对测试集猫狗中的图片准确分类。通过该实验掌握深度学习中基本的CV处理过程。
二、实验原理(1)采用用卷积神经网络训练 卷积神经网络由一个或多个卷积层和顶端的全连通层(对应经典的神经网络)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网络能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网络在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网络,卷积神经网络需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 (2)卷积层 设 f(x),g(x) 是 R 上的两个可积函数,则卷积定义为:
离散形式定义为:
下图展示了一步计算的具体过程
(3)非线性层 非线性层并不是 CNN 特有的网络层,一般情况下会使用 ReLU 作为模型的激活函数。 (4)池化层 池化层 是一个利用 池化函数 (pooling function) 对网络输出进行进一步调整的网络层。池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。常用的池化函数包括最大池化 (max pooling) 函数 (即给出邻域内的最大值) 和平均池化 (average pooling) 函数 (即给出邻域内的平均值) 等。但无论选择何种池化函数,当对输入做出少量平移时,池化对输入的表示都近似 不变 (invariant)。局部平移不变性 是一个很重要的性质,尤其是当我们关心某个特征是否出现而不关心它出现的位置时。 池化层同卷积层类似,具有三个比较重要的参数:pool_size,strides 和 padding,分别表示池化窗口的大小,步长以及是否对图像的外侧进行补零操作。池化层同时也能够提高网络的计算效率 (5)全连接层 全链接层 (Fully-connected or Dense Layer) 的目的就是将我们最后一个池化层的输出连接到最终的输出节点上。例如,最后一个池化层的输出大小为 [5×5×16],也就是有 5×5×16=400 个节点,对于手写数字识别的问题,我们的输出为 0 至 9 共 10 个数字,采用 one-hot 编码的话,输出层共 10 个节点。例如在 LeNet 中有 2 个全连接层,每层的节点数分别为 120 和 84,在实际应用中,通常全连接层的节点数会逐层递减。需要注意的是,在进行编码的时候,第一个全连接层并不是直接与最后一个池化层相连,而是先对池化层进行 flatten 操作,使其变成一个一维向量后再与全连接层相连。 (6)输出层 输出层根据具体问题的不同会略有不同,例如对于手写数字识别问题,采用 one-hot 编码的话,输出层则包含 10 个节点。对于回归或二分类问题,输出层则仅包含 1 个节点。当然对于二分类问题,我们也可以像多分类问题一样将其利用 one-hot 进行编码,例如 [1,0] 表示类型 0,[0,1] 表示类型 1。
三、实验内容【代码下载-实现不易,顺便star一下啦】https://github.com/823316627bandeng/TensorFlow2_keras_Demo- (1)训练模型 数据集:采用kaggle公开的猫狗数据集,文件名称是cat..jpg或dog..jpg 神经网络:卷积神经网络 损失函数:分类交叉熵 优化器:Adam 评价准则:准确率 Epochs:100 (2)测试模型 测试集:采用kaggle公开的猫狗测试集,没有标签 (3)环境 python 3.8 Tensorflow 2.3 numpy pandas matplotlib cv2
四、实验过程(1)数据集的准备 猫狗识别的数据集依旧可以从Kaggle上下载,数据集下载链接:https://www.kaggle.com/c/dogs-vs-cats 用Python进行处理分类,文件夹train里面放着25000张图像,猫和狗的图像分别都是12500张,图像名称上都有标明类别。文件夹test里面放的是测试集,里面有12500张图像,都没有标签,要自己来预测分类。
import shutil
import os
def remove_file(old_path, new_path):
print(old_path)
print(new_path)
filelist = os.listdir(old_path) # 列出该目录下的所有文件,listdir返回的文件列表是不包含路径的。
# print(filelist)
cat_n =0
dog_n = 0
for file in filelist:
src = os.path.join(old_path, file)
if not os.path.isfile(src):
continue
animal_str = str(file).split('.')[0]
if animal_str =='cat':
if cat_n
关注
打赏
- 【文献汇总】2019-2021最新应用深度学习到OFDM通信系统中的论文汇总(实时更新)
- 【金融量化】电话口试-智力题
- 【数据挖掘】2022年2023届秋招爱玩特智能量化研究员岗 笔试题
- 【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
- 【Leetcode刷题Python】50. Pow(x, n)
- 【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
- 【Leetcode刷题Python】73. 矩阵置零
- 【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
- 【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
- 【数据挖掘】2022年2023届秋招Kanaries雾角科技算法岗 笔试题