0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何区分卷积网络与全连接网络

jf_78858299 来源:算法与编程之美 作者: 编程之美 2023-02-21 15:05 次阅读

问题
卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习。卷积神经网络具有表征学习能力,能够按其阶层结构对输入信息进行平移不变分类,因此也被称为“平移不变人工神经网络。
全连接神经网络是具有多层感知器的的网络,也就是多层神经元的网络。层与层之间需要包括一个非线性激活函数,需要有一个对输入和输出都隐藏的层,还需要保持高度的连通性,由网络的突触权重决定。那两者的区别是什么呢?

方法
卷积神经网络也是通过一层一层的节点组织起来的。和全连接神经网络一样,卷积神经网络中的每一个节点就是一个神经元。在全连接神经网络中,每相邻两层之间的节点都有边相连,于是会将每一层的全连接层中的节点组织成一列,这样方便显示连接结构。而对于卷积神经网络,相邻两层之间只有部分节点相连,为了展示每一层神经元的维度,一般会将每一层卷积层的节点组织成一个三维矩阵。
除了结构相似,卷积神经网络的输入输出以及训练的流程和全连接神经网络也基本一致,以图像分类为列,卷积神经网络的输入层就是图像的原始图像,而输出层中的每一个节点代表了不同类别的可信度。这和全连接神经网络的输入输出是一致的。类似的,全连接神经网络的损失函数以及参数的优化过程也都适用于卷积神经网络。因此,全连接神经网络和卷积神经网络的唯一区别就是神经网络相邻两层的连接方式。
但是全神经网络无法很好地处理好图像数据,然而卷积神经网络却很好地客服了这个缺点,使用全连接神经网络处理图像的最大问题就是:全连接层的参数太多,对于MNIST数据,每一张图片的大小是28*28*1,其中28*28代表的是图片的大小,*1表示图像是黑白的,有一个色彩通道。假设第一层隐藏层的节点数为500个,那么一个全连接层的神经网络有28*28*500+500=392500个参数,而且有的图片会更大或者是彩色的图片,这时候参数将会更多。参数增多除了导致计算速度减慢,还很容易导致过拟合的问题。所以需要一个合理的神经网络结构来有效的减少神经网络中参数的个数。卷积神经网络就可以更好的达到这个目的。

from keras import layers
from keras import models
from keras.datasets import mnist
from keras.utils import to_categorical
(train_images, train_labels), (test_images, test_labels) = mnist.load_data('D:/Python36/Coding/PycharmProjects/ttt/mnist.npz')
train_images = train_images.reshape(60000, 28*28)
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape(10000, 28*28)
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
model = models.Sequential()
model.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])
history=model.fit(train_images, train_labels, epochs=10, batch_size=128)
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(test_acc,test_acc)
#0.9786 0.9786
print("history_dict%s =" %history.history)
#history_dict = {'loss': [0.25715254720052083, 0.1041663886765639, 0.06873120647072792, 0.049757948418458306, 0.037821156319851675, 0.02870141142855088, 0.02186925242592891, 0.01737390520994862, 0.01316443470219771, 0.010196967865650853],
# 'acc': [0.9253666666984558, 0.9694833333333334, 0.9794666666348775, 0.9850166666984558, 0.9886666666666667, 0.9917666666666667, 0.9935499999682108, 0.9949499999682109, 0.9960999999682109, 0.9972833333333333]} =
acc1 = history.history['acc']
loss1 = history.history['loss']
print(model.summary())
(train_images, train_labels), (test_images, test_labels) = mnist.load_data('D:/Python36/Coding/PycharmProjects/ttt/mnist.npz')
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])
history = model.fit(train_images, train_labels, epochs=10, batch_size=64)
test_loss, test_acc = model.evaluate(test_images, test_labels)
##0.9919 0.9919
print("history_dict =%s" %history.history)
#history_dict = {'loss': [0.1729982195024689, 0.04632370648694535, 0.031306330454613396, 0.02327785180026355, 0.01820601755216679, 0.01537780981725761, 0.011968255878429288, 0.010757189085084126, 0.008755202058390447, 0.007045005079609898],
# 'acc': [0.9456333333333333, 0.9859, 0.9903333333333333, 0.9929333333333333, 0.99435, 0.9953333333333333, 0.9962333333333333, 0.9966, 0.99735, 0.9979333333333333]}
acc2 = history.history['acc']
loss2 = history.history['loss']
print(model.summary())
import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
epochs = range(1, len(acc1) + 1)
ax.plot(epochs, acc1, 'bo', label='dense Training acc',color='red')
ax.plot(epochs, loss1, 'b', label='dense Training loss',color='red')
ax.plot(epochs, acc2, 'bo', label='Conv2D Training acc',color='green')
ax.plot(epochs, loss2, 'b', label='Conv2D Training loss',color='green')
ax.legend(loc='best')
ax.set_title('Training and validation accuracy by different model')
ax.set_xlabel('Epochs')
ax.set_ylabel('Accuracy')
plt.show()

pYYBAGP0bQOANu_QAAE831rxP04796.png


结语

全连接网络没有卷积层,只使用全连接层(以及非线性层)。

以关键是理解卷积层和全连接层的区别。

全连接层有三个特点:

关注全局信息(每个点都和前后层的所有点链接)

参数量巨大,计算耗时

输入维度需要匹配(因为是矩阵运算,维度不一致无法计算)

卷积层

这个卷积和信号系统中的卷积不太一样,其实就是一个简单的乘加运算,

局部链接:当前层的神经元只和下一层神经元的局部链接(并不是全连接层的全局链接)

权重共享:神经元的参数(如上图的3*3卷积核),在整个特征图上都是共享的,而不是每个滑动窗口都不同

也正是因为这两个特性,所以卷积层相比于全连接层有如下优点:

需要学习的参数更少,从而降低了过度拟合的可能性,因为该模型不如完全连接的网络复杂。

只需要考虑中的上下文/共享信息。这个未来在许多应用中非常重要,例如图像、视频、文本和语音处理/挖掘,因为相邻输入(例如像素、帧、单词等)通常携带相关信息。

但需要注意的是,无论是全连接层,还是卷积层,都是线性层,只能拟合线性函数,所以都需要通过ReLU等引入非线性,以增加模型的表达能力。比如ReLU函数接受一个输入x,并返回{0, x}的最大值。ReLU(x) = argmax(x, 0)。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4656

    浏览量

    99487
  • 深度学习
    +关注

    关注

    73

    文章

    5339

    浏览量

    120188
  • 卷积神经网络

    关注

    4

    文章

    336

    浏览量

    11761
收藏 人收藏

    评论

    相关推荐

    【PYNQ-Z2申请】基于PYNQ的卷积神经网络加速

    ,得到训练参数2、利用开发板arm与FPGA联合的特性,在arm端实现图像预处理已经卷积核神经网络的池化、激活函数和连接,在FPGA端实现卷积
    发表于 12-19 11:37

    连接神经网络卷积神经网络有什么区别

    连接神经网络卷积神经网络的区别
    发表于 06-06 14:21

    基于三通道连接层的卷积神经网络特征提取

    针对纹身图像的特点和卷积神经网络(CNN)在连接层对图像特征抽取能力的不足问题,提出一种三通道的卷积神经
    发表于 11-28 17:07 0次下载

    卷积网络FCN进行图像分割

    与 FCN 通常CNN网络卷积层之后会接上若干个连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。
    发表于 09-26 17:22 542次阅读

    卷积神经网络连接层作用理解总结

    一般来说,卷积神经网络会有三种类型的隐藏层——卷积层、池化层、连接层。卷积层和池化层比较好理解
    的头像 发表于 01-30 17:23 2w次阅读

    卷积网络连接网络的比较

    我们在深度学习的过程中,开始对模型进行在测试集的精度进行预测时,最开始是连接网络进行模型的精度预测,最后发现测试集的精度预测值不是很理想,就在想能不能换一种网络层提高测试集的精度?
    的头像 发表于 03-24 14:49 1056次阅读
    <b class='flag-5'>卷积</b><b class='flag-5'>网络</b>和<b class='flag-5'>全</b><b class='flag-5'>连接</b><b class='flag-5'>网络</b>的比较

    PyTorch教程14.11之卷积网络

    电子发烧友网站提供《PyTorch教程14.11之卷积网络.pdf》资料免费下载
    发表于 06-05 11:19 0次下载
    PyTorch教程14.11之<b class='flag-5'>全</b><b class='flag-5'>卷积</b><b class='flag-5'>网络</b>

    卷积神经网络如何识别图像

    多层卷积层、池化层和连接层。CNN模型通过训练识别并学习高度复杂的图像模式,对于识别物体和进行图像分类等任务有着非常优越的表现。本文将会详细介绍卷积神经
    的头像 发表于 08-21 16:49 1647次阅读

    卷积神经网络的基本原理 卷积神经网络发展 卷积神经网络三大特点

    中最重要的神经网络之一。它是一种由多个卷积层和池化层(也可称为下采样层)组成的神经网络。CNN 的基本思想是以图像为输入,通过网络卷积、下
    的头像 发表于 08-21 16:49 1858次阅读

    卷积神经网络基本结构 卷积神经网络主要包括什么

    。它的基本结构由卷积层、池化层和连接层三部分组成,其中卷积层是核心部分,用于提取图像的特征,池化层用于降低特征图的大小,
    的头像 发表于 08-21 16:57 7772次阅读

    卷积神经网络层级结构 卷积神经网络卷积层讲解

    像分类、目标检测、人脸识别等。卷积神经网络的核心是卷积层和池化层,它们构成了网络的主干,实现了对图像特征的提取和抽象。 一、卷积神经
    的头像 发表于 08-21 16:49 5870次阅读

    卷积神经网络的介绍 什么是卷积神经网络算法

    的深度学习算法。CNN模型最早被提出是为了处理图像,其模型结构中包含卷积层、池化层和连接层等关键技术,经过多个卷积层和池化层的处理,CNN可以提取出图像中的特征信息,从而对图像进行分
    的头像 发表于 08-21 16:49 1582次阅读

    卷积神经网络算法代码matlab

    )、池化层(Pooling Layer)和连接层(Fully Connected Layer)。卷积神经网络源自对脑神经细胞的研究,能够有效地处理大规模的视觉和语音数据。本文将详细介
    的头像 发表于 08-21 16:50 953次阅读

    常见的卷积神经网络模型 典型的卷积神经网络模型

    LeNet是卷积神经网络的开山祖师,是由Yan LeCunn在1998年提出的经典卷积神经网络模型。它最初是为手写体数字识别而设计的,由卷积
    的头像 发表于 08-21 17:11 2080次阅读

    卷积神经网络模型的优缺点

    等领域中非常流行,可用于分类、分割、检测等任务。而在实际应用中,卷积神经网络模型有其优点和缺点。这篇文章将详细介绍卷积神经网络模型的特点、优点和缺点。 一、
    的头像 发表于 08-21 17:15 3545次阅读