〇、内容说明

主体部分资料来源于:
1、【深度学习图像识别课程】毕业项目:狗狗种类识别(2)代码实现

2、项目:实现一个狗品种识别算法App

3、Kaggle相关比赛:Dog Breed Identification

一、加载数据

from sklearn.datasets import load_files
from keras.utils import np_utils
import numpy as np
from glob import glob
import time
t0=time.time()
print('显示此刻的时间:',time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))# 定义函数来加载train,test和validation数据集
def load_dataset(path):data = load_files(path)dog_files = np.array(data['filenames'])dog_targets = np_utils.to_categorical(np.array(data['target']), 133)return dog_files, dog_targets# 加载train,test和validation数据集
train_files, train_targets = load_dataset('E:/dog/dogImages/train')
valid_files, valid_targets = load_dataset('E:/dog/dogImages/valid')
test_files, test_targets = load_dataset('E:/dog/dogImages/test')# 加载狗品种列表
dog_names = [item[20:-1] for item in sorted(glob("E:/dog/dogImages/train/*/"))]# 打印数据统计描述
print('There are %d total dog categories.' % len(dog_names))
print('There are %s total dog images.\n' % len(np.hstack([train_files, valid_files, test_files])))
print('There are %d training dog images.' % len(train_files))
print('There are %d validation dog images.' % len(valid_files))
print('There are %d test dog images.'% len(test_files))t1=time.time()
print('显示结束的时间:',time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
print("用时:%.2fs"%(t1-t0))

二、处理数据

调整载入的图片数据格式,使其符合keras模型的输入的要求

from keras.preprocessing import image
from tqdm import tqdmdef path_to_tensor(img_path):# 用PIL加载RGB图像为PIL.Image.Image类型img = image.load_img(img_path, target_size=(224, 224))# 将PIL.Image.Image类型转化为格式为(224, 224, 3)的3维张量x = image.img_to_array(img)# 将3维张量转化为格式为(1, 224, 224, 3)的4维张量并返回return np.expand_dims(x, axis=0)def paths_to_tensor(img_paths):list_of_tensors = [path_to_tensor(img_path) for img_path in tqdm(img_paths)]return np.vstack(list_of_tensors)from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True                 # Keras中的数据预处理过程
train_tensors = paths_to_tensor(train_files).astype('float32')/255
valid_tensors = paths_to_tensor(valid_files).astype('float32')/255
test_tensors = paths_to_tensor(test_files).astype('float32')/255

插个补充:Application应用-Keras中文文档(Resnet50)
这里处理数据的思路是类似的

from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as npmodel = ResNet50(weights='imagenet',classes=12)img_path = 'rubber.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
a = np.expand_dims(x, axis=0)
b = preprocess_input(a)preds = model.predict(b)
# 将结果解码为元组列表 (class, description, probability)
# (一个列表代表批次中的一个样本)
print('Predicted:', decode_predictions(preds, top=3)[0])
# Predicted: [(u'n02504013', u'Indian_elephant', 0.82658225), (u'n01871265'

三、Keras自建模型

from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D
from keras.layers import Dropout, Flatten, Dense
from keras.models import Sequentialmodel = Sequential()### TODO: 定义你的网络架构
model.add(Conv2D(filters=16, kernel_size=2, padding='valid', activation='relu', input_shape=(224,224,3)))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=32, kernel_size=2, padding='valid', activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Conv2D(filters=64, kernel_size=2, padding='valid', activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(GlobalAveragePooling2D(input_shape=(27,27,64)))
model.add(Dense(133, activation='softmax'))model.summary()

这个模型的乍一看感觉很有Let-Net5的感觉,但确实也不是。

神经网络模型千变万化,稍微变化结果便会产生差异,玄之又玄。


补充一个经典Let-Net5模型:

from keras.models import Sequential, Model
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Flatten
from keras.layers import Dense,Input, Embedding, LSTM, Dropoutmodel = Sequential()
model.add(Conv2D(6, (5, 5), input_shape=(32, 32,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(16, (5, 5), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(120, activation='relu'))
model.add(Dense(84, activation='relu'))
model.add(Dense(10, activation='softmax'))model.summary()

四、编译训练模型

## 编译模型
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])from keras.callbacks import ModelCheckpoint
checkpointer = ModelCheckpoint(filepath='weights.best.from_scratch.hdf5', verbose=1, save_best_only=True)model.fit(train_tensors, train_targets, validation_data=(valid_tensors, valid_targets),epochs=20, batch_size=25, callbacks=[checkpointer], verbose=1)

过拟合:训练精度越来越高,验证数据精度不变

五、加载并测试

## 加载具有最好验证loss的模型
model.load_weights('saved_models/weights.best.from_scratch.hdf5')# 获取测试数据集中每一个图像所预测的狗品种的index
dog_breed_predictions = [np.argmax(model.predict(np.expand_dims(tensor, axis=0))) for tensor in test_tensors]# 报告测试准确率
test_accuracy = 100*np.sum(np.array(dog_breed_predictions)==np.argmax(test_targets, axis=1))/len(dog_breed_predictions)
print('Test accuracy: %.4f%%' % test_accuracy)

Test accuracy: 7.2967%

模型比较简陋,隐层也不多,20epoch,CPU训练时间将近一小时,结果还算可以!

【深度学习】Keras自建神经网络模型实现133种狗的种类识别(记录笔记)相关推荐

  1. 采用keras深度学习框架搭建卷积神经网络模型实现垃圾分类,基于树莓派上进行实时视频流的垃圾识别源代码

    一.项目概述 简介:该垃圾分类项目主要在于对各种垃圾进行所属归类,本次项目采用keras深度学习框架搭建卷积神经网络模型实现图像分类,最终移植在树莓派上进行实时视频流的垃圾识别. 前期:主要考虑PC端 ...

  2. 建神经网络模型,哪种优化算法更好?35000次测试告诉你丨图宾根大学出品

    萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 想要优化自己的神经网络,却不知道哪种优化器更适合自己? 又或者,想知道深度学习中梯度下降的算法到底都有哪些? 现在,最全面的优化算法分析来了 ...

  3. 利用深度学习(Keras)进行癫痫分类-Python案例

    目录 癫痫介绍 数据集 Keras深度学习案例 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区 QQ交流群:903290195 癫痫介绍 癫痫,即俗称"羊癫风",是由多种 ...

  4. 基于Keras的卷积神经网络模型预测--狗的品种识别

    基于Keras的卷积神经网络模型预测–狗的品种识别 from sklearn.datasets import load_files from keras.utils import np_utils i ...

  5. 笔记:基于keras的不同神经网络模型Minst手写体识别

    基于keras的不同神经网络模型MNIST手写体识别 1.CNN版 1.导入数据 相关库(导入plt是为了看数据集的图) import keras from keras.datasets import ...

  6. 深度学习(6)之卷积的几种方式:1D、2D和3D卷积的不同卷积原理(全网最全!)

    深度学习(6)之卷积的几种方式:1D.2D和3D卷积的不同卷积原理(全网最全!) 英文原文 :A Comprehensive Introduction to Different Types of Co ...

  7. CV:基于深度学习实现目标检测之GUI界面产品设计并实现图片识别、视频识别、摄像头识别(准确度非常高)

    CV:基于深度学习实现目标检测之GUI界面产品设计并实现图片识别.视频识别.摄像头识别(准确度非常高) 目录 GUI编程设计界面 产品演示 GUI编程设计界面 产品演示 视频演示:https://bl ...

  8. Python之GUI:基于Python的GUI界面设计的一套AI课程学习(机器学习、深度学习、大数据、云计算等)推荐系统(包括语音生成、识别等前沿黑科技)

    Python之GUI:基于Python的GUI界面设计的一套AI课程学习(机器学习.深度学习.大数据.云计算等)推荐系统(包括语音生成.识别等前沿黑科技) 导读 基于Python的GUI界面设计的一套 ...

  9. TF2.0深度学习实战(一):分类问题之手写数字识别

    前言: 本专栏将分享从零开始搭建神经网络的学习过程,力争打造最易上手的小白教程.在这过程中,我将使用谷歌TensorFlow2 框架逐一复现经典的卷积神经网络:LeNet-5.AlexNet.VGG系 ...

最新文章

  1. DELPHI replace into 语句的语法错误 解决方法
  2. vs2005格式化代码
  3. SARscape_5.2.0和SARscape_5.2.1安装包下载
  4. STM32实现USB虚拟串口原理(下)
  5. java分页代码思路,记录--java 分页 思路 (hibernate关键代码)
  6. ThreadLocal 从源码角度简单分析
  7. java自定义注解解析
  8. JVM内存分析及导致内存溢出的不健壮代码及解决办法
  9. hadoop错误总结
  10. 【Java从0到架构师】交错的日志系统、SpringBoot 集成日志框架
  11. 《IT项目管理那些事儿》——前言
  12. NHibernate官方文档中文版——批量插入(Batch inserts)
  13. idea连接sqlite
  14. Winform的菜单控件
  15. DirectX修复工具常见问题解答
  16. CVPR2022论文列表(中英对照)
  17. w7查看计算机每天开关机时间,WINDOWS7 怎么查看上次开关机时间
  18. CAD梦想画图中如何设置图层
  19. Cousera 无法播放视频 解决办法 widows 和 linux
  20. Prince和学生们侃侃而谈系列01

热门文章

  1. CRM的客户数据模型:Siebel Party Data Model (VI)
  2. WiFi广告强推原理
  3. LS1028 使用serdes mode 99BB软件修改方案
  4. idea+git合并分支解决冲突及详解
  5. C语言中声明和定义详解
  6. Android TV TIF源码阅读笔记
  7. Flutter 官方做了一款游戏,开源的
  8. 小豆苗服务器维护,小豆苗问题排查方法新版
  9. 游戏服务器排队系统,游戏服务器排队功能
  10. 健身软件的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告