前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tensorflow2——卷积神经网络之猫狗识别

Tensorflow2——卷积神经网络之猫狗识别

作者头像
Albert_xiong
发布2021-06-21 16:37:08
1.5K0
发布2021-06-21 16:37:08
举报
文章被收录于专栏:Mybatis学习Mybatis学习

今天复习了一下卷积神经网络的猫狗识别部分,主要还是加强了数据的读取和数据的预处理这一部分。 学会用tf.data去创建数据集,用tf.keras来创建模型,直接上代码。

这里写目录标题

1、卷积神经网络之猫狗识别

1)数据集的创建

lambda的详情可参考:链接: 关于Python中的lambda,这篇阅读量10万+的文章可能是你见过的最完整的讲解.

代码语言:javascript
复制
import tensorflow as tf 
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np
import glob
import matplotlib.pyplot as plt

#使用tf.data来读取数据集 
#使用tf.keras来搭建网络

image_filenames=glob.glob("./dc_2000/train/*.jpg")  #读取train的所有图片,获取的图片的路径
#对路径进行乱序
image_filenames=np.random.permutation(image_filenames)

#此处lambda与map合用相当于:lambda函数用于指定对列表image_filenames中每一个元素的共同操作若==成立,表示当前标签为cat,label=1; 若当前标签为dog,则label=0。
train_labels = list(map(lambda x: float(x.split('\\')[1].split('.')[0] == 'cat'), image_filenames))
#这里的x其实就是后面的image_filenames(参考map函数和lambda函数的用法)

train_dataset=tf.data.Dataset.from_tensor_slices((image_filenames,train_labels)) #创建dataset

2)图片数据预处理

tf.data.Dataset.shuffle(buffer_size)中buffer_size的理解.

代码语言:javascript
复制
def _pre_read(image_filename,label):
    #读取图片
    image=tf.io.read_file(image_filename)
    #解码图片
    image=tf.image.decode_jpeg(image,channels=3)
    #转换图片的大小
    image=tf.image.resize(image,(200,200))
    image=tf.reshape(image,[200,200,3])
    #图片归一化
    image=image//255
    return image,label


train_dataset=train_dataset.map(_pre_read)   #对数据集进行图片预处理
train_dataset=train_dataset.shuffle(300)   #乱序
train_dataset=train_dataset.repeat()
train_dataset=train_dataset.batch(32)    
#建立好网络之后,直接从dataset中取读取 
#<BatchDataset shapes: ((None, 200, 200, 3), (None,)), types: (tf.float32, tf.float32)>

3)模型的创建与训练

代码语言:javascript
复制
#创建模型
model=keras.Sequential()
model.add(layers.Conv2D(64,(3,3),activation="relu",input_shape=(200,200,3)))
model.add(layers.MaxPool2D(2,2))

model.add(layers.Conv2D(64,(3,3),activation="relu"))
model.add(layers.MaxPool2D(2,2))
model.add(layers.Dropout(0.5))

model.add(layers.GlobalAveragePooling2D())
model.add(layers.Dense(32,activation="relu"))
model.add(layers.Dense(1,activation="sigmoid"))

model.summary()

model.compile(optimizer="adam",loss="binary_crossentropy",metrics=["acc"])

#经过多少个step完成一个epoch,因为之前的数据集repeat()为无限次
train_step_per_epoch=len(image_filenames)//32

history=model.fit(train_dataset,epochs=30,steps_per_epoch=train_step_per_epoch)

4)绘图展示

代码语言:javascript
复制
history.history.keys()
plt.plot(history.epoch,history.history.get("loss"))
plt.plot(history.epoch,history.history.get("acc"))

loss的变化:

在这里插入图片描述
在这里插入图片描述

acc的变化:

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 这里写目录标题
  • 1、卷积神经网络之猫狗识别
    • 1)数据集的创建
      • 2)图片数据预处理
        • 3)模型的创建与训练
          • 4)绘图展示
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档