人工智能深度学习——卷积神经网络(CNN)

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

一、图像卷积运算

对图像矩阵与滤波器矩阵进行对应相乘再求和运算,转化得到新的矩阵。

作用:快速定位图像中某些边缘特征

英文:convolution(CNN)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
池化层实现维度缩减

池化:按照一个固定规则对图像矩阵进行处理,将其转换为更低维度的矩阵

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

卷积神经网络

把卷积、池化、mlp先后连接在一起,组成卷积神经网络。

在这里插入图片描述
激活函数:Relu
在这里插入图片描述

卷积神经网络两大特点

  • 参数共享(parameter sharing):同一个特征过滤器可用于整张图片

  • 稀疏连接(sparsity of connections):生成的特征图片每个节点只与原图片中特定节点连接

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

经典的CNN模型

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

二、实战准备

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

三、实战:建立CNN模型,识别图片中的猫/狗

在这里插入图片描述

#加载数据
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)training_set = train_datagen.flow_from_directory('./dataset/training_set',target_size=(50,50),batch_size=32,class_mode='binary')

在这里插入图片描述

#创建cnn模型
from keras.models import Sequential
from keras.layers import Conv2D,MaxPool2D,Flatten,Dense
model = Sequential()#卷积层
model.add(Conv2D(32,(3,3),input_shape=(50,50,3),activation='relu'))
#池化层
model.add(MaxPool2D(pool_size=(2,2)))#卷积层
model.add(Conv2D(32,(3,3),activation='relu'))
#池化层
model.add(MaxPool2D(pool_size=(2,2)))#展开
model.add(Flatten())#全连接层
model.add(Dense(units=128,activation='relu'))#输出层
model.add(Dense(units=1,activation='sigmoid'))
#配置模型 (优化器,损失函数)
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
#查看模型结构
model.summary()

在这里插入图片描述

#模型训练
model.fit(training_set,epochs=25)

在这里插入图片描述

#训练集模型准确率
accuracy_train = model.evaluate(training_set)
print(accuracy_train)

在这里插入图片描述

#测试集模型准确率
test_set = train_datagen.flow_from_directory('./dataset/test_set',target_size=(50,50),batch_size=32,class_mode='binary')
accuracy_test = model.evaluate(test_set)
print(accuracy_test)

在这里插入图片描述

#预测单张测试图片
from keras.preprocessing.image import load_img,img_to_array
import numpy as np
pic_dog = 'dog_test.jpg'
pic_dog = load_img(pic_dog,target_size=(50,50))
pic_dog = img_to_array(pic_dog)
pic_dog = pic_dog/255
pic_dog = pic_dog.reshape(1,50,50,3)
predictions = model.predict(pic_dog)
result = '预测为:狗狗' if predictions[0] >= 0.5 else '预测为:猫咪'
print(result)

在这里插入图片描述

training_set.class_indices

在这里插入图片描述

#测试多张图片,验证准确率
import matplotlib as mlp
font2 = {'family' :'SimHei','weight':'normal','size':20,}mlp.rcParams['font.family'] = 'SimHei'
mlp.rcParams['axes.unicode_minus'] = Falsefrom matplotlib import pyplot as plt
from matplotlib.image import imread 
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.models import load_model
a = [i for i in range(1,10)]
fig = plt.figure(figsize=(10,10))
for i in a:img_name = str(i)+'.jpg'img_ori = load_img(img_name,target_size=(50,50))img = img_to_array(img_ori)img = img.astype('float32')/255img = img.reshape(1,50,50,3)predictions = model.predict(img)img_ori = load_img(img_name,target_size=(250,250))plt.subplot(3,3,i)plt.imshow(img_ori)plt.title('预测为:狗狗' if predictions[0] >= 0.5 else '预测为:猫咪')
plt.show()    

四、实战:使用VGG16模型提取图像特征,再根据特征建立mlp模型,实现猫狗图像识别

#加载数据
from keras.preprocessing.image import load_img,img_to_array
img_path = '1.jpg'
img = load_img(img_path,target_size=(224,224))
img = img_to_array(img)
print(type(img))

在这里插入图片描述

#导入VGG16模型
from keras.applications.vgg16 import VGG16
from keras.applications.vgg16 import preprocess_input
import numpy as np
model_vgg = VGG16(weights='imagenet',include_top=False)
x = np.expand_dims(img,axis=0)
x = preprocess_input(x)#图像预处理
print(x.shape)

在这里插入图片描述

#特征轮廓提取
features = model_vgg.predict(x)
print(features.shape)

在这里插入图片描述

features = features.reshape(1,7*7*512)
print(features.shape)

在这里插入图片描述

#可视化图片
from matplotlib import pyplot as plt 
fig = plt.figure(figsize=(2,2))
img = load_img(img_path,target_size=(224,224))
plt.imshow(img)

在这里插入图片描述

#批量处理图片
from keras.preprocessing.image import img_to_array,load_img
from keras.applications.vgg16 import VGG16
from keras.applications.vgg16 import preprocess_input
import numpy as npmodel_vgg = VGG16(weights='imagenet',include_top=False)def modelProcess(img_path,model):img = load_img(img_path,target_size=(224,224))img = img_to_array(img)x = np.expand_dims(img,axis=0)x = preprocess_input(x)x_vgg = model.predict(x)x_vgg = x_vgg.reshape(1,25088)return x_vggimport os
folder = 'dataset/vgg16_set/cat'
# folder = 'dataset/test_set/cat'
dirs = os.listdir(folder)
img_path = []
for i in dirs:if os.path.splitext(i)[1] == '.jpg':img_path.append(i)
img_path = [folder+'//'+i for i in img_path]features1 = np.zeros([len(img_path),25088])
for i in range(len(img_path)):feature_i = modelProcess(img_path[i],model_vgg)print('preprocessed:',img_path[i])features1[i] = feature_ifolder = 'dataset/vgg16_set/dog'
# folder = 'dataset/test_set/dog'
dirs = os.listdir(folder)
img_path = []
for i in dirs:if os.path.splitext(i)[1] == '.jpg':img_path.append(i)
img_path = [folder+'//'+i for i in img_path]features2 = np.zeros([len(img_path),25088])
for i in range(len(img_path)):feature_i = modelProcess(img_path[i],model_vgg)print('preprocessed:',img_path[i])features2[i] = feature_iprint(features1.shape,features2.shape)
y1 = np.zeros(300)
y2 = np.ones(300)
# y1 = np.zeros(3)
# y2 = np.ones(1)x = np.concatenate((features1,features2),axis=0)
y = np.concatenate((y1,y2),axis=0)
y = y.reshape(-1,1)
print(x.shape,y.shape)

在这里插入图片描述

#数据分离
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=50)
print(x_train.shape,x_test.shape,x.shape)

在这里插入图片描述

#建立mlp模型
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=10,activation='relu',input_dim=25088))
model.add(Dense(units=1,activation='sigmoid'))
model.summary()

在这里插入图片描述

#配置模型,训练模型
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
model.fit(x_train,y_train,epochs=50)

在这里插入图片描述

#预测
from sklearn.metrics import accuracy_score
# 获取预测概率
y_train_pred_prob = model.predict(x_train)
# 二分类:sigmoid输出,使用0.5作为阈值
y_train_predict = (y_train_pred_prob > 0.5).astype("int32").flatten()accuracy_train = accuracy_score(y_train,y_train_predict)
print(accuracy_train)

在这里插入图片描述

# 获取预测概率
y_test_pred_prob = model.predict(x_test)
# 二分类:sigmoid输出,使用0.5作为阈值
y_test_predict = (y_test_pred_prob > 0.5).astype("int32").flatten()accuracy_test = accuracy_score(y_test,y_test_predict)
print(accuracy_test)

在这里插入图片描述

#测试多张图片,验证准确率
import matplotlib as mlp
font2 = {'family' :'SimHei','weight':'normal','size':20,}mlp.rcParams['font.family'] = 'SimHei'
mlp.rcParams['axes.unicode_minus'] = Falsefrom matplotlib import pyplot as plt
from matplotlib.image import imread 
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.models import load_model
a = [i for i in range(1,10)]
fig = plt.figure(figsize=(10,10))
for i in a:img_name = str(i)+'.jpg'img_ori = load_img(img_name,target_size=(224,224))img = img_to_array(img_ori)x = np.expand_dims(img,axis=0)x = preprocess_input(x)#vgg16提取特征x_vgg = model_vgg.predict(x)x_vgg = x_vgg.reshape(1,25088)# 获取预测概率predictions = model.predict(x_vgg)# 二分类:sigmoid输出,使用0.5作为阈值y_train_predict = (y_train_pred_prob > 0.5).astype("int32").flatten()img_ori = load_img(img_name,target_size=(250,250))plt.subplot(3,3,i)plt.imshow(img_ori)plt.title('预测为:狗狗' if predictions >= 0.5 else '预测为:猫咪')
plt.show()

在这里插入图片描述

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

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

相关文章

SaaS 建站从 0 到 1 教程:Vue 动态域名 + 后端子域名管理 + Nginx 配置

SaaS 建站从 0 到 1 教程:Vue 动态域名 后端子域名管理 Nginx 配置 一、什么是 SaaS 建站? SaaS(Software as a Service)建站,就是通过一套统一的系统,支持用户在线注册、绑定域名、快速生成专属网站。…

关于神经网络中回归的概念

神经网络中的回归详解 引言 神经网络(NeuralNetworks)是一种强大的机器学习模型,可用于分类和回归任务。本文聚焦于神经网络中的回归(Regression),即预测连续输出值(如房价、温度)。…

JAVASCRIPT 前端数据库-V9--仙盟数据库架构-—仙盟创梦IDE

老版本 在v1 版本中我们讲述了 基础版的应用JAVASCRIPT 前端数据库-V1--仙盟数据库架构-—-—仙盟创梦IDE-CSDN博客接下载我们做一个更复杂的的其他场景由于,V1查询字段必须 id接下来我们修改了了代码JAVASCRIPT 前端数据库-V2--仙盟数据库架构-—-—仙盟创梦IDE-CS…

k8s核心资料基本操作

NamespaceNamespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问…

PostgreSQL——分区表

分区表一、分区表的意义二、传统分区表2.1、继承表2.2、创建分区表2.3、使用分区表2.4、查询父表还是子表2.5、constraint_exclusion参数2.6、添加分区2.7、删除分区2.8、分区表相关查询2.9、传统分区表注意事项三、内置分区表3.1、创建分区表3.2、使用分区表3.3、内置分区表原…

Linux任务调度全攻略

Linux下的任务调度分为两类,系统任务调度和用户任务调度。系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。/etc/crontab文件包括下面…

回溯算法通关秘籍:像打怪一样刷题

🚀 回溯算法通关秘籍:像打怪一样刷题! 各位同学,今天咱们聊聊 回溯算法(Backtracking)。它听起来玄乎,但其实就是 “暴力搜索 剪枝” 的优雅版。 打个比方:回溯就是在迷宫里探险&am…

嵌入式Linux常用命令

📟 核心文件与目录操作pwd-> 功能: 打印当前工作目录的绝对路径。-> 示例: pwd -> 输出 /home/user/projectls [选项] [目录]-> 功能: 列出目录内容。-> 常用选项:-l: 长格式显示(详细信息)-a: 显示所有文件(包括隐…

深入理解 Linux 内核进程管理

在 Linux 系统中,进程是资源分配和调度的基本单位,内核对进程的高效管理直接决定了系统的性能与稳定性。本文将从进程描述符的结构入手,逐步剖析进程的创建、线程实现与进程终结的完整生命周期,带您深入理解 Linux 内核的进程管理…

ACP(三):让大模型能够回答私域知识问题

让大模型能够回答私域知识问题 未经过特定训练答疑机器人,是无法准确回答“我们公司项目管理用什么工具”这类内部问题。根本原因在于,大模型的知识来源于其训练数据,这些数据通常是公开的互联网信息,不包含任何特定公司的内部文档…

使用Xterminal连接Linux服务器

使用Xterminal连接Linux服务器(VMware虚拟机)的步骤如下,前提是虚拟机已获取IP(如 192.168.31.105)且网络互通: 一、准备工作(服务器端确认)确保SSH服务已安装并启动 Linux服务器需要…

ChatBot、Copilot、Agent啥区别

以下内容为AI生成ChatBot(聊天机器人)、Copilot(副驾驶)和Agent(智能体/代理)是AI应用中常见的三种形态,它们在人机交互、自动化程度和任务处理能力上有着显著的区别。特征维度ChatBot (聊天机器…

2025 年大语言模型架构演进:DeepSeek V3、OLMo 2、Gemma 3 与 Mistral 3.1 核心技术剖析

编者按: 在 Transformer 架构诞生八年之际,我们是否真的见证了根本性的突破,还是只是在原有设计上不断打磨?今天我们为大家带来的这篇文章,作者的核心观点是:尽管大语言模型在技术细节上持续优化&#xff0…

基于Matlab GUI的心电信号QRS波群检测与心率分析系统

心电信号(Electrocardiogram, ECG)是临床诊断心脏疾病的重要依据,其中 QRS 波群的准确检测对于心率分析、心律失常诊断及自动化心电分析系统具有核心意义。本文设计并实现了一套基于 MATLAB GUI 的心电信号处理与分析系统,集成了数…

1台SolidWorks服务器能带8-10人并发使用

在工业设计和机械工程领域,SolidWorks作为主流的三维CAD软件,其服务器部署方案直接影响企业协同效率。通过云飞云共享云桌面技术实现多人并发使用SolidWorks时,实际承载量取决于硬件配置、网络环境、软件优化等多维度因素的综合作用。根据专业…

String、StringBuilder和StringBuffer的区别

目录一. String:不可变的字符串二.StringBuilder:可变字符串三.StringBuffer:线程安全的可变字符串四.总结在 Java 开发中,字符串处理是日常编码中最频繁的操作之一。String、StringBuilder 和 StringBuffer 这三个类虽然都用于操…

Power Automate List Rows使用Fetchxml查询的一个bug

看一段FetchXML, 这段查询在XRMtoolbox中的fech test工具里执行完全ok<fetch version"1.0" mapping"logical" distinct"true" no-lock"false"> <entity name"new_projectchange"> <link-entity name"sy…

Letta(MemGPT)有状态AI代理的开源框架

1. 项目概述Letta&#xff08;前身为 MemGPT&#xff09;是一个用于构建有状态AI代理的开源框架&#xff0c;专注于提供长期记忆和高级推理能力。该项目是MemGPT研究论文的实现&#xff0c;引入了"LLM操作系统"的概念用于内存管理。核心特点有状态代理&#xff1a;具…

除了ollama还有哪些模型部署方式?多样化模型部署方式

在人工智能的浪潮中&#xff0c;模型部署是释放其强大能力的关键一环。大家都知道ollama&#xff0c;它在模型部署领域有一定知名度&#xff0c;操作相对简单&#xff0c;受到不少人的青睐。但其实&#xff0c;模型部署的世界丰富多样&#xff0c;今天要给大家介绍一款工具&…

Linux系统学习之进阶命令汇总

文章目录一、系统信息1.1 查看系统信息&#xff1a;uname1.2 查看主机名&#xff1a;hostname1.3 查看cpu信息&#xff1a;1.4 当前已加载的内核模块: lsmod1.5 查看磁盘空间使用情况: df1.6 管理磁盘分区: fdisk1.7 查看目录或文件磁盘使用情况: du1.8 查看I/O使用情况: iosta…