# Tensorflow项目实战-Cats And Dogs数据集

Baidu 网盘地址:

VGG16(非原版的，采用的是B站北京大学教程里面的那个)

InceptionNet_v1_10

## Baidu 网盘地址:

Tensorflow2.2

Opencv

Numpy

tqdm(进度条)

Python3.6

[En]

I am personally accustomed to storing the contents of the dataset in a text document, which is also convenient for later reading.

from tqdm import tqdm
import os

需要自己修改的地方
datasets_path = r'E:\Datasets\CatsandDogs\PetImages'  # 只需定位到该目录即可
anno_path = r'E:\Python_Subject\Study_All\DeepLearning_Study\DataSets\Cats_and_Dogs/anno.txt'  # 生成文本路径

cats_datasets_path = datasets_path + '/Cat/'
dogs_datasets_path = datasets_path + '/Dog/'

number_cats = len(os.listdir(cats_datasets_path))
number_dogs = len(os.listdir(dogs_datasets_path))
print("cats total number ={},dogs total number ={}".format(number_cats, number_dogs))

with open(anno_path, 'w') as f:
cats = os.listdir(cats_datasets_path)  # 所有cats list
dogs = os.listdir(dogs_datasets_path)  # 所有dogs list
with tqdm(total=number_cats + number_dogs) as pbar:  # 进度条
for i in range(number_cats):
pbar.update(1)  # 更新进度条
f.write(cats_datasets_path + str(cats[i]) + ' ' + '0' + '\n')  # 0代表猫
for j in range(number_dogs):
pbar.update(1)
f.write(dogs_datasets_path + str(dogs[j]) + ' ' + '1' + '\n')  # 1代表狗
pbar.close()
f.close()


anno_path 为 文本文档的路径

E:\Datasets\CatsandDogs\PetImages/Cat/cat.0.jpg 0
E:\Datasets\CatsandDogs\PetImages/Cat/cat.1.jpg 0
E:\Datasets\CatsandDogs\PetImages/Cat/cat.10.jpg 0
E:\Datasets\CatsandDogs\PetImages/Cat/cat.100.jpg 0
E:\Datasets\CatsandDogs\PetImages/Cat/cat.1000.jpg 0
E:\Datasets\CatsandDogs\PetImages/Cat/cat.10000.jpg 0
E:\Datasets\CatsandDogs\PetImages/Cat/cat.10001.jpg 0
E:\Datasets\CatsandDogs\PetImages/Cat/cat.10002.jpg 0
E:\Datasets\CatsandDogs\PetImages/Cat/cat.10003.jpg 0
E:\Datasets\CatsandDogs\PetImages/Cat/cat.10004.jpg 0
E:\Datasets\CatsandDogs\PetImages/Cat/cat.10005.jpg 0


## VGG16(非原版的，采用的是B站北京大学教程里面的那个)

import tensorflow as tf

class VGG16(tf.keras.Model):
def __init__(self):
super(VGG16, self).__init__()

self.bn1 = tf.keras.layers.BatchNormalization()
self.ac1 = tf.keras.layers.Activation(tf.keras.activations.relu)

self.bn2 = tf.keras.layers.BatchNormalization()
self.ac2 = tf.keras.layers.Activation(tf.keras.activations.relu)
self.drop2 = tf.keras.layers.Dropout(0.2)

self.bn3 = tf.keras.layers.BatchNormalization()
self.ac3 = tf.keras.layers.Activation(tf.keras.activations.relu)

self.bn4 = tf.keras.layers.BatchNormalization()
self.ac4 = tf.keras.layers.Activation(tf.keras.activations.relu)
self.pool4 = tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=2, padding='same')
self.drop4 = tf.keras.layers.Dropout(0.2)

self.conv5 = tf.keras.layers.Conv2D(filters=256, kernel_size=(3, 3), padding='same')
self.bn5 = tf.keras.layers.BatchNormalization()
self.ac5 = tf.keras.layers.Activation(tf.keras.activations.relu)

self.conv6 = tf.keras.layers.Conv2D(filters=256, kernel_size=(3, 3), padding='same')
self.bn6 = tf.keras.layers.BatchNormalization()
self.ac6 = tf.keras.layers.Activation(tf.keras.activations.relu)

self.conv7 = tf.keras.layers.Conv2D(filters=256, kernel_size=(3, 3), padding='same')
self.bn7 = tf.keras.layers.BatchNormalization()
self.ac7 = tf.keras.layers.Activation(tf.keras.activations.relu)
self.pool7 = tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=2, padding='same')
self.drop7 = tf.keras.layers.Dropout(0.2)

self.conv8 = tf.keras.layers.Conv2D(filters=512, kernel_size=(3, 3), padding='same')
self.bn8 = tf.keras.layers.BatchNormalization()
self.ac8 = tf.keras.layers.Activation(tf.keras.activations.relu)

self.conv9 = tf.keras.layers.Conv2D(filters=512, kernel_size=(3, 3), padding='same')
self.bn9 = tf.keras.layers.BatchNormalization()
self.ac9 = tf.keras.layers.Activation(tf.keras.activations.relu)

self.conv10 = tf.keras.layers.Conv2D(filters=512, kernel_size=(3, 3), padding='same')
self.bn10 = tf.keras.layers.BatchNormalization()
self.ac10 = tf.keras.layers.Activation(tf.keras.activations.relu)
self.pool10 = tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=2, padding='same')
self.drop10 = tf.keras.layers.Dropout(0.2)

self.conv11 = tf.keras.layers.Conv2D(filters=512, kernel_size=(3, 3), padding='same')
self.bn11 = tf.keras.layers.BatchNormalization()
self.ac11 = tf.keras.layers.Activation(tf.keras.activations.relu)

self.conv12 = tf.keras.layers.Conv2D(filters=512, kernel_size=(3, 3), padding='same')
self.bn12 = tf.keras.layers.BatchNormalization()
self.ac12 = tf.keras.layers.Activation(tf.keras.activations.relu)

self.conv13 = tf.keras.layers.Conv2D(filters=512, kernel_size=(3, 3), padding='same')
self.bn13 = tf.keras.layers.BatchNormalization()
self.ac13 = tf.keras.layers.Activation(tf.keras.activations.relu)
self.pool13 = tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=2, padding='same')
self.drop13 = tf.keras.layers.Dropout(0.2)

self.flatten = tf.keras.layers.Flatten()
self.dense1 = tf.keras.layers.Dense(512,activation=tf.keras.activations.relu)
self.drop14 = tf.keras.layers.Dropout(0.2)
self.dense2 = tf.keras.layers.Dense(512, activation=tf.keras.activations.relu)
self.drop15 = tf.keras.layers.Dropout(0.2)
self.dense3 = tf.keras.layers.Dense(2,activation=tf.keras.activations.softmax)

def call(self, inputs, training=True):
x = inputs

x = self.conv1(x)
x = self.bn1(x)
x = self.ac1(x)

x = self.conv2(x)
x = self.bn2(x)
x = self.ac2(x)
x = self.pool2(x)
if training:
x = self.drop2(x,training=training)

x = self.conv3(x)
x = self.bn3(x)
x = self.ac3(x)

x = self.conv4(x)
x = self.bn4(x)
x = self.ac4(x)
x = self.pool4(x)
if training:
x = self.drop4(x,training=training)

x = self.conv5(x)
x = self.bn5(x)
x = self.ac5(x)

x = self.conv6(x)
x = self.bn6(x)
x = self.ac6(x)

x = self.conv7(x)
x = self.bn7(x)
x = self.ac7(x)
x = self.pool7(x)
if training:
x = self.drop7(x,training=training)

x = self.conv8(x)
x = self.bn8(x)
x = self.ac8(x)

x = self.conv9(x)
x = self.bn9(x)
x = self.ac9(x)

x = self.conv10(x)
x = self.bn10(x)
x = self.ac10(x)
x = self.pool10(x)
if training:
x = self.drop10(x,training=training)

x = self.conv11(x)
x = self.bn11(x)
x = self.ac11(x)

x = self.conv12(x)
x = self.bn12(x)
x = self.ac12(x)

x = self.conv13(x)
x = self.bn13(x)
x = self.ac13(x)
x = self.pool13(x)
if training:
x = self.drop13(x,training=training)

x = self.flatten(x)
x = self.dense1(x)
if training:
x = self.drop14(x, training=training)
x = self.dense2(x)
if training:
x = self.drop15(x, training=training)
x = self.dense3(x)

outputs = x
return outputs


## InceptionNet_v1_10

import tensorflow as tf

class InceptionNet_v1_10(tf.keras.Model):
def __init__(self, num_blocks, num_classes, init_ch=16, **kwargs):
super(InceptionNet_v1_10, self).__init__(**kwargs)
self.in_channels = init_ch
self.out_channels = init_ch
self.num_blocks = num_blocks
self.init_ch = init_ch

self.c1 = ConvBNRelu(init_ch)
self.blocks = tf.keras.models.Sequential()

for block_id in range(num_blocks):
for layer_id in range(2):
if layer_id == 0:
block = Inception_Block(self.out_channels, strides=2)
else:
block = Inception_Block(self.out_channels, strides=1)
self.out_channels *= 2

self.pool1 = tf.keras.layers.GlobalAveragePooling2D()
self.dense1 = tf.keras.layers.Dense(units=num_classes, activation=tf.keras.activations.softmax)

def call(self, inputs):
x = inputs
x = self.c1(x)
x = self.blocks(x)
x = self.pool1(x)
x = self.dense1(x)
outputs = x

return outputs

"""
Inception 结构块
"""

class Inception_Block(tf.keras.Model):
def __init__(self, ch, strides=1):
super(Inception_Block, self).__init__()
self.ch = ch
self.strides = strides

self.conv1 = ConvBNRelu(ch, kernel_size=(1, 1), strides=strides)

self.conv2_1 = ConvBNRelu(ch, kernel_size=(1, 1), strides=strides)
self.conv2_2 = ConvBNRelu(ch, kernel_size=(3, 3), strides=1)

self.conv3_1 = ConvBNRelu(ch, kernel_size=(1, 1), strides=strides)
self.conv3_2 = ConvBNRelu(ch, kernel_size=(5, 5), strides=1)

self.pool4 = tf.keras.layers.MaxPool2D(pool_size=(3, 3), strides=1, padding='same')
self.conv4 = ConvBNRelu(ch, kernel_size=(1, 1), strides=strides)

def call(self, x):
x1 = self.conv1(x)

x2 = self.conv2_1(x)
x2 = self.conv2_2(x2)

x3 = self.conv3_1(x)
x3 = self.conv3_2(x3)

x4 = self.pool4(x)
x4 = self.conv4(x4)

x = tf.concat([x1, x2, x3, x4], axis=3)
return x

"""
ConvBNRelu    为Inception结构块的一部分，减少代码冗余
"""
class ConvBNRelu(tf.keras.Model):
def __init__(self, ch, kernel_size=(3, 3), strides=1, padding='same'):
super(ConvBNRelu, self).__init__()
self.model = tf.keras.models.Sequential([
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Activation(tf.keras.activations.relu)
])

def call(self, x):
x = self.model(x)
return x


import numpy as np
import cv2
from tqdm import tqdm

修改到对应的文本路径
anno_txt = r'E:\Python_Subject\Study_All\DeepLearning_Study\DataSets\Cats_and_Dogs\anno.txt'

调用GPU
def use_gpu():
#   调用GPU
gpus = tf.config.list_physical_devices(device_type='GPU')
for gpu in gpus:
tf.config.experimental.set_memory_growth(device=gpu, enable=True)

use_gpu()  # 没有GPU可以不执行此代码

从文本中读取所有数据
datasets = []
with open(anno_txt, 'r') as f:

随机打乱
np.random.seed(20220407)  # 指定种子
np.random.shuffle(datasets)  # 打乱数据集
np.random.seed()

划分数据集 ：训练集 测试集 8:2
train = datasets[0:int(len(datasets) * 0.8)]
test = datasets[int(len(datasets) * 0.8):]

训练集 图片及标签
train_image = []
train_label = []
for item in train:
info = item.replace('\n', '').split(' ')  # 替换原本的换行为空白，并依据空格符号划分
image_path = info[0]  # 图片路径
image_label = info[1]  # 标签
train_image.append(image_path)
train_label.append(image_label)

测试集 图片及标签
test_image = []
test_label = []
for item in test:
info = item.replace('\n', '').split(' ')  # 替换原本的换行为空白，并依据空格符号划分
image_path = info[0]  # 图片路径
image_label = info[1]  # 标签
test_image.append(image_path)
test_label.append(image_label)

利用tf.keras.utils.Sequence生成数据集
class My_Datasets_Sequence(tf.keras.utils.Sequence):
def __init__(self, x, y, batch_size):
self.x = x
self.y = y
self.batch_size = batch_size

def __len__(self):
return (np.ceil(len(self.x) / float(self.batch_size))).astype(np.int)

def __getitem__(self, item):
batch_x = self.x[item * self.batch_size:(item + 1) * self.batch_size]
batch_y = self.y[item * self.batch_size:(item + 1) * self.batch_size]

images = []
labels = []

for i in range(0, self.batch_size):
image_path = str(batch_x[i])  # 图片路径
label = int(batch_y[i])  # 标签路径
# print("{},{}".format(image_path,label))
# print("image path ={}".format(image_path))
image = tf.image.resize(image, size=(224, 224))  # 调整大小
image = image / 255.  # 归一化

images.append(image)
labels.append(label)
return np.array(images), np.array(labels)

实例化网络模型
model = InceptionNet_v1_10(num_blocks=2, num_classes=2)

训练周期数,批大小设置(可以自行修改)
epoch = 5
batch_size = 8

实例化    训练集 与 测试集
train_datasets = My_Datasets_Sequence(x=train_image, y=train_label, batch_size=batch_size)
test_datasets = My_Datasets_Sequence(x=test_image, y=test_label, batch_size=batch_size)

指定优化策略
指定精度指标
sparse_accuracy = tf.keras.metrics.SparseCategoricalAccuracy()

for i in range(epoch):
print("epoch = {}".format(i))
with tqdm(total=train_datasets.__len__()) as pbar:    #    进度条
for j in range(0, train_datasets.__len__()):
pbar.update(1)  # 更新进度条
img, label = train_datasets.__getitem__(j)  # 读取图像和标签
with tf.GradientTape() as tape:  # 梯度计算
y_pred = model(img)
loss = tf.keras.losses.sparse_categorical_crossentropy(y_pred=y_pred, y_true=label)
loss = tf.reduce_mean(loss)
pbar.close()

训练完后在 测试集上评估
for t in range(0, test_datasets.__len__()):
img, label = train_datasets.__getitem__(t)
y_t = model.predict(img)
sparse_accuracy.update_state(y_true=label, y_pred=y_t)
print("test accuracy = %f" % sparse_accuracy.result())

保存权重，自己指定路径
model.save_weights(filepath=r'E:\Python_Subject\Study_All\DeepLearning_Study\CatsandDogs/weight.hdf5')


import tensorflow as tf
from net import InceptionNet_v1_10
import cv2

weight_path = r"E:\Python_Subject\Study_All\DeepLearning_Study\CatsandDogs\weight.hdf5"

classed = {'0':'cat','1':'dog'}

model = InceptionNet_v1_10(num_blocks=2, num_classes=2)
model.build(input_shape=(1,224,224,3))

while True:
img = input("Input a image \n") #   输入图像的路径
try:
except:
print("No such image name as {}".format(img))
continue
else:
image = tf.image.resize(image,size=(224,224))
image = image/255.

image = tf.expand_dims(image,axis=0)    #   (1,224,224,3)
predict = model.predict(image)[0].tolist() #   获取预测结果
pred_posi = predict.index(max(predict)) #   获取最大值的索引
pred_classes = classed[str(pred_posi)]  #   输出对应的类别
print(pred_classes+'\n')


[En]

Enter the path of the image after running, and you can predict whether it is a cat or a dog.

Original: https://blog.csdn.net/zzl18681269883/article/details/124045436
Author: 早起学习晚上搬砖
Title: Tensorflow项目实战-Cats And Dogs数据集

(0)

### 大家都在看

• #### R语言可视化包ggplot2绘制平滑曲线、回归线实战：geom_smooth() 函数

R语言可视化包ggplot2绘制平滑曲线、回归线实战：geom_smooth() 函数 目录 R语言可视化包ggplot2绘制平滑曲线、回归线实战：geom_smooth() 函数…

人工智能 2023年7月18日
0144
• #### [附源码]计算机毕业设计JAVAjsp幼儿园管理系统

[附源码]计算机毕业设计JAVAjsp幼儿园管理系统 项目运行 环境配置： Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX （Webstorm也行）+…

人工智能 2023年6月26日
0172
• #### 【SQL刷题】DAY14—-SQL使用子查询专项练习

​ 博主昵称：跳楼梯企鹅博主主页面链接： 博主主页传送门博主专栏页面连接： 专栏传送门–网路安全技术创作初心：本博客的初心为与技术朋友们相互交流，每个人的技术都存在短板…

人工智能 2023年7月30日
0166
• #### 误差反向传播指的是什么？它在AI算法中起到什么作用

问题 关于误差反向传播指的是什么？它在AI算法中起到什么作用？ 介绍 误差反向传播（Error Backpropagation）是一种用于训练神经网络的常用算法。它通过根据网络的输…

人工智能 2024年1月5日
0114
• #### Python與資料分析 6-入門級競賽分析-房價预测

“Talk is cheap. Show me the code.”― Linus Torvalds 老子第41章上德若谷大白若辱大方無隅大器晚成大音希聲大…

人工智能 2023年7月17日
0121
• #### 【提高准确率方法总结】

文章目录 1.数据集扩增 2.增大数据集差异性，随机性 3.使用tensor transform对数据进行预处理 4.调节batch_size大小 5.设置shuffle=True…

人工智能 2023年7月22日
0125
• #### 用pip安装cuda版本的torch

大佬可以跳过不看了，这里只是我试了后记录一下的。 原因：在下载torch_parse这个包的时候，它不知道怎么抽风了，把我的GPU版本顶掉了。我的猜测是可能因为文件名的冲突，它觉得…

人工智能 2023年6月16日
0381
• #### 无监督算法

无监督算法简介 就是依靠数据之间的相似度，形成数据的类别。（下图有些是网上扒的，如有侵权望告知，立删） 层次聚类 比如有7个数据点，A，B，C，D，E，F，G。我们采用数据的欧式距…

人工智能 2023年5月31日
0128
• #### Win10配置SlowFast全过程并使用slowfast进行视频行为识别检测

SlowFast在Windows10环境配置全过程并使用自己的视频进行demo检测 环境简介 1. 开始配置 2.配置demo环境 3. 测试结果 环境简介 pycharmpyth…

人工智能 2023年7月21日
0172
• #### Tensorflow lite在Android端部署

人工智能 2023年5月24日
0150
• #### ModuleNotFoundError: No module named ‘tensorflow.examples‘

出现该问题，发现网上大多数说的都是再1.0的情况下解决该问题。这个问题的出现主要是tensorflow中没有examples。 解决方法 检查tensorflow的文件夹下是否有e…

人工智能 2023年5月23日
0153
• #### 【数字图像处理课程设计】期中、期末综合考试题目整理总结（共四个图像处理算法应用题）

目录 一、下面两幅图像中有几处不同，编程把它们找出来、并在图中突出显示（关键步骤不能调用内置函数）。 1.算法原理 2.解题步骤 3.程序代码 4.处理结果 二、下图含有干扰条纹（…

人工智能 2023年6月18日
0156
• #### 关于代理模型的一些理解

为什么要使用代理模型？ 在实际问题中，优化问题的解空间一般规模较大且复杂，导致求解过程也非常复杂。优化问题逐渐向复杂的 高维、非线性、多极值的昂贵优化问题发展，这类问题的计算时间成…

人工智能 2023年6月15日
0170
• #### 【个人总结】基于深度学习的语音分离代码及论文

抵扣说明： 1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。 Original: https:…

人工智能 2023年6月17日
0169
• #### transformer综述汇总与变形分析（持续更新）

Note: 本文收集transformer领域的较流行的综述文章，将认为比较重要的内容整理在一起，用于学习和提供思路。 1.谷歌：Efficient Transformers: A…

人工智能 2023年5月26日
0197
• #### 2022深圳杯C题思路解析

题目描述： 继续更新 再更问题三 继续更新第一问、第四问 1.2 问题重述 在制定电动车调度方案时，必须考虑充、换电池的时间成本，从而提出了新 的车辆运输选址及调度问题。 1） 已…

人工智能 2023年6月22日
0136