小白初探|神经网络与深度学习

一、学习背景

由于工作的原因,需要开展人工智能相关的研究,虽然不用参与实际研发,但在项目实施过程中发现,人工智能的项目和普通程序开发项目不一样,门槛比较高,没有相关基础没法搞清楚人力、财力如何投入,很难合理管控成本以及时间。为搞清楚情况,老年博主决定一步一个脚印,好好自学。在写本文时,博主已学到一定阶段了,趁有时间,通过博文记录下来,以免遗忘。

二、学习准备

常年的学习告诉我们,一门学科要快速入门,主流方式是看网络教学视频,B站上有很多优质视频。但博主还是习惯静静看书,通过CSDN读书频道浏览一并人工智能入门书籍,最后选择了一本合适自己学习习惯的书,书名为《神经网络与深度学习:Python+Keras+TensorFlow》,2019年出版。PS:2023年才学,确实落后了呀🌝。

CSDN书架截图

看书先看目录,结合自己的学习需求,从目录来看,需要重点看的是以下几点:

书的目录结构

第一章:神经网络初体验

这章主要是介绍神经网络应用的案例,改变读者固有的一些思维方式,了解人工智能是怎么运作的,不仅是代码层面,看完还是很有收获的。

第二章&第三章:深度学习中的微积分基础和线性代数基础

第二、三两章非常重要,主要介绍神经网络的数理基础。以前在大学总认为微积分和线性代数和自己没啥关系,看完本章后,感觉这些数理知识学的远远不够,内心默默感叹,数学真是科技进步之本。第二章核心知识点主要是函数求导、间套函数的链式求导法则、多变量函数与偏导数、求函数最小值,第三章的核心知识点主要是矩阵运算、张量

第四章:神经网络的理论基础

本章是本书的核心,主要介绍人工智能的核心算法,包括激活函数、神经网络中的矩阵运算、反向传播算法梯度下降算法,必须认真看懂弄透,不然后面几章估计就无法阅读了。

第五章:用Python从零实现识别手写数字的神经网络

本章主要介绍如何使用Python代码来实现第四章算法,以加深神经网络算法的认识,同时提高动手能力,博主反复把书中代码练习数遍,才逐渐理解其中某些细节和原理。本章的核心内容是使用Python代码构建神经网络框架、使用Python代码实现网络迭代训练功能、使用Pyhon代码识别手写数字图片

第七章:使用神经网络实现机器视觉识别

由于博主想入门的是视觉类识别技术,所以主要看了第七章,往后的章节没有细看。本章逐节揭秘卷积网络的底层原理,核心内容主要包括卷积神经网络应用、预训练卷积神经网络应用、卷积神经网络原理

三、自己完整写完第一份图像识别代码

本书第七章的7.2小节为从零开始构造一个识别猫、狗图片的卷积网络,是一个图像识别入门例子,难度不高,适合博主这种小白一步一步根书敲代码。当然,复刻书中代码的过程是曲折的,运行时经常碰到各种报错,书本也有不少笔误之处。经过反复调试程序和查阅报错相关资料,逐项问题解决后,图像识别程序终于成功运行起来。

接下来,将介绍本小白是如何一步步把程序跑起来的,真是好多坑o(╥﹏╥)o。

第一步:把书中代码直接Copy到IDE尝试运行

这步操作简单,把以下完整代码Copy到IDE,本人用的是Pycharm,点击运行。本文使用的代码经测试可以运行,而且每一步都添加了自己写的备注,可能比原书还清晰。

import os
os.environ["CUDA_VISIBLE_DEVICES"]="0"
# 加载训练数据集和测试数据集
# 1.拼接数据集的地址
base_dir = 'D:\RGZN\第7章\cat-and-dog'
train_cats_dir = os.path.join(base_dir, 'training_set/cats')
train_dogs_dir = os.path.join(base_dir, 'training_set/dogs')
test_cats_dir = os.path.join(base_dir, 'test_set/cats')
test_dogs_dir = os.path.join(base_dir, 'test_set/dogs')
# 2.显示两个数据集中的图片数量
print('total trainning cat images: ', len(os.listdir(train_cats_dir)))
print('total trainning dog images: ', len(os.listdir(train_dogs_dir)))
print('total testing cat images: ', len(os.listdir(test_cats_dir)))
print('total testing dog images: ', len(os.listdir(test_dogs_dir)))from keras import layers
from keras import modelsmodel = models.Sequential()
# 3.Sequential是用于构建和训练顺序模型
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)))
# 4.32个神经元,卷积核大小为3*3,激活函数为relu
# 5.150px*150px的图片,RGB(255,255,255)彩色像素,所以接入层的格式是(150,150,3)
model.add(layers.MaxPooling2D((2, 2)))
# 6.2D最大池化层,池化窗口大小为(2,2)
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
# 7.64个神经元,卷积核大小为3*3,激活函数为relu
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
# 8.将上面网络输出的多维数组压平成一维数组
model.add(layers.Dense(512, activation='relu'))
# 9.512个神经元,全连接,激活函数为relu
model.add(layers.Dense(1, activation="sigmoid"))
# 10.网络只要做出判断,因此最后一层只需要一个神经元,激活函数sigmoid,根据它输出的值是否大于0.5来决定图片是猫还是狗
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['acc'])
# 11.model.compile()函数被设计为一个编译器,用于将模型的图形结构定义与计算引擎进行链接,以实现优化、损失函数的选择和训练过程的配置
model.summary()from keras import preprocessing
from keras.utils import image_utils
import numpy as np# 12.将图片地址加载到程序path_cats和path_dogs中
path_cats = []
for path in os.listdir(train_cats_dir):if '.jpg' in path:path_cats.append(os.path.join(train_cats_dir, path))
path_dogs = []
for path in os.listdir(train_dogs_dir):if '.jpg' in path:path_dogs.append(os.path.join(train_dogs_dir, path))
# 13.将图片转换为(150,150)格式的二维数组
training_set = np.zeros((6000, 150, 150, 3), dtype='float32')
# 14.np.zeros() 函数是 NumPy 库中的一个非常基础和广泛使用的函数,它的主要功能是创建一个特定形状和类型的新数组,其中所有元素的初始值都为 0。
train_dog_imgs = 3000
train_cat_imgs = 3000
for i in range(0, train_dog_imgs):img = image_utils.load_img(path_dogs[i], target_size=(150, 150))# 15.preprocessing,keras的预处理类training_set[i] = image_utils.img_to_array(img)
for j in range(0, train_cat_imgs):img = image_utils.load_img(path_cats[j], target_size=(150, 150))training_set[train_dog_imgs + j] = image_utils.img_to_array(img)
# 16.准备2000张图片作为网络训练校验集
validation_set = np.zeros((2000, 150, 150, 3), dtype='float32')
validation_dog_imgs = 1000
validation_cat_imgs = 1000
# 17.其中用于校验的狗图片1000张,校验猫的图片1000张
for i in range(validation_dog_imgs):path = path_dogs[i + train_dog_imgs]img = image_utils.load_img(path, target_size=(150, 150))validation_set[i] = image_utils.img_to_array(img)
for j in range(validation_cat_imgs):path = path_cats[i + train_cat_imgs]img = image_utils.load_img(path, target_size=(150, 150))validation_set[j + validation_dog_imgs] = image_utils.img_to_array(img)train_labels = np.zeros((3000,))
# 18.对前面3000张狗图片打标签0
train_labels = np.concatenate((train_labels, np.ones(3000, )))
# 19.对后面3000张猫图片打标签1,并进行合并操作,形成6000张标签
validation_labels = np.zeros((1000,))
# 20.对前面1000只狗的校验图片打标签0
validation_labels = np.concatenate((validation_labels, np.ones(1000, )))
# 21.对后面1000只猫的校验图片打标签1,并进行合并操作,形成2000张标签
train_datagen = preprocessing.image.ImageDataGenerator(rescale=1. / 255)
# 22.将图片像素点转换到[0,1]之间,可以使用keras.preprocessing.image.ImageDataGenerator生成器对数据进行变换和增强
train_generator = train_datagen.flow(training_set, train_labels, batch_size=32)
# 23.根据生成器设置的相关参数,调用flow来执行,batch_size:整数或None。每个梯度更新用到的的样本数量。
validation_generator = train_datagen.flow(validation_set, validation_labels, batch_size=32)history = model.fit(train_generator, steps_per_epoch=100, epochs=30,validation_steps=50, validation_data=validation_generator)
# 24.启动网络训练,循环训练30次,每次训练从数据生成器中获取100张图片,校验时从生成器中获取50张图片import matplotlib.pyplot as plt# 25.获取训练结果,例如训练数据准确率、校验数据准确率等
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)
# 26.将训练过程中的准确性变化绘制出来
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
# 27,将训练过程中的损失变化绘制出来
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()

第二步:发现依赖包未导入,根据报错导入相关的包

copy代码后会发现各种包比如keras等未导入,凡提示没有的,使用pip安装导入即可。

第三步:发现数据集没下载,根据书中链接下载

💫第一坑!这里发现原书地址不可用,经过大量网站检索,本小白终于完成数据集下载,但在写本文章时,该书官网貌似出问题了,晕倒_(¦3」∠)_。由于数据集太大,后期再放下载链接。

以下是数据集(cat-and-dog)截图:
在这里插入图片描述

第四步:模型训练

💫第二坑!缺少数据集的问题解决后,程序便可正常运行。谁知,笔记本第十代 intel i7 CPU跑了大半天才出训练结果,遂改GPU试试,结果手提没有英伟达独显,后来又研究外接显卡,终于解决CPU训练太慢的问题。这笔记本电脑雷电3接口外接二手GTX1060显卡跑人工智能深度学习训练模型解决方案够博主另外写一篇长文了,外接显卡方案从购置、安装、调式到运行,前前后后花了约三周时间,这里就不作详细解释了,最后结论是此方案可行,比CPU快几十倍。

若需使用电脑GPU,在程序开头加入以下代码即可。

os.environ["CUDA_VISIBLE_DEVICES"]="0"

除此之外,还有显卡驱动、CUDA、cuDNN等要安装,相关安装教程可参考以下链接。
《在keras中使用gpu加速训练模型》 👈这篇文章教你如何下载和安装相关驱动程序。
《CUDA11.8安装tensorflow2.12找不到GPU问题解决办法》👈这篇文章教你如何保证各种驱动版本一致。

四、模型训练效果

模型训练效果直接上图,效果如下:
在这里插入图片描述
在这里插入图片描述
[1]陈屹. 神经网络与深度学习实战:Python+Keras+TensorFlow[M]. 北京:机械工业出版社,2019.

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

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

相关文章

Mask-Free Video Instance Segmentation

论文地址:[2303.15904] 无掩码视频实例分割 (arxiv.org) 论文代码:https://github.com/SysCV/MaskFreeVis 目录 一、摘要 二、介绍 三、方法 3.1 时间掩码一致性 3.2 时间KNN-patch Loss 3.3 训练MaskFreeVIS 四. 数据集 五.消融实验 六. 结果 七…

深度解读NVMe计算存储协议-1

随着云计算、企业级应用以及物联网领域的飞速发展,当前的数据处理需求正以前所未有的规模增长,以满足存储行业不断变化的需求。这种增长导致网络带宽压力增大,并对主机计算资源(如内存和CPU)造成极大负担,进…

Python网络爬虫分步走之 – 第一步:什么是网络爬虫?

Python网络爬虫分步走之第一步:什么是网络爬虫? Web Scraping in Python Step by Step – 1st Step, What is Web Crawler? By JacksonML 1. 什么是网络爬虫? 在能够使用Google搜索引擎的场合,你是否尝试过简单搜索&#xff…

【C++】类和对象万字详解

目录 一、类与对象 1、类是什么 二、类和对象的基础知识 2.1 定义类:成员变量和成员函数 2.2 创建对象:实例化一个类的对象。 2.3对象的生命周期:构造函数和析构函数。 a. 构造函数 b. 析构函数 c.小结: 三、成员变量和…

腾讯云雾锁王国游戏服务器上线,10秒钟快速搭建!

随着科技的飞速发展,游戏行业也迎来了前所未有的繁荣。在这个时代,玩家们对游戏的体验需求日益增长,对服务器的稳定性和速度要求也越来越高。为了满足市场需求,腾讯云推出了雾锁王国游戏联机服务器及一键部署方案,只需…

❤ 做一个自己的AI智能机器人吧

❤ 做一个自己的AI智能机器人 看了扣子(coze)的模型,字节基于chatgpt搭建的一个辅助生成AI的网站,感觉蛮有意思,看了掘金以后,于是动手自己也实现了一个。 官网 https://www.coze.cn/ 进入的网站 1、 创…

java之基础知识、零碎知识

MENU java学习路程之篇一、知识点、path环境变量、计算机发展史、数据的存储和运算、人机交互、计算机语言java学习路程之篇二、知识点、JAVA背景介绍、配置JAVA_HOME、跨平台、JVM、JRE、JDKjava学习路程之篇三、知识点、类、模块、项目、操作、下载、安装、IDEA、开发工具jav…

速过计算机二级python——第二讲:基础语法

第二讲:基础语法 基础语法1. 变量2. 变量命名2.1语法规则2.1.1 区分大小写2.1.2 缩进 4 个空格2.1.3 # 注释 2.2 人机交互1. 输入函数:input()2. 转换函数:eval()3. 输出函数 print() 数据类型String(字符串)数字 组合…

面向对象设计的七大设计原则

在我们探讨如何创建健壮且可维护的面向对象系统时,有一些原则可以为我们提供指导。这些原则可以帮助我们理解如何最好地组织我们的类和对象,以实现高效、模块化和可扩展的设计。在本篇文章中,我们将探讨这些原则,以及如何在我们的…

centos7安装mysql5.7 或者mysql8

1、centos7安装mysql8 mysql官网 https://dev.mysql.com/downloads/mysql/ 示例2个版本的下载地址 #5.7.30下载地址 wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.30-1.el7.x86_64.rpm-bundle.tar #8.0.22下载地址 wget https://cdn.mysql.com/archives/mysql-8…

Maya------布尔 圆形圆角组件

17. maya常用命令7.布尔 圆形圆角组件_哔哩哔哩_bilibili 选中一个模型,再按shift加选另外一个模型 圆形圆角命令

PVE安装后报错:NO IOMMU Detected解决办法

1、首先在BIOS中确定图形界面卡,打开了VT-D功能。 2、修改grub vim /etc/default/grub 找到:GRUB_CMDLINE_LINUX_DEFAULT"quiet" 然后修改为 GRUB_CMDLINE_LINUX_DEFAULT"quiet intel_iommuon" 3、使用命…

华擎B660 主板 怎么设置打开来电自启功能?

环境: 华擎B660 钢铁传奇 1700 : Intel B660 问题描述: 华擎B660 主板 怎么设置打开来电自启功能? 解决方案: 1.前往-高级- 芯片组配置 2.往下划找到交流 /电源断电恢复 选择电源故障后的电源状态。如果选择 [关机]&#x…

mapbox gl 测量

一、代码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>Measure distances</title> <meta name"viewport" content"initial-scale1,maximum-scale1,user-scalableno"> <link hre…

Typora导出html文件图片自动转换成base64

Typora导出html文件图片自动转换成base64 一、出现问题二、解决方案三、编码实现3.1.创建Java项目3.2.代码3.3.打包成Jar包 四、如何使用endl 一、出现问题 typora 导出 html 的时候必须带有原图片&#xff0c;不方便交流学习&#xff0c;文件太多显得冗余&#xff0c;只有将图…

【vim 学习系列文章 3.2 -- vim 删除 空格】

文章目录 vim 删除行尾空格 vim 删除行尾空格 在代码开发的过程中&#xff0c;经常会遇到行尾有空格的现象&#xff0c;如下&#xff1a; 我们可以在 .vimrc 中通过map 命令来映射删除行尾空格的快捷键&#xff0c;如下&#xff1a; map d<space> :%s/\s*$//g <cr…

Spring速成(一)

文章目录 Spring速成&#xff08;一&#xff09;1&#xff0c;课程介绍1.1 为什么要学?1.2 学什么?1.3 怎么学? 2&#xff0c;Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史 2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线 2.3 Spring核心概…

Linux实验记录:使用Apache的虚拟主机功能

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 正文&#xff1a; 目录 前言&#xff1a; 正文&…

【重温设计模式】构建器及其Java示例

设计模式中的构建器模式介绍 在编程的世界里&#xff0c;设计模式是一种让我们的代码更加优雅、可读、可维护的工具。其中&#xff0c;构建器模式是一种创建型模式&#xff0c;它提供了一种高效且灵活的方式来创建复杂对象。这种模式的主要特点是&#xff0c;它分离了对象的构…

易点易动设备管理平台助力制造企业实现设备的智能化维修和保养管理

在制造业领域&#xff0c;设备的维修和保养是保障生产运行和产品质量的关键环节。然而&#xff0c;传统的维修和保养管理方式往往存在效率低下、难以及时发现问题等问题。为了解决这些挑战&#xff0c;易点易动设备管理平台应运而生。该平台利用物联网和数据分析技术&#xff0…