首页 > 其他分享 >机器学习系列----介绍前馈神经网络和卷积神经网络 (CNN)

机器学习系列----介绍前馈神经网络和卷积神经网络 (CNN)

时间:2024-11-07 16:45:01浏览次数:7  
标签:卷积 ---- test 神经网络 CNN import model

前言


  在深度学习领域,神经网络是一种模拟人脑神经元结构和功能的数学模型。它通过大量的层次结构和参数调整来实现模式识别、分类、回归等任务。常见的神经网络结构有前馈神经网络(Feedforward Neural Networks,简称 FNN)和卷积神经网络(Convolutional Neural Networks,简称 CNN)。这两种网络模型在图像处理、语音识别等多个领域取得了巨大的成功。

本篇博客将详细介绍前馈神经网络和卷积神经网络的基本原理,并通过代码示例进一步帮助理解。

一、前馈神经网络(Feedforward Neural Networks)

1.1 前馈神经网络概述


前馈神经网络(FNN)是一种最基本的神经网络结构,信息在网络中按单向流动,没有任何循环或反馈连接。它由输入层、若干隐藏层和输出层组成。

输入层:接收原始数据,传递给网络中的隐藏层。
隐藏层:通过神经元和激活函数处理数据,捕捉数据中的特征。
输出层:输出网络最终的预测结果。
FNN 是最简单的神经网络结构,通常用于分类和回归问题。

1.2 FNN的工作原理

输入数据通过输入层传入网络。
每一层的神经元接收上一层的输出并进行加权求和。
加权和通过激活函数进行非线性变换,生成该层的输出。
最后一层输出结果,即模型的预测值。

1.3 代码示例:用 TensorFlow 构建前馈神经网络

下面是一个简单的前馈神经网络实现,用于分类任务(例如 MNIST 手写数字识别):

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical

# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 数据预处理
x_train = x_train.reshape((x_train.shape[0], 28, 28, 1)).astype('float32') / 255
x_test = x_test.reshape((x_test.shape[0], 28, 28, 1)).astype('float32') / 255
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

# 创建前馈神经网络模型
model = models.Sequential([
    layers.Flatten(input_shape=(28, 28, 1)),   # 将28x28的图片展开成一维向量
    layers.Dense(128, activation='relu'),      # 隐藏层,128个神经元
    layers.Dropout(0.2),                       # Dropout层,防止过拟合
    layers.Dense(10, activation='softmax')     # 输出层,10个神经元,代表10类
])

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

# 训练模型
model.fit(x_train, y_train, epochs=5, batch_size=64)

# 测试模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"Test accuracy: {test_acc}")

1.4 解释

  1. Flatten:将28x28的输入图像展平为一个784维的向量,输入到神经网络中。
  2. Dense:创建一个全连接层,包含128个神经元。激活函数使用 ReLU,使得网络能够学习非线性关系。
  3. Dropout:防止过拟合,训练过程中随机丢弃一些神经元。
  4. Softmax:输出层的激活函数,适用于多分类问题,将网络的输出转化为概率分布。

二、卷积神经网络(Convolutional Neural Networks)

2.1 卷积神经网络概述

卷积神经网络(CNN)是一种专门用于处理具有网格结构的数据的深度学习算法,最常用于图像处理任务。CNN 通过卷积层、池化层等操作提取图像中的局部特征,并最终进行全局分类或回归。

2.2 CNN的工作原理

  1. 卷积操作:卷积层通过多个卷积核(filter)对输入图像进行卷积操作,提取局部特征。卷积操作的结果是一个特征图(feature map)。
  2. 池化操作:池化层用于对特征图进行下采样,通常使用最大池化(Max Pooling)或者平均池化(Average Pooling)。
  3. 全连接层:池化后得到的特征图被展平成一维向量,然后传入全连接层,进行进一步处理,输出最终预测结果。

2.3 代码示例:用 TensorFlow 构建卷积神经网络

以下是一个卷积神经网络的实现,用于处理 MNIST 手写数字识别任务:

  1. 卷积层(Convolutional Layer):通过卷积核对输入图像进行卷积操作,从而提取局部特征。
  2. 池化层(Pooling Layer):对卷积层输出进行下采样,减小图像的尺寸,并减少计算量。
  3. 全连接层(Fully Connected Layer):连接卷积层和输出层,对特征进行整合并输出最终的预测结果。
  4. 卷积操作:卷积层通过多个卷积核(filter)对输入图像进行卷积操作,提取局部特征。卷积操作的结果是一个特征图(feature map)。
  5. 池化操作:池化层用于对特征图进行下采样,通常使用最大池化(Max Pooling)或者平均池化(Average Pooling)。
  6. 全连接层:池化后得到的特征图被展平成一维向量,然后传入全连接层,进行进一步处理,输出最终预测结果。

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical

# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 数据预处理
x_train = x_train.reshape((x_train.shape[0], 28, 28, 1)).astype('float32') / 255
x_test = x_test.reshape((x_test.shape[0], 28, 28, 1)).astype('float32') / 255
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

# 创建前馈神经网络模型
model = models.Sequential([
    layers.Flatten(input_shape=(28, 28, 1)),   # 将28x28的图片展开成一维向量
    layers.Dense(128, activation='relu'),      # 隐藏层,128个神经元
    layers.Dropout(0.2),                       # Dropout层,防止过拟合
    layers.Dense(10, activation='softmax')     # 输出层,10个神经元,代表10类
])

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

# 训练模型
model.fit(x_train, y_train, epochs=5, batch_size=64)

# 测试模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"Test accuracy: {test_acc}")

2.4 解释

  1. Conv2D:卷积层,通过32个3x3的卷积核对输入图像进行卷积,激活函数采用 ReLU
  2. MaxPooling2D:池化层,采用2x2的最大池化操作,降低特征图的维度。
  3. Flatten:将卷积层输出的特征图展平成一维向量,方便输入到全连接层。
  4. Dense:全连接层,最后一层的激活函数采用 softmax,进行多分类。

三、拓展知识 

卷积神经网络(CNN)是一种深度学习模型,它在图像和视频分析中非常有效。以下是一些关于卷积神经网络的拓展知识:

局部连接和权值共享:CNN通过局部连接和权值共享减少了参数数量,这使得网络更易于优化,并降低了过拟合的风险
 

感受野:卷积层中的每个神经元只与输入数据的一个局部区域相连接,这个局部区域称为感受野。这有助于捕捉图像的局部特征
 

卷积层的变体:

逐通道卷积(Depthwise Convolution):每个输入通道应用一个卷积核,适用于单独通道的特征提取
逐点卷积(Pointwise Convolution):在逐通道卷积的基础上,将不同通道的特征图进行融合
深度可分离卷积(Depthwise Separable Convolution):结合了逐通道卷积和逐点卷积,提高了效率
组卷积(Group Convolution):将输入通道分组,每组应用不同的卷积核,减少了参数量
空间可分离卷积(Spatially Separable Convolution):在不同空间维度独立应用卷积核,进一步减少计算量
空洞卷积(Dilated Convolution):通过增加卷积核中的空间间隔来捕捉更宽广的上下文信息
转置卷积(Transposed Convolution):常用于图像生成任务,可以增大特征图的尺寸
稀疏卷积(Sparse Convolution):关注在大量零值存在时的高效计算
多维卷积(Multidimensional Convolution):扩展了卷积操作到更高维度的数据
经典CNN模型:

LeNet-5:由Yann Lecun于1998年提出,是第一个成功的CNN模型,用于手写数字识别

AlexNet:在2012年ImageNet竞赛中取得冠军,标志着深度学习的兴起

VGG-16:以其简单的网络结构和深度而闻名,广泛应用于图像识别任务

应用领域:CNN不仅用于图像分类,还广泛应用于视频分析、医学图像分割、自动驾驶、机器人视觉等领域
 

可解释性研究:随着深度学习模型在关键领域的应用,模型的可解释性变得越来越重要。研究者们正在探索如何使CNN的决策过程更加透明和可理解
 

研究进展:CNN的研究仍在不断发展,包括改进网络架构、提高计算效率、增强模型的泛化能力等方面

1. 图像分类

以经典的VGG-16模型为例,使用Keras库进行图像分类:

from keras.applications import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
from keras.models import Model
import numpy as np

# 加载预训练的VGG16模型,不包括顶层
base_model = VGG16(weights='imagenet', include_top=False)

# 让我们为VGG16添加顶部层
x = base_model.output
x = layers.Flatten()(x) # 展平特征图
x = layers.Dense(4096, activation='relu')(x) # 新增全连接层
x = layers.Dense(4096, activation='relu')(x) # 新增全连接层
predictions = layers.Dense(1000, activation='softmax')(x) # 输出层,1000个单位对应ImageNet的类别数

# 构建完整模型
model = Model(inputs=base_model.input, outputs=predictions)

# 编译模型
model.compile(optimizer=optimizers.SGD(learning_rate=0.001, momentum=0.9), 
              loss='categorical_crossentropy', 
              metrics=['accuracy'])

# 加载你的图片,预处理并预测
img_path = 'path_to_your_image.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

# 预测
predictions = model.predict(x)

2. 目标检测


使用预训练的SSD(Single Shot MultiBox Detector)模型进行目标检测:

from keras.applications import SSD300
from keras.applications.ssd import preprocess_input
from keras.preprocessing import image
import numpy as np

# 加载预训练的SSD300模型
model = SSD300(weights='imagenet')

# 加载你的图片,预处理
img_path = 'path_to_your_image.jpg'
img = image.load_img(img_path, target_size=(300, 300))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

# 预测
preds = model.predict(x)

# 解析预测结果
# 这里需要自定义解析函数,根据模型的输出来获取检测到的目标类别、位置等信息

 3. 图像分割


使用U-Net模型进行图像分割:

from keras.models import Model
from keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, concatenate
from keras.optimizers import Adam

def conv_block(input_tensor, num_filters):
    x = Conv2D(num_filters, (3, 3), padding='same')(input_tensor)
    x = Activation('relu')(x)
    x = Conv2D(num_filters, (3, 3), padding='same')(x)
    x = Activation('relu')(x)
    return x

def encoder_block(input_tensor, num_filters):
    x = conv_block(input_tensor, num_filters)
    p = MaxPooling2D((2, 2))(x)
    return x, p

def decoder_block(input_tensor, concat_tensor, num_filters):
    x = UpSampling2D((2, 2))(input_tensor)
    x = concatenate([x, concat_tensor], axis=-1)
    x = conv_block(x, num_filters)
    return x

# 定义输入
input_img = Input(shape=(256, 256, 3))

# 编码器
c1, p1 = encoder_block(input_img, 32)
c2, p2 = encoder_block(p1, 64)
c3, p3 = encoder_block(p2, 128)
c4, p4 = encoder_block(p3, 256)

# 桥接层
b = conv_block(p4, 512)

# 解码器
d1 = decoder_block(b, c4, 256)
d2 = decoder_block(d1, c3, 128)
d3 = decoder_block(d2, c2, 64)
d4 = decoder_block(d3, c1, 32)

# 输出层
output_img = Conv2D(1, (1, 1), activation='sigmoid')(d4)

# 构建模型
model = Model(inputs=[input_img], outputs=[output_img])

# 编译模型
model.compile(optimizer=Adam(lr=1e-4), loss='binary_crossentropy')

# 训练模型
# model.fit(...)

  这些代码示例提供了使用CNN进行不同任务的基础框架。在实际应用中,你可能需要根据具体任务调整网络结构、损失函数、优化器等。此外,对于大型数据集和复杂任务,还需要进行数据预处理、模型调优、超参数调整等步骤。

   卷积神经网络(CNN)是深度学习领域中处理图像和其他高维数据的核心技术。它们通过模拟人类视觉系统的工作原理,能够自动并有效地从图像中学习到有用的特征表示。CNN的基础结构包括卷积层、激活函数、池化层和全连接层,这些层共同工作以提取图像的局部特征、引入非线性、降低特征维度并输出最终的分类或预测结果。随着研究的深入,CNN的架构不断演进,例如VGG、ResNet和U-Net等,它们在图像分类、目标检测、图像分割等任务中取得了显著成果。此外,CNN也被应用于视频处理、医学图像分析、风格迁移、生成对抗网络(GANs)和自编码器等更广泛的领域。尽管存在挑战,如对大量标注数据的依赖和模型解释性等问题,但CNN的发展势头不减,新的网络架构和优化技术不断涌现,推动了深度学习在各行各业的应用。随着计算能力的提升和算法的改进,CNN在处理复杂问题上的能力将进一步增强,为人工智能的发展贡献重要力量。

前馈(Feedforward)是神经网络中的一种数据传输方式,指的是信息在神经网络中从输入层经过各隐藏层向输出层单向传播,不存在反馈连接。在这种结构中,每一层的神经元仅与相邻层的神经元相连,且每个连接都有一个权重。前馈神经网络(Feedforward Neural Networks, FNN)是最基本的深度学习模型,它们可以用于各种机器学习任务,如分类、回归和模式识别。

前馈神经网络的特点包括:

单向传播:信息从输入层流向隐藏层,最后到达输出层,不存在回路。

权重共享:同一个层内的神经元之间不共享权重,但不同层之间的神经元通过权重连接。

激活函数:每个隐藏层通常包含一个激活函数,如ReLU、Sigmoid或Tanh,以引入非线性,使得网络能够学习和模拟更复杂的函数。

损失函数:网络通过损失函数来衡量预测值与真实值之间的差异,常见的损失函数包括均方误差(MSE)和交叉熵损失。

优化算法:通过反向传播算法(Backpropagation)和梯度下降(或其变体)来更新网络权重,以最小化损失函数。

层次结构:前馈神经网络通常具有多个隐藏层,深层网络能够学习更复杂的特征表示。

前馈神经网络的一个典型例子是多层感知器(Multilayer Perceptron, MLP),它是一个全连接的前馈神经网络。随着深度学习的发展,前馈神经网络已经衍生出多种更复杂的结构,如卷积神经网络(CNN)、循环神经网络(RNN)和变换器(Transformer)等,这些模型在处理不同类型的数据和任务时表现出了卓越的性能。

标签:卷积,----,test,神经网络,CNN,import,model
From: https://blog.csdn.net/DK22151/article/details/143513313

相关文章

  • 2024 nature| 基于motif(模体)的药物相互作用预测——采用局部和全局自注意力机制
    【声明:本文是采用模体结构和注意力机制进药物作用预测,抽象到理论可以看作在复杂网络上进行模体和结构的链路预测。文章出处如下】论文出处:https://www.nature.com/articles/s42256-024-00888-61.摘要:药物-药物相互作用(DDIs)是制药研究和临床应用中的重要问题,因为它们可能......
  • 图解析网络【Published as a conference paper at ICLR 2024】
    【文章来源:https://arxiv.org/pdf/2402.14393】摘要motivation:图池是建立在GNN之上的。它旨在通过将一组节点及其底层结构压缩为更简洁的表示来捕获图级信息。早期的图池化方法,如mean,add或pool对图中的所有节点执行排列不变操作。这些平面池化方法忽略了节点之间的区别,无......
  • W外链如何设置活码功能?
    根据搜索结果,W外链平台的活码功能允许用户创建动态二维码,这些二维码背后可以链接到不同的目标链接或页面,并且可以根据预设条件自动更新跳转链接。以下是W外链平台活码功能的一些关键特点和使用步骤:1.活码的特点:活码与传统静态二维码不同,它能够根据预设条件自动跳转到不同的......
  • 进程调度的时机、方式、切换与过程
    进程调度的时机、方式、切换与过程(理解)​​‍一、进程调度的时机​​有的系统中,只允许进程主动放弃处理机。有的系统中,进程可以主动放弃处理机,当有更紧急的任务需要处理时,也会强行剥夺处理机(被动放弃)。‍​​对2.的补充:——临界资源:一个时间段内只允许一个进程使用的......
  • 调度算法的评价指标
    调度算法的评价指标‍​​‍一、CPU利用率CPU工作的时间占总时间的比例。$$CPU利用率=\frac{CPU工作时间}{总时间}$$计算某种设备的利用率类似。​​‍二、系统吞吐量单位时间内完成作业的数量$$系统吞吐量=\frac{总共完成的作业数}{总时间}$$​​‍三、周转......
  • posgresql数据库高可用方案-patroni
    一、简介pg常用高可用方案有repmgr,patroni等,本文介绍patroni方案。Patroni,是专门为PostgreSQL数据库设计的一款以Python语言实现的高可用软件。其使用外部共享存储软件(kubernetes、etcd、etcd3、zookeeper、aws等)来存储patroni监控到的pg集群状态信息,实现PostgreSQL集群的自......
  • Jasypt工具类(jasypt-spring-boot-starter)
    importorg.jasypt.encryption.pbe.PooledPBEStringEncryptor;importorg.jasypt.encryption.pbe.config.SimpleStringPBEConfig;publicclassJasyptUtil{/***Jasypt生成加密结果*@parampassword配置文件中设定的加密盐值*@paramvalue加密值*@......
  • 关于把竖向单个布局在鸿蒙等折叠手机屏中显示成双向布局
    简单描述下需求场景:本来开发的页面在大部分手机里,都是竖向下来展开的,但现在市场上折叠手机越来越多,那么当用户翻转折叠手机,宽度变长了,原本我们的开发页面就会被拉大,显得不好看,所以需要前端针对折叠屏进行兼容,在没打开的时候正常显示,翻转打开的时候就把页面上的div结合百分比......
  • 调度的概念与层次
    调度的概念与层次‍​​‍一、调度解决的问题理解:在资源有限不能同时处理所有任务的情况下,需要确定某种规则来确定处理这些任务的顺序(划分权级或短时优先或其他等)‍二、调度的层次划分​​‍(一)高级调度/长程调度/作业调度内存的空间有限,无法将所有任务同时装入内存。......
  • 进程调度的时机、方式、切换与过程
    进程调度的时机、方式、切换与过程(理解)​​‍一、进程调度的时机​​有的系统中,只允许进程主动放弃处理机。有的系统中,进程可以主动放弃处理机,当有更紧急的任务需要处理时,也会强行剥夺处理机(被动放弃)。‍​​对2.的补充:——临界资源:一个时间段内只允许一个进程使用的......