机器学习实战:Python基于NN神经网络进行分类(十一)

2023-07-06 14:42:15

1 前言

神经网络(Neural network,NN)机器学习是一种基于人工神经网络的机器学习方法,它模拟了人类神经系统的工作原理。神经网络是由多个人工神经元组成的网络结构,每个神经元都接收输入信号、进行计算并生成输出信号。

1.1 神经网络的介绍

首先了解一下神经元的概念:

神经元Neuron是神经网络的基本单元,模拟了生物神经系统中的神经元的功能。每个神经元接收来自其他神经元的输入信号,并通过计算生成输出信号。神经元具有权重weights偏置bias,它们用于调节输入信号的影响力。

层Layer是神经网络中神经元的组织方式。神经网络通常由多个层次组成,包括输入层、隐藏层和输出层。输入层接收外部输入数据,隐藏层在输入层和输出层之间进行信息处理,输出层产生最终的输出结果。隐藏层可以有多层,每一层都由多个神经元组成。

神经网络Neural Network是由多个神经元和层次组成的网络结构。神经网络中的神经元通过连接connections相互关联,并进行信息传递和处理。每个神经元的输出作为其他神经元的输入,并通过权重和激活函数进行计算。神经网络通过调整权重来学习输入和输出之间的复杂关系。神经网络的层之间存在前向连接和反向连接。在前向传播过程中,输入信号从输入层开始向前传播,经过隐藏层的处理,最终到达输出层。在反向传播过程中,通过比较网络输出与目标输出的差异,计算梯度并反向传播,以更新神经网络中的权重,从而使得网络的输出更接近目标输出。

优点:

  • 学习能力强:神经网络能够通过训练学习复杂的非线性关系,具有很强的模式识别和特征提取能力。它可以从大量数据中自动学习并发现隐藏在数据中的规律。

  • 适应性好:神经网络对于输入数据的变化和噪声具有一定的容忍度,能够适应不同类型的数据和问题。它可以处理多种数据类型,如图像、文本、声音等,并且在不同领域具有广泛的应用。

  • 并行处理能力:神经网络中的神经元和层次之间可以进行并行计算,充分利用多核处理器和图形处理器等硬件设备的并行处理能力,提高计算效率和速度。

  • 泛化能力强:经过训练的神经网络具有较强的泛化能力,即可以对未见过的数据进行准确预测和分类。它能够从训练数据中学习到一般规律,并将这些规律应用于新的数据。

缺点:

  • 数据需求量大:神经网络通常需要大量的训练数据来达到较好的性能。对于某些领域和任务,获取大规模的标注数据可能是困难和昂贵的。

  • 训练时间长:训练神经网络需要较长的时间,特别是在深层网络和大规模数据集的情况下。对于复杂的网络结构和大规模的数据,训练过程可能需要数小时甚至数天。

  • 参数调节困难:神经网络中的参数数量较多,调节和优化这些参数需要一定的经验和技巧。不合适的参数选择可能导致网络性能下降或过拟合现象的发生。

  • 解释性差:由于神经网络的复杂性和黑盒特性,它们往往难以提供可解释的结果。神经网络往往被视为一种黑盒模型,难以解释其决策过程和内部工作原理。

1.2 神经网络的应用

区别于基础机器学习算法,神经网络算法可以泛化到深度学习,因此可应用的领域有很多:

  1. 计算机视觉:神经网络在图像识别、目标检测、人脸识别、图像生成和图像分割等计算机视觉任务中被广泛应用。例如,卷积神经网络CNN在图像分类任务中取得了重大突破,如使用深度学习进行图像分类的应用。

  2. 自然语言处理:神经网络在文本分类、情感分析、机器翻译、语音识别和自然语言生成等自然语言处理任务中具有重要作用。递归神经网络RNN变压器网络Transformer是常用的神经网络架构。

  3. 语音和音频处理:神经网络在语音识别、语音合成、音频分类和音乐生成等领域发挥着关键作用。循环神经网络RNN卷积神经网络CNN在语音和音频处理中得到广泛应用。

  4. 强化学习:神经网络在强化学习中用于构建智能体Agent,使其能够通过与环境的交互学习最优策略。深度强化学习算法如深度Q网络DQN和策略梯度方法在游戏玩法、机器人控制和自动驾驶等领域取得了显著进展。

  5. 推荐系统:神经网络可用于构建个性化推荐系统,根据用户的历史行为和兴趣进行推荐。深度学习模型如卷积神经网络CNN循环神经网络RNN在推荐系统中被广泛应用。

  6. 医疗和生物学:神经网络在医学图像分析、疾病诊断、药物研发和基因组学等医疗和生物学领域具有重要应用。深度学习模型被用于解析医学图像,如肿瘤检测和病变分析。

  7. 金融和投资:神经网络可应用于金融市场预测、风险管理、信用评估和交易策略优化等领域。例如,用于股票价格预测和高频交易的神经网络模型。

  8. 艺术和创作:神经网络在艺术和创意领域有创造性的应用。例如,生成对抗网络GAN可用于生成艺术作品、图像合成和风格转换等任务。

深度学习Deep Learning是一种基于神经网络的机器学习方法,强调多层次的网络结构。深度学习通过增加网络的深度(层数)来提高网络的表达能力,使其能够学习到更复杂的特征和模式。

深度学习利用多层神经网络进行特征提取和抽象表示,层与层之间的信息传递和计算通过前向传播进行。训练过程中,深度学习使用反向传播算法Backpropagation来计算梯度并调整网络中的权重,以最小化预测结果与目标结果之间的差异。

特别注意,深度学习是神经网络的一个重要分支,但并不是唯一的方法。还存在其他类型的神经网络,如卷积神经网络CNN用于图像处理,循环神经网络RNN用于序列数据处理等。因此,深度学习是神经网络的一种重要实现方式,具有更深的网络结构和更强的表达能力,可以更好地处理复杂的任务和数据。

2. Tensorflow实战演示

2.1 导入函数

import tensorflow as tf
import matplotlib.pyplot as plt

2.2 导入数据

MNIST数据集,由 60,000 张训练图像和 10,000 张测试图像以及表示图像中存在的数字的标签组成。每个图像由 28×28 个灰度像素表示,这里直接调用API即可。

mnist = tf.keras.datasets.mnist
(train_images, train_labels) , (test_images, test_labels) = mnist.load_data()

# 查看整体情况
print("train_images shape: ", train_images.shape)
print("train_labels shape: ", train_labels.shape)
print("test_images shape: ", test_images.shape)
print("test_labels shape: ", test_labels.shape)
 
# 展示前9个图像
fig = plt.figure(figsize=(10,10))
 
nrows=3
ncols=3
for i in range(9):
  fig.add_subplot(nrows, ncols, i+1)
  plt.imshow(train_images[i])
  plt.title("Digit: {}".format(train_labels[i]))
  plt.axis(False)
plt.show()

2.3 数据预处理

因为里面有数字,防止模型将数字当作数值处理,我们的目的是识别数字而非有大小之分的数值因此标记独一标签

# 归一化
train_images = train_images / 255
test_images = test_images / 255
 
print("First Label before conversion:")
print(train_labels[0])
 
# 转换成One-hot标签
train_labels = tf.keras.utils.to_categorical(train_labels)
test_labels = tf.keras.utils.to_categorical(test_labels)
 
print("First Label after conversion:")
print(train_labels[0])

2.4 建立神经网络

先了解下概念:

  • 设置图层:

展平层:我们的输入图像是 2D 数组。展平层通过逐行解堆叠将 2D 数组(28 x 28 像素)转换为 1D 数组(像素)。该层只是更改数据形状,不会学习任何参数/权重。28*28=784;隐藏层:我们唯一的隐藏层由一个完全连接的节点(或神经元)密集层组成,每个节点(或神经元)都有激活功能。512relu输出层:神经网络的输出层由一个具有 10 个输出神经元的密集层组成,每个神经元输出 10 个概率,每个概率为 0 – 9,表示图像是相应数字的概率。输出层被赋予激活函数,以将输入激活转换为概率。softmax

  • 编译模型:

损失函数:这告诉我们的模型如何找到实际标签和模型预测的标签之间的误差。该指标衡量我们的模型在训练期间的准确性。我们希望模型最小化此函数值。我们将为我们的模型使用损失函数。categorical_crossentropy优化:这告诉我们的模型如何通过查看数据和损失函数值来更新模型的权重/参数。我们将为我们的模型使用优化器adam指标(可选):它包含用于监视训练和测试步骤的指标列表。我们将使用准确性或模型正确分类的图像数量。

### 设置图层
model = tf.keras.Sequential([
  # 展平层
  tf.keras.layers.Flatten(),
  # 隐藏层
  tf.keras.layers.Dense(units=512, activation='relu'),
  # 输出层
  tf.keras.layers.Dense(units=10, activation='softmax')
])

### 编译模型
model.compile(
  loss = 'categorical_crossentropy',
  optimizer = 'adam',
  metrics = ['accuracy']
)

2.5 训练模型

训练数据:在这种情况下,我们将使用由将馈送到神经网络的图像组成。train_images
训练标签:在这里,我们将使用由代表训练图像输出的标签组成。train_labels
Epochs:Epochs是我们的模型将迭代所有训练示例的次数。例如,如果我们指定 10 个 epoch,那么我们的模型将在所有 60,000 张训练图像上运行 10 次。

history = model.fit(
  x = train_images,
  y = train_labels,
  epochs = 10
)

可以看到准确率还是特别高的

2.6 评估模型

可视化损失性和准确性

# loss
plt.plot(history.history['loss'])
plt.xlabel('epochs')
plt.legend(['loss'])
plt.show()
 
# accuracy
plt.plot(history.history['accuracy'], color='orange')
plt.xlabel('epochs')
plt.legend(['accuracy'])
plt.show()

# 测试准确率
test_loss, test_accuracy = model.evaluate(
  x = test_images, 
  y = test_labels
)
 
print("Test Loss: %.4f"%test_loss)
print("Test Accuracy: %.4f"%test_accuracy)

2.7 预测

# 可修改索引
index=12
 
# 图像
plt.imshow(test_images[index])
 
# 准确性
print("Probabilities predicted for image at index", index)
print(predicted_probabilities[index])
 
print()
 
# 预测类别
print("Probabilities class for image at index", index)
print(predicted_classes[index])

3. 讨论

通读看个两三遍顺利掌握神经网络入门,有同学会说这个不是挺简单的吗用肉眼也能看出,好像意义不大,神经网络最大的特点就是可以深!MINIST这个手写数字图像数据集确实是简单,图像相对较为规整和清晰,数字通常位于图像中心且无明显的噪声。因此,即使是相对简单的网络结构,也可以在这个数据集上表现出很好的准确性。然而,对于更复杂、多样化和嘈杂的图像数据集,简单的网络结构可能无法捕捉到更细微的特征和模式,因此需要更复杂的神经网络模型来提高预测的准确性。

这个简单的神经网络仅包含一个隐藏层和一个输出层,对于更复杂的问题和数据集,通常需要更深层和更复杂的网络结构才能获得更准确的预测结果。

识别包含多个物体的复杂场景或区分具有相似外观的物体。在这种情况下,简单的神经网络可能无法有效地捕捉到图像中的复杂特征和模式。通过使用更深层和更复杂的神经网络,例如深度卷积神经网络(CNN),可以获得更好的性能。深度CNN通常包含多个卷积层和池化层,用于提取图像中的局部特征,并在更高层次上进行抽象和表示。这样的网络结构能够处理更复杂和多样化的图像数据集,并获得更准确的分类结果。

更多推荐

若依框架集成WebSocket带用户信息认证

一、WebSocket基础知识我们平时前后台请求用的最多的就是HTTP/1.1协议,它有一个缺陷,通信只能由客户端发起,如果想要不断获取服务器信息就要不断轮询发出请求,那么如果我们需要服务器状态变化的时候能够主动通知客户端就需要用到WebSocket了,WebSocket是一种网络传输协议,同样也位于OSI模型的应用层

c++学习之十四

1)利用std::function实现回调函数,实现生产者及消费者模型//254、回调函数的实现//在消息队列和网络库的框架中,当接收到消息(报文)时,回调用户自定义的函数对象,把消息(报文)参数传给它,由它决定如何处理。//示例://254、回调函数的实现//在消息队列和网络库的框架中,当接收到消息(报文)时,回调用

【2023】Redis相关面试题

1.Redis是什么?它有什么特点?答:Redis是一个使用C语言编写的开源、高性能、支持多种数据结构的NoSQL数据库。支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等。数据存储在内存中,可以快速读写。支持数据持久化,可以将数据保存到磁盘上。提供了丰富的功能,如发布订阅、事务、Lua脚本等。具有高可用性和可

jvm面试题

jvm内存区域Q:jvm内存区域怎么划分的?答:堆内存(线程共享):所有线程共享的一块区域,垃圾收集器管理的主要区域。主要存储对象、数组。Java堆中还可以细分为:新生代和老年代;再细致一点的有Eden空间、FromSurvivor空间、ToSurvivor空间等,默认情况下新生代按照8:1:1的比例来分配。程序计数器

IMX6ULL ARM Linux开发板SD卡启动,SD卡的分区与分区格式化创建

一、确定TF卡挂载到ubuntu上的设备名称及分区情况1.在ubuntu不接入TF卡的情况下,使用df-lh/dev/sd*命令查看当前"/dev/sd开头"的设备。##输入df-lh/dev/sd*命令,敲回车键~$df-lh/dev/sd*2.将TF卡接入到ubuntu,再次使用df命令,进行查看,多出来的设备即是

【C++】C++ 语言对 C 语言的加强 ④ ( C 语言中的三目运算符 - 不能作为左值 | C++ 语言中的三目运算符增强 | C 语言中三目运算符作为左值使用 )

文章目录一、C语言中的三目运算符二、C语言中三目运算符不能作为左值三、C++语言中的三目运算符增强四、C语言中三目运算符作为左值使用一、C语言中的三目运算符C语言中的"三目运算符",又称为"条件运算符",相当于一个简化版本的ifelse语句;三目运算符语法:condition?expression1:expressio

STM32--PWR电源控制

文章目录PWR电源电源管理器上电复位(POR)和掉电复位(PDR)可编程电压监测器(PVD)低功耗模式睡眠模式停止模式待机模式睡眠模式工程停止模式待机模式PWRSTM32的PWR模块是其电源管理系统的核心部分,负责控制和管理芯片的供电和电源状态。电源STM32的工作电压(VDD)为2.0~3.6V。通过内置的电压调节器

【C++】C++ 引用详解 ⑨ ( 常量引用初始化 | C / C++ 常量分配内存的四种情况 )

文章目录一、常量引用初始化1、使用"普通变量"初始化"常量引用"2、使用"常量/字面量"初始化"常量引用"3、C/C++常量分配内存的四种情况4、代码示例-常量引用初始化一、常量引用初始化1、使用"普通变量"初始化"常量引用"使用"普通变量"初始化"常量引用",就是将普通变量赋值给常量应用,也可以理解为将变量转为常量;

cognex Insight相机与机器人配合标定的方法(转载不易)

PCBased原理类似,可以参考本文的方法。视觉定位引导4轴或6轴机器人相机固定安装在支架上,或者安装在机器人上首先需要了解的……是否是多相机引导的对位贴合类项目?对位贴合类项目,不论采用机器人还是运动平台,考虑采用AlignplusTA;是否是单相机引导?还是多相机多工位组合装配?多相机多工位组合装配引导,考虑采用V

DNG格式详解,DNG是什么?为何DNG可以取代RAW统一单反相机、苹果安卓移动端相机拍摄输出原始图像数据标准

返回图像处理总目录:《JavaCV图像处理合集总目录》前言在DNG格式发布之前,我们先了解一下之前单反相机、苹果和安卓移动端相机拍照输出未经处理的原始图像格式是什么?RAW什么是RAW?RAW是未经处理、也未经压缩的格式。可以把RAW概念化为“原始图像编码数据”或更形象的称为“数字底片”。RAW是CMOS或者CCD图像

设计模式-原型模式

相信很多同学小时候都玩过《超级马里奥》这款游戏,不知道你是否还记得你曾经营救过的公主?你们在一起了吗?哈哈!小时候我家可没这个条件,经常跑到同学家里玩(或者看别人玩),可羡慕死我了。小的时候只知道玩,长大后才知道原来这么多关卡的马里奥竟然只占用40KB,我现在随手拍张照片也有个5MB左右呀!后来经过查阅资料才知道其中的

热文推荐