您现在的位置是:网站首页> 编程资料编程资料
如何利用Tensorflow2进行猫狗分类识别_python_
2023-05-26
296人已围观
简介 如何利用Tensorflow2进行猫狗分类识别_python_
前言
本文参照了大佬Andrew Ng的所讲解的Tensorflow 2视频所写,本文将其中只适用于Linux的功能以及只适用于Google Colab的功能改为了普适的代码同时加入了自己的理解,尚处学习与探索阶段,能力有限,希望大家多多指正。
文章所需代码均在Jupyter Notebook当中实现。
数据集获取
使用tf.keras.utils.get_file()能够从指定的URL当中直接获取数据集,我们在已知网站当中获取到猫狗分类所需图片,为压缩包格式,将其命名为cats_and_dogs_filtered.zip,为该操作设置一个变量path,该变量指向的便是该数据集下载之后存储的路径。
import tensorflow as tf path=tf.keras.utils.get_file('cats_and_dogs_filtered.zip',origin='https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip') print(path)#会输出其路径,和当前notebook文件路径相同 文件解压
使用第三方库zipfile进行文件的解压,下列代码将其解压到了指定的文件夹当中。
import zipfile local_zip = path zip_ref = zipfile.ZipFile(local_zip, 'r') zip_ref.extractall('C:\\Users\\lenovo\\.keras\\datasets') zip_ref.close() 文件夹当中又有两个文件夹,分别用于训练以及验证神经网络模型,每个文件夹当中又包含着两个文件,代表着不同类别的猫与狗的图片所处位置路径。


我们在一个神经网络模型的构建当中,需要训练集(train data)与验证集(validation data)。通俗而言,这里的训练集就是告诉模型猫与狗的外表。而验证集可以检查模型的好坏,评估模型的效果。
将文件分为训练集与验证集
使用os库找到猫狗数据的文件夹的路径,将其根据文件夹划分为数据集。
import os base_dir = 'C:/Users/lenovo/.keras/datasets/cats_and_dogs_filtered' train_dir = os.path.join(base_dir, 'train') validation_dir = os.path.join(base_dir, 'validation') train_cats_dir = os.path.join(train_dir, 'cats') train_dogs_dir = os.path.join(train_dir, 'dogs') validation_cats_dir = os.path.join(validation_dir, 'cats') validation_dogs_dir = os.path.join(validation_dir, 'dogs')
下面来看一看train文件夹当中的cats文件夹和dogs文件夹当中的文件数据。
train_cat_fnames = os.listdir( train_cats_dir ) train_dog_fnames = os.listdir( train_dogs_dir ) print(train_cat_fnames[:10]) print(train_dog_fnames[:10])
['cat.0.jpg', 'cat.1.jpg', 'cat.10.jpg', 'cat.100.jpg', 'cat.101.jpg', 'cat.102.jpg', 'cat.103.jpg', 'cat.104.jpg', 'cat.105.jpg', 'cat.106.jpg'] ['dog.0.jpg', 'dog.1.jpg', 'dog.10.jpg', 'dog.100.jpg', 'dog.101.jpg', 'dog.102.jpg', 'dog.103.jpg', 'dog.104.jpg', 'dog.105.jpg', 'dog.106.jpg']
同时查看文件当中包含图片数据数量的大小。
print('total training cat images :', len(os.listdir(train_cats_dir))) print('total training dog images :', len(os.listdir(train_dogs_dir))) print('total validation cat images :', len(os.listdir(validation_cats_dir))) print('total validation dog images :', len(os.listdir(validation_dogs_dir))) total training cat images : 1000 total training dog images : 1000 total validation cat images : 500 total validation dog images : 500
我们了解到对于猫和狗的数据集,我们都有1000张图片用于训练模型,500张图片用于验证模型效果。
绘图查看
下面对猫狗分类数据集图片进行输出,直观地观察不同图片的异同。
#设置画布大小以及子图个数 %matplotlib inline import matplotlib.image as mpimg import matplotlib.pyplot as plt nrows = 4 ncols = 4 pic_index = 0
绘制八只猫与八只狗图片,观看数据集中图片有哪些特征。
fig = plt.gcf() fig.set_size_inches(ncols*4, nrows*4) pic_index+=8 next_cat_pix = [os.path.join(train_cats_dir, fname) for fname in train_cat_fnames[ pic_index-8:pic_index] ] next_dog_pix = [os.path.join(train_dogs_dir, fname) for fname in train_dog_fnames[ pic_index-8:pic_index] ] for i, img_path in enumerate(next_cat_pix+next_dog_pix): sp = plt.subplot(nrows, ncols, i + 1) sp.axis('Off') img = mpimg.imread(img_path) plt.imshow(img) plt.show() 
通过观察输出图片我们发现图片形状比例各不相同。与简单的手写数字集识别不同的是,手写数字集都是统一的28*28大小的灰度图片,而猫狗数据集是长宽各不同的彩色图片。
模型建立
神经网络模型
model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3)), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(32, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(64, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(512, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') ])
我们考虑将图片全部转化为150*150形状的图片,然后添加一系列的卷积层以及池化层,最后展平再进入DNN.
model.summary()#观察神经网络的参数
输出结果:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 148, 148, 16) 448
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 74, 74, 16) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 72, 72, 32) 4640
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 36, 36, 32) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 34, 34, 64) 18496
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 17, 17, 64) 0
_________________________________________________________________
flatten (Flatten) (None, 18496) 0
_________________________________________________________________
dense (Dense) (None, 512) 9470464
_________________________________________________________________
dense_1 (Dense) (None, 1) 513
=================================================================
Total params: 9,494,561
Trainable params: 9,494,561
Non-trainable params: 0
_________________________________________________________________
Outshape显示了图片在神经网络中的尺寸变化情况,可以看到在连续的神经网络层当中,卷积层将图片尺寸不断缩小,而池化层一直让图片的尺寸减半。
模型编译
接下来我们将进行模型的编译。 我们将使用二值交叉熵binary_crossentropy损失训练我们的模型,因为这是一个二元分类问题,我们的最后一层的激活函数设置为sigmoid,我们将使用学习率为0.001的rmsprop优化器。在训练期间,我们将要监控分类的准确性。
在这种情况下,使用 RMSprop 优化算法比随机梯度下降 (SGD) 更可取,因为 RMSprop 为我们自动调整学习率。 (其他优化器例如Adam和Adagrad,也会在训练期间自动调整学习率,在这里也同样适用。)
from tensorflow.keras.optimizers import RMSprop model.compile(optimizer=RMSprop(lr=0.001), loss='binary_crossentropy', metrics = ['acc'])
数据预处理
让我们设置数据生成器,它将读取我们源文件夹中的图片,将它们转换为张量,并将它们以及它们的标签提供给神经网络。我们将得到一个用于训练图像的生成器和一个用于验证图像的生成器。我们的生成器将批量生成 20 张大小为 150*150 的图像及其标签。
进入神经网络的数据通常应该以某种方式标准化,以使其更易于被神经网络处理。在我们的例子中,我们将通过将像素值归一化为 [0,1] 范围内(最初所有值都在 [0,255] 范围内)来预处理我们的图像。
在 Keras 中,这可以通过使用rescale参数的keras.preprocessing.image.ImageDataGenerator类来完成。ImageDataGenerator 通过.flow(data, labels)或.flow_from_directory(directory)得到数据。然后,这些生成器可以与接受数据生成器作为输入的 Keras 模型方法一起使用:fit_generator、evaluate_generator 和 predict_generator。
from tensorflow.keras.preprocessing.image import ImageDataGenerator #标准化到[0,1] train_datagen = ImageDataGenerator( rescale = 1.0/255. ) test_datagen = ImageDataGenerator( rescale = 1.0/255. ) #批量生成20个大小为大小为 150x150 的图像及其标签用于训练 train_generator = train_datagen.flow_from_directory(train_dir, batch_size=20, class_mode='binary', target_size=(150, 150)) #批量生成20个大小为大小为 150x150 的图像及其标签用于验证 validation_generator = test_datagen.flow_from_directory(validation_dir, batch_size=20, class_mode = 'binary', target_size = (150, 150))
Found 2000 images belonging to 2 classes. Found 1000 images belonging to 2 classes.
模型训练
我们让所有2000张可用图像训练15次,并在所有1000张测试图像上进行验证。
我们持续观察每次训练的值。在每个时期看到4个值——损失、准确度、验证损失和验证准确度。
Loss 和 Accuracy 是训练进度的一个很好的指标。 它对训练数据的分类进行猜测,然后根据训练好的模型对其进行计算结果。 准确度是正确猜测的部分。 验证准确度是对未在训练中使用的数据进行的计算。
history = model.fit_generator(train_generator, validation_data=validation_generator, steps_per_epoch=100, epochs=15, validation_steps=50, verbose=2)
结果:
Epoch 1/15提示: 本文由神整理自网络,如有侵权请联系本站删除!
本站声明:
1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;
2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!
相关内容
- python高阶函数使用教程示例_python_
- python列表生成器常用迭代器示例详解_python_
- python标准库模块之json库的基础用法_python_
- Python命令行参数化的四种方式详解_python_
- pycharm中代码回滚到指定版本的两种实现方法(附带截图展示)_python_
- python编写第一个交互程序步骤示例教程_python_
- python对RabbitMQ的简单入门使用教程_python_
- python函数实例万花筒实现过程_python_
- YOLOv5改进教程之添加注意力机制_python_
- 详解Python中的数据清洗工具flashtext_python_
