基于Keras的卷积神经网络用于猫狗分类(进行了数据增强)+卷积层可视化

接着我上一篇博客,https://blog.csdn.net/fanzonghao/article/details/81149153。

在上一篇基础上对数据集进行数据增强。函数如下:

"""
查看图像增强是否发生作用
"""
def see_pic_aug():train_datagen = ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest')# 从训练集例返回图片的地址train_dir, validation_dir, cat_img_files, dog_img_files = data_read.read_data()# 返回随机一张图片的地址img_path = random.choice(cat_img_files + dog_img_files)img = load_img(img_path, target_size=(150, 150))x = img_to_array(img)# 变成(1,150,150,3)x = x.reshape((1,) + x.shape)i = 0for batch in train_datagen.flow(x, batch_size=1):plt.figure(i)plt.imshow(array_to_img(batch[0]))i += 1if i % 5 == 0:breakplt.show()

打印5张查看:

确实发生了一些改变。

下面就用数据增强的样本训练模型,代码如下:

import numpy as np
import matplotlib.pyplot as plt
import random
import data_read
import tensorflow as tf
from keras.models import Model
from keras import  layers,optimizers
from keras import backend as K
from keras.preprocessing.image import ImageDataGenerator,img_to_array,load_img,array_to_img
"""
获得所需求的图片--进行了图像增强
"""
def data_deal_overfit():# 获取数据的路径train_dir, validation_dir, next_cat_pix, next_dog_pix = data_read.read_data()#图像增强train_datagen=ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest')test_datagen=ImageDataGenerator(rescale=1./255)#从文件夹获取所需要求的图片train_generator=train_datagen.flow_from_directory(train_dir,target_size=(150,150),batch_size=20,class_mode='binary')test_generator = test_datagen.flow_from_directory(validation_dir,target_size=(150, 150),batch_size=20,class_mode='binary')return train_generator,test_generator
"""
定义模型并加入了dropout
"""
def define_model():
#定义TF backend session# tf_config=tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True))# K.set_session(tf.Session(config=tf_config))#卷积过程 三层卷积img_input=layers.Input(shape=(150,150,3))x=layers.Conv2D(filters=16,kernel_size=(3,3),activation='relu')(img_input)print('第一次卷积尺寸={}'.format(x.shape))x=layers.MaxPooling2D(strides=(2,2))(x)print('第一次池化尺寸={}'.format(x.shape))x=layers.Conv2D(filters=32,kernel_size=(3,3),activation='relu')(x)print('第二次卷积尺寸={}'.format(x.shape))x=layers.MaxPooling2D(strides=(2,2))(x)print('第二次池化尺寸={}'.format(x.shape))x=layers.Conv2D(filters=64,kernel_size=(3,3),activation='relu')(x)print('第三次卷积尺寸={}'.format(x.shape))x=layers.MaxPooling2D(strides=(2,2))(x)print('第三次池化尺寸={}'.format(x.shape))#全连接层x=layers.Flatten()(x)x=layers.Dense(512,activation='relu')(x)output=layers.Dense(1,activation='sigmoid')(x)model=Model(inputs=img_input,outputs=output,name='CAT_DOG_Model')return img_input,model
"""
训练模型
"""
def train_model():#构建网络模型img_input,model=define_model()#编译模型model.compile(optimizer=optimizers.RMSprop(lr=0.001),loss='binary_crossentropy',metrics=['accuracy'])train_generator,test_generator=data_deal_overfit()#verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录#训练模型 返回history包含各种精度和损失history=model.fit_generator(train_generator,steps_per_epoch=100,#2000 images=batch_szie*stepsepochs=1,validation_data=test_generator,validation_steps=50,#1000=20*50verbose=2)# 模型参数个数model.summary()#精度acc=history.history['acc']val_acc=history.history['val_acc']#损失loss=history.history['loss']val_loss=history.history['val_loss']#epochs的数量epochs=range(len(acc))plt.plot(epochs,acc)plt.plot(epochs, val_acc)plt.title('training and validation accuracy')plt.figure()plt.plot(epochs, loss)plt.plot(epochs, val_loss)plt.title('training and validation loss')plt.show()#测试图片# 从训练集例返回图片的地址train_dir, validation_dir, cat_img_files, dog_img_files = data_read.read_data()# 返回随机一张图片的地址img_path = random.choice(cat_img_files + dog_img_files)img = load_img(img_path, target_size=(150, 150))plt.imshow(img)plt.show()x = img_to_array(img)# 变成(1,150,150,3)x = x.reshape((1,) + x.shape)y_pred=model.predict(x)print('预测值y={}'.format(y_pred))#图形化形式查看卷积层生成的图
def visualize_model():img_input,model=define_model()# print(model.layers)#存储每一层的tensor的shape 类型等successive_outputs=[layer.output for layer in model.layers]# print(successive_outputs)visualization_model=Model(img_input,successive_outputs)#从训练集例返回图片的地址train_dir, validation_dir, cat_img_files,dog_img_files = data_read.read_data()#返回随机一张图片的地址img_path=random.choice(cat_img_files+dog_img_files)img=load_img(img_path,target_size=(150,150))x=img_to_array(img)#print(x.shape)#变成(1,150,150,3)x=x.reshape((1,)+x.shape)x/=255#(samples,150,150,3) 存储10层的信息successive_feature_maps=visualization_model.predict(x)# print(len(successive_feature_maps))# for i in range(len(successive_feature_maps)):#     print(successive_feature_maps[i].shape)layer_names=[layer.name for layer in model.layers]#zip 打包成一个个元组以列表形式返回[(),()]#并且遍历元组里的内容for layer_name,feature_map in zip(layer_names,successive_feature_maps):if len(feature_map.shape)==4:#只查看卷积层n_features=feature_map.shape[-1]#(1,150,150,3)取3 取出深度size=feature_map.shape[1]##(1,150,150,3)取150  尺寸大小display_grid=np.zeros((size,size*n_features))for i in range(n_features):x=feature_map[0,:,:,i]x-=x.mean()x/=x.std()x*=64x+=128#限定x的值大小 小于0 则为0  大于255则为255x=np.clip(x,0,255).astype('uint8')display_grid[:,i*size:(i+1)*size]=x#显示scale=64./n_featuresplt.figure(figsize=(scale*n_features,scale))plt.title(layer_name)plt.grid(False)plt.imshow(display_grid,aspect='auto',cmap='Oranges')plt.show()
"""
查看图像增强是否发生作用
"""
def see_pic_aug():train_datagen = ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest')# 从训练集例返回图片的地址train_dir, validation_dir, cat_img_files, dog_img_files = data_read.read_data()# 返回随机一张图片的地址img_path = random.choice(cat_img_files + dog_img_files)img = load_img(img_path, target_size=(150, 150))x = img_to_array(img)# 变成(1,150,150,3)x = x.reshape((1,) + x.shape)i = 0#32个训练样本for batch in train_datagen.flow(x, batch_size=32):plt.figure(i)plt.imshow(array_to_img(batch[0]))i += 1if i % 5 == 0:breakplt.show()
if __name__ == '__main__':# see_pic_aug()train_model()#visualize_model()# 像素缩小到0~1

迭代100次结果:可看出相比上一篇文章,精度是稳定的,损失值也几乎是稳定的,数据增强还是起了防止过拟合的作用。

 

同样可视化卷积层:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深圳神经科学研究院院长谭力海: AI取代人脑? 不, 必须向人脑“学习”!

来源:读创科技摘要:从“深蓝”到“阿尔法狗”,人工智能技术日益成熟,“AI何时替代人脑”的争论也在不断升级。人工智能真的能超越人脑吗?11月15日在高交会“颠覆性创新技术”主题论坛上,深圳神经科学研究院…

好的PPT——准备工作

首先介绍PPT的一些基本技巧。 在选项界面,我们需要调整一些选项:控制最大可回退次数;语法自动检查;字体嵌入PPT,调整自动保存的时间间隔。 对于一些常用操作,可以右键添加到常用工具栏。 可以很方便地调整不…

ubuntu安装谷歌浏览器 typora+出现编码错误‘ascii‘ codec can‘t encode character ‘\u6b66‘+docker里安装tensorrt报错

一.首先下载谷歌浏览器 https://www.google.cn/chrome/ sudo dpkg -i google-chrome-stable_current_amd64.deb 就安装好了,search谷歌浏览器就可以啦。 二,安装typora # optional, but recommendedsudo apt-key adv --keyserver keyserver.ubuntu.com --recv-ke…

中国安防为何世界最强?中科院AI+安防报告,解密8大趋势和8大限制【附下载】| 智东西内参...

来源:智东西传统的安防企业、新兴的 AI 初创企业,开始积极从技术各个维度拥抱人工智能,在模式识别基础理论、图像处理、计算机视觉以及语音信息处理展开了集中研究与持续创新,探索模式识别机理以及有效计算方法,为解决…

利用Inception-V3训练的权重微调,实现猫狗分类(基于keras)

利用Inception-V3训练的权重微调实现猫狗的分类,其中权重的下载在我的博客下载资源处,https://download.csdn.net/download/fanzonghao/10566634 第一种权重不改变直接用mixed7层(mixed7呆会把打印结果一放就知道了)进行特征提取…

刘锋:互联网左右大脑结构与钱学森开放复杂巨系统

作者:刘锋 互联网进化论作者 计算机博士前言:1990年,钱学森提出了开放的复杂巨系统理论,并提出以人为主,人机结合,从定性到定量的综合集成研究方法,他也预见性的提出“因特网正好生动地体现了…

手写字母数据集转换为.pickle文件

首先是数据集,我上传了相关的资源,https://download.csdn.net/download/fanzonghao/10566701 转换代码如下: import numpy as np import os import matplotlib.pyplot as plt import matplotlib.image as mpig import imageio import pickle…

一文看懂谷歌的AI芯片布局,边缘端TPU将大发神威

来源:新电子2018年7月Google在其云端服务年会Google Cloud Next上正式发表其边缘(Edge)技术,与另两家国际公有云服务大厂Amazon/AWS、Microsoft Azure相比,Google对于边缘技术已属较晚表态、较晚布局者,但其技术主张却与前两业者有…

opencv图像处理中的一些滤波器+利用滤波器提取条形码(解析二维码)+公交卡倾斜矫正+物体尺寸丈量

一般来说,图像的能量主要集中在其低频部分,噪声所在的频段主要在高频段,同时图像中的细节信息也主要集中在其高频部分,因此,如何去掉高频干扰同时又保持细节信息是关键。为了去除噪声,有必要对图像进行平滑,可以采用低通滤波的方法去除高频干扰。图像平滑包括空域法和频域法两大…

智联汽车:复盘国内巨头布局

来源:申万宏源摘要:从今年阿里9月云栖大会、华为10月全联接大会、百度11月世界大会、腾讯11月合作伙伴大会可以发现BATH均高调展示了各自在汽车科技领域的研发成果;而京东、滴滴两家公司近两年来关于汽车科技领域的动态亦在频频更新。▌车联网:车载OS竞争…

Tomcat基础教程(一)

Tomcat, 是Servlet和JSP容器,其是实现了JSP规范的servlet容器。它在servlet生命周期内包容,装载,运行,和停止servlet容器。 Servlet容器的三种工作模式: 1. 独立的Servlet容器 Servlet容器与基于JAVA技术的Web服务器集…

opencv--图像金字塔

一,高斯金字塔--图片经过高斯下采样 """ 高斯金字塔 """ def gauss_pyramid():img cv2.imread(./data/img4.png)lower_reso cv2.pyrDown(img)lower_reso2 cv2.pyrDown(lower_reso)plt.subplot(131), plt.imshow(img)plt.title(In…

中国移动:5G蜂窝IoT关键技术分析

来源:5G本文讨论了蜂窝物联网的技术现状,针对增强机器类通信和窄带物联网技术标准,提出了2种现网快速部署方案,并进一步指出了C-IoT面向5G的演进路径。该路径充分考虑了5G网络中网络功能虚拟化、软件定义网络、移动边缘计算和大数…

清华大学发布:人脸识别最全知识图谱

来源:智东西摘要:本期我们推荐来自清华大学副教授唐杰领导的学者大数据挖掘项目Aminer的研究报告,讲解人脸识别技术及其应用领域,介绍人脸识别领域的国内玩人才并预测该技术的发展趋势。自20世纪下半叶,计算机视觉技术…

图像变换dpi(tif->jpg),直方图均衡化,腐蚀膨胀,分水岭,模板匹配,直线检测

一.图像变换dpi 1.示例1 import numpy as np from PIL import Image import cv2 def test_dp():path./gt_1.tif# imgImage.open(path)# print(img.size)# print(img.info)imgcv2.imread(path)imgImage.fromarray(img)print(img.size)print(img.info)img.save(test.jpg, dpi(3…

CV中的经典网络模型

目标检测 目标检测,不仅要识别目标是什么(分类),还要知道目标的具体位置(可以当作回归来做)。 RCNN Selective Search 算法获得候选框,Alexnet提取特征,SVM对每个候选框区域打分。…

技术阅读周刊第十一期

技术阅读周刊,每周更新。 历史更新 20231124:第七期20231201:第八期20231215:第十‍期 A Comprehensive guide to Spring Boot 3.2 with Java 21, Virtual Threads, Spring Security, PostgreSQL, Flyway, Caching, Micrometer, O…

数据智能是大数据的未来

来源:中国信息产业网 近日,两家大数据领域的代表性企业Cloudera和Hortonworks宣布了它们相对平等的合并,宣称新公司将创建世界领先的下一代数据平台并提供业界首个企业数据云,这令很多人感到意外,大数据的未来何去何从…

利用GAN原始框架生成手写数字

这一篇GAN文章只是让产生的结果尽量真实,还不能分类。 本次手写数字GAN的思想: 对于辨别器,利用真实的手写数字(真样本,对应的标签为真标签)和随机噪声经过生成器产生的样本(假样本&#xff0…

DL也懂纹理吗——图像的纹理特征

工作中遇到一个问题:对于同一场景,训练好的DL模型能把大部分样本分类准确,而对于少量负样本,DL会错分到另外一个对立的类中。错分的样本可以认为是难分的样本,但是我们还想知道这两种样本到底是哪里的差异导致DL做出了…