首页   >   新闻   >   文章

TensorFlow 实战 Google 深度学习框架(四)
- 2025 -
06/20
02:56
零号员工
发表时间:2025.06.20     作者:Jingyi     来源:ShoelessCai     阅读:38

以图像分类为例,卷积神经网络的输入层就是图像的原始像素,而输出层中的每一个节点代表了不同类别的可信度。

在 TensorFlow 中训练一个卷积神经网络的流程和训练一个全连接神经网络没有任何区别。

使用全连接神经网络处理图像的最大问题在于全连接层的参数太多。其他关于“全连接层”的定义。全连接层的主要作用就是将前层(卷积、池化等层)计算得到的特征空间映射样本标记空间。简单的说就是将特征表示整合成一个值,其优点在于减少特征位置对于分类结果的影响,提高了整个网络的鲁棒性。

参数增多除了导致计算速度减慢,还很容易导致过拟合问题。所以需要一个更合理的神经网络结构来有效地减少神经网络中参数个数。卷积神经网络就可以达到这个目的。

关于池化层。池化层,Pooling Layer,可以非常有效地缩小矩阵的尺寸,从而减少最后全连接层中的参数。使用池化层既可以加快计算速度也有防止过拟合问题的作用。使用最大值操作的池化层被称之为最大池化层(Max Pooling),这是被使用得最多的池化层结构。

反向传播神经网络 BPNN

卷积神经网络

说到卷积神经网络不免好奇,卷积神经网络和 BPNN 到底有啥差别。之前我们已经建立了 BPNN,点击《》获取更多信息。准确率 80%。不难发现,我们处理图片的时候,第一个神经网络层的变量数量,就是像素行和列的成绩 28*28=784。我们还学习了,卷积 Filter 对原来图片是如何作卷积的,模式依据图像的像素逐个挪动作矩阵乘法,变成新的矩阵。从图像上看,是获取了图片的部分信息。那么问题来了:如果我像 BPNN 一样处理,直接变成 n*784 还能用卷积 Filter,即还能“卷”吗?答案显然是否定的。从 TF 函数设置来看,输入要素都是 nr*nc 的图片,还需设置图片的个数,映射特征的数量。其中,nr 是行像素点,nc 是列像素点。

这时候答案会比较显然,卷积神经网络,在 BPNN 之前,而且,在卷积神经网络模型中,使用一些“手段”使得图片变成 n*784 —— 这个动作在卷积神经网络算法中有专有名词,叫做“Flatten”。

笔者用已有的代码、已有数据开展了实验。基本 Idea,卷积 - Pooling - 卷积 - Pooling - flatten - 全连接。其中,卷积依据 Filter 大小使得原来图像矩阵减小。Max-Pooling 如果 2*2 则会使得原来矩阵降低一半维度。而 Flatten 则是将输入数据集变成 n*(nc*nr)。关注参数的个数,会影响训练时间。值得注意的是,这段代码是 99%+的预测能力。







关于代码

(1)导入数据
import tensorflow as tf
tf.compat.v1.disable_eager_execution()

# MNIST 数据集
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0 # 归一化

# 调整数据维度, 注意卷积神经网络的数据结构
train_images = x_train.reshape((60000, 28, 28, 1))
test_images = x_test.reshape((10000, 28, 28, 1))

(2)卷积神经网络
from keras import layers, models

# 构建CNN模型
model = models.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), # 卷积层1
layers.MaxPooling2D((2, 2)), # 最大池化层1
layers.Conv2D(64, (3, 3), activation='relu'), # 卷积层2
layers.MaxPooling2D((2, 2)), # 最大池化层2
layers.Flatten(), # 展平层 784 features
layers.Dense(64, activation='relu'), # 全连接层
layers.Dense(10) # 输出层
])

# 打印模型结构
model.summary()

(3)编译及训练模型
# 编译模型
model.compile(
optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy']
)

# 训练模型
history = model.fit(
train_images, y_train,
epochs=3,
validation_data=(test_images, y_test)
)

(4)预测及打印
import matplotlib.pyplot as plt

# 预测
predictions = model.predict(test_images)

plt.figure(figsize=(10,10)) # 大小
nr = 1
nc = 10

for i in range(nr*nc):
plt.subplot(nr,nc,i+1)
tmp=tf.argmax( predictions[i], axis=1)
tmp_pred = np.argmax(predictions[i])

plt.xticks([]); plt.yticks([]); plt.grid(False)
plt.imshow(x_test[i], cmap='gray' )
plt.xlabel( tmp_pred )

plt.show()

参考文献

[1] PaperDry(2022),在minst数据集上定义和训练CNN卷积神经网络,代码+原理+模型更改,CSDN,2022

[2] 独行妖侠波吉(2023),一.卷积神经网络(CNN)实现minist数据集,CSDN,2023

[3] 令仪.雅(2022),【TensorFlow】tf.nn.conv2d卷积实现+filter计算原理,CSDN,2022

[4] jayboxyz(2019),卷积神经网络CNN,用CNN解决MNIST分类问题,github,2019

[5] 女王de专属领地(2023),Tensorflow整理[4].MNIST高级教程,51CTO,2023

[6] sun-a(2020),TensorFlow 2.0 搭建卷积神经网络 (CNN),博客园,2020

[7] 官网(2024),卷积神经网络(Convolutional Neural Network, CNN),TensorFlow,2024

[8] rousong(2024),从零开始理解神经网络中的flatten层:为什么我们需要它?,百度开发者中心,2024



原文链接

长按/扫码,有您的支持,我们会更加努力!







TOP 5 精选
回到顶部   回上一级
写文章

最新资讯




直播笔记


热点话题


精品论文


有你的鼓励
ShoelessCai 将更努力





文档免费。保护知识产权,保护创新。