自制数据集实现猫狗分类

使用自制数据集训练神经网络模型实现猫狗分类器。使用框架为tensorflow2.网络结构为ResNet,网络结构,4个ResNetBlock,每个结构块4层卷积层,非跳连网络层128个(3×3)卷积核,滑动步长1,特征提取。实线连接网络层(因改变网络结构):128个(1×1)卷积核,滑动步长2特征提取。使用relu激活函数激活,采用分类交叉熵用于loss评判,softmax进行分类回归概率映射。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import os
import sysimport tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense
import pandas as pd
import cv2# x:图片的路径List, y: 图片种类的数字编码List
def get_tensor(x, y):'''训练集、测试集样本生成,训练样本总数为25000个,测试集从总样本中分割,仅对图片数据进行简单处理'''ims = []for i in x:# 读取路径下的图片p = tf.io.read_file(i)# 对图片进行解码,RGB,3通道p = tf.image.decode_jpeg(p)# 修改图片大小为64*64p = tf.image.resize(p, [64, 64])p = tf.cast(p, dtype=tf.float32) / 255.# 将图片压入ims列表中ims.append(p)x_test = ims[20000:]# 将List类型转换为tensor类型,并返回y_test = y[20000:]y = tf.convert_to_tensor(y[:20000])ims = tf.convert_to_tensor(ims[:20000])x_test = tf.convert_to_tensor(x_test)y_test = tf.convert_to_tensor(y_test)return ims, y, x_test, y_test# 训练集图片路径和label保存文件
file = pd.read_csv("./file.csv")x_train = file["path"]
y_train = file["label"]x_train, y_train, x_test, y_test = get_tensor(x_train, y_train)# plt.imshow(x_train[0])
# plt.show()# ResNet结构块
class ResnetBlock(Model):def __init__(self, filters, strides=1, residual_path=False):super(ResnetBlock, self).__init__()self.filters = filtersself.strides = stridesself.residual_path = residual_pathself.c1 = Conv2D(filters, (3, 3), strides=strides, padding='same', use_bias=False)self.b1 = BatchNormalization()self.a1 = Activation('relu')self.c2 = Conv2D(filters, (3, 3), strides=1, padding='same', use_bias=False)self.b2 = BatchNormalization()# residual_path为True时,对输入进行下采样,即用1x1的卷积核做卷积操作,保证x能和F(x)维度相同,顺利相加if residual_path:self.down_c1 = Conv2D(filters, (1, 1), strides=strides, padding='same', use_bias=False)self.down_b1 = BatchNormalization()self.a2 = Activation('relu')def call(self, inputs):residual = inputs  # residual等于输入值本身,即residual=x# 将输入通过卷积、BN层、激活层,计算F(x)x = self.c1(inputs)x = self.b1(x)x = self.a1(x)x = self.c2(x)y = self.b2(x)# residual_path为True时if self.residual_path:residual = self.down_c1(inputs)residual = self.down_b1(residual)out = self.a2(y + residual) return outclass ResNet18(Model):def __init__(self, block_list, initial_filters=128):  # block_list表示每个block有几个卷积层super(ResNet18, self).__init__()self.num_blocks = len(block_list)  # 共有几个blockself.block_list = block_listself.out_filters = initial_filtersself.c1 = Conv2D(self.out_filters, (3, 3), strides=1, padding='same', use_bias=False)self.b1 = BatchNormalization()self.a1 = Activation('relu')self.blocks = tf.keras.models.Sequential()# 构建ResNet网络结构0for block_id in range(len(block_list)):  # 第几个resnet blockfor layer_id in range(block_list[block_id]):  # 第几个卷积层if block_id != 0 and layer_id == 0:  # 对除第一个block以外的每个block的输入进行下采样block = ResnetBlock(self.out_filters, strides=2, residual_path=True)else:block = ResnetBlock(self.out_filters, residual_path=False)self.blocks.add(block)  # 将构建好的block加入resnetself.out_filters *= 2  # 下一个block的卷积核数是上一个block的2倍self.p1 = tf.keras.layers.GlobalAveragePooling2D()self.d1 = Dropout(0.2)self.f1 = tf.keras.layers.Dense(2, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())def call(self, inputs):x = self.c1(inputs)x = self.b1(x)x = self.a1(x)x = self.blocks(x)x = self.p1(x)x = self.d1(x)y = self.f1(x)return ymodel = ResNet18([4, 4, 4, 4])model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),metrics=['sparse_categorical_accuracy'])checkpoint_save_path = "./save/CatDog.ckpt"
if os.path.exists(checkpoint_save_path + '.index'):print('-------------加载模型-----------------')model.load_weights(checkpoint_save_path)cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path, save_weights_only=True,save_best_only=True)
#
history = model.fit(x_train, y_train, validation_data=(x_test, y_test), validation_freq=1, batch_size=32, epochs=10,callbacks=[cp_callback])
model.summary()file = open('weights.txt', 'w')
for v in model.trainable_variables:file.write(str(v.name) + '\n')file.write(str(v.shape) + '\n')file.write(str(v.numpy()) + '\n')
file.close()# 显示训练集和验证集的acc和loss曲线
acc = history.history['sparse_categorical_accuracy']
val_acc = history.history['val_sparse_categorical_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()plt.subplot(1, 2, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()

预测

使用该模型进行预测,100张本地图片最高识别准确率为97%。训练集测试样本准确率97%,测试集识别准确度为92%。

import osimport cv2
import tensorflow as tf
import numpy as np
import sys
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense
from tensorflow.keras.models import Model'''该模型拥有4个ResNetBlock 每个block块3层卷积层,每两个block块第一层实现层差跳连,减少由于多次卷积操作造成的模型退化,提升了模型感知力,提升了模型的识别准确率。使用relu激活函数,使用分类交叉熵损失函数,L2正则化处理。使用自制数据集进行训练,训练集测试样本准确率97%,测试集识别准确度为92%,用非训练图片进行识别,准确率为91%。'''path = sys.path[0] + "\\save\\CatDog_1.ckpt"class ResnetBlock(Model):def __init__(self, filters, strides=1, residual_path=False):super(ResnetBlock, self).__init__()self.filters = filtersself.strides = stridesself.residual_path = residual_pathself.c1 = Conv2D(filters, (3, 3), strides=strides, padding='same', use_bias=False)self.b1 = BatchNormalization()self.a1 = Activation('relu')self.c2 = Conv2D(filters, (3, 3), strides=1, padding='same', use_bias=False)self.b2 = BatchNormalization()# residual_path为True时,对输入进行下采样,即用1x1的卷积核做卷积操作,保证x能和F(x)维度相同,顺利相加if residual_path:self.down_c1 = Conv2D(filters, (1, 1), strides=strides, padding='same', use_bias=False)self.down_b1 = BatchNormalization()self.a2 = Activation('relu')def call(self, inputs):residual = inputs  # residual等于输入值本身,即residual=x# 将输入通过卷积、BN层、激活层,计算F(x)x = self.c1(inputs)x = self.b1(x)x = self.a1(x)x = self.c2(x)y = self.b2(x)if self.residual_path:residual = self.down_c1(inputs)residual = self.down_b1(residual)out = self.a2(y + residual) return outclass ResNet18(Model):def __init__(self, block_list, initial_filters=128):  # block_list表示每个block有几个卷积层super(ResNet18, self).__init__()self.num_blocks = len(block_list)  # 共有几个blockself.block_list = block_listself.out_filters = initial_filtersself.c1 = Conv2D(self.out_filters, (3, 3), strides=1, padding='same', use_bias=False)self.b1 = BatchNormalization()self.a1 = Activation('relu')self.blocks = tf.keras.models.Sequential()# 构建ResNet网络结构0for block_id in range(len(block_list)):  # 第几个resnet blockfor layer_id in range(block_list[block_id]):  # 第几个卷积层if block_id != 0 and layer_id == 0:  # 对除第一个block以外的每个block的输入进行下采样block = ResnetBlock(self.out_filters, strides=2, residual_path=True)else:block = ResnetBlock(self.out_filters, residual_path=False)self.blocks.add(block)  # 将构建好的block加入resnetself.out_filters *= 2  # 下一个block的卷积核数是上一个block的2倍self.p1 = tf.keras.layers.GlobalAveragePooling2D()self.d1 = Dropout(0.2)self.f1 = tf.keras.layers.Dense(2, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())def call(self, inputs):x = self.c1(inputs)x = self.b1(x)x = self.a1(x)x = self.blocks(x)x = self.p1(x)x = self.d1(x)y = self.f1(x)return ymodel = ResNet18([4, 4, 4, 4])# 加载模型进行预测
model.load_weights(filepath=path)# 预测
def predict():path = sys.path[0] + "\\test"images = []for image in [i for i in os.listdir(path) if "jpg" in i]:image = cv2.imread(path + "\\" + image, )image = cv2.resize(image, (64, 64))image = image / 255.image = np.array(image)images.append(image)images = np.array(images)return imagesimages = predict()for i in range(len(images)):res = np.argmax(model.predict(images)[i])if int(res) == 0:tf.print(f"第{i+1}图识别结果为:猫")else:tf.print(f"第{i+1}图识别结果为:狗")# plt.imshow(images[i])# plt.show()image =images[i]cv2.imshow(f"{i}",image)cv2.waitKey(0)cv2.destroyAllWindows()

tensorflow2自制数据集实线猫狗分类相关推荐

  1. 【CNN】搭建AlexNet网络——并处理自定义的数据集(猫狗分类)

    前言 2012年,AlexNet横空出世.它首次证明了学习到的特征可以超越手工设计的特征.它一举打破了计算机视觉研究的现状. AlexNet使用了8层卷积神经网络,并以很大的优势赢得了2012年Ima ...

  2. 利用PyTorch自定义数据集实现猫狗分类

    看了许多关于PyTorch的入门文章,大抵是从torchvision.datasets中自带的数据集进行训练,导致很难把PyTorch运用于自己的数据集上,真正地灵活运用PyTorch. 这里我采用从 ...

  3. 基于kaggle数据集的猫狗识别(超详细版本)

    目录 下载kaggle数据集 创建新的小数据集 构建猫狗分类的小型卷积神经网络 猫狗分类的网络架构 模型的配置 图像的预处理 利用批量生成器拟合模型 绘制精度和损失 结果显示 随机增强后的训练图像显示 ...

  4. 基于MATLAB的Alexnet迁移学习进行猫狗分类(数据集:Kaggle)

    基本介绍 软件:Matlab R2018b 数据集:Kaggle猫狗数据集 网络:AlexNet 前期准备 数据集 Kaggle猫狗数据集猫与狗用于训练的图片(train)分别12500张,每张图片的 ...

  5. Kaggle深度学习与卷积神经网络项目实战-猫狗分类检测数据集

    Kaggle深度学习与卷积神经网络项目实战-猫狗分类检测数据集 一.相关介绍 二.下载数据集 三.代码示例 1.导入keras库,并显示版本号 2.构建网络 3.数据预处理 4.使用数据增强 四.使用 ...

  6. 猫狗分类-VGG16-bottleneck

    文章 一.网络模型训练 二.完整代码 1.导入第三方库 2.载入预测训练的VGG16模型,不包括全连接层 3.对数据进行增强 4.保存卷积层和池化层训练的数据 5.读取数据+给数据添加标签 6.搭建全 ...

  7. Pytorch+CNN+猫狗分类实战

    文章目录 0.前言 1.猫狗分类数据集 1.1数据集下载(可选部分) 1.2数据集分析 2.猫狗分类数据集预处理 2.1训练集和测试集划分 2.2训练集和测试集读取 3.剩余代码 4.总结 0.前言 ...

  8. DL之AlexNet:利用卷积神经网络类AlexNet实现猫狗分类识别(图片数据增强→保存h5模型)

    DL之AlexNet:利用卷积神经网络类AlexNet实现猫狗分类识别(图片数据增强→保存h5模型) 目录 利用卷积神经网络类AlexNet实现猫狗分类识别(图片数据增强→保存h5模型) 设计思路 处 ...

  9. Java软件研发工程师转行之深度学习(Deep Learning)进阶:手写数字识别+人脸识别+图像中物体分类+视频分类+图像与文字特征+猫狗分类

    本文适合于对机器学习和数据挖掘有所了解,想深入研究深度学习的读者 1.对概率基本概率有所了解 2.具有微积分和线性代数的基本知识 3.有一定的编程基础(Python) Java软件研发工程师转行之深度 ...

最新文章

  1. cs6 数据库mysql_能mysql内容
  2. oracle删除unique key,【PK】Oracle 10g删除主键约束后无法删除唯一约束索引问题的模拟与分析...
  3. 攻防世界Reverse第十一题csaw2013reversing2
  4. python变量如何用循环定义_Python学习日记1(变量定义,分支,循环)
  5. basic认证 接口 php,PHP 模拟 HTTP 基本认证(Basic Authentication) - 黄棣-dee - 博客园...
  6. 智慧社区互动教室_利用研究与社区互动
  7. java日历查询代码,查询日历,万年历查询,日历格式JAVA原代码
  8. abap调vb写的dll实现电子天平的读数(带控件版)
  9. Android中添加字串资源出现问题
  10. 【转】Linq 求和,求平均值,求最大,求最小,分组,计数
  11. 《剑指offer》青蛙跳台阶
  12. 小学数学计算机按键名称,数学计算器
  13. 2021/06/20 1+X 大数据应用开发(Java)中级实操考试
  14. java ArrayList 排序
  15. 10个屌炸天的设计网址导航带你嗨翻科技设计界 #精选前端开发设计素材
  16. 应聘高校教师的试讲技巧
  17. 常用的正则表达式,复制粘贴,正则就这么简单
  18. 揭秘淘宝双11,亿级流量高并发是怎么抗住的?
  19. python删除软件后cmd还是返回版本信息
  20. Pythonnet简介

热门文章

  1. Android4.2.2 Gallery2源码分析(1)——从布局入手
  2. 网络管理维护(基本服务)
  3. windows nao naoqi SDK 配置
  4. Rocket-Chip功能说明
  5. cf 1569D - Inconvenient Pairs
  6. 全国计算机等级考试新闻,我市严密措施确保全国计算机等级考试顺利进行
  7. 如何向开源项目提交issue以及为什么开源社区不推荐使用 fastjson库
  8. 敢问出路在何方?——给资深程序员的一封推荐信
  9. 矩阵的特征值与特征向量及性质及相似矩阵
  10. ftp服务器适用网站,使用 WFTPD 搭建 FTP 服务器