神经网络--从0开始搭建全连接网络和CNN网络

前言: Hello大家好,我是Dream。 今天来学习一下如何从0开始搭建全连接网络和CNN网络,并通过实验简单对比一下两种神经网络的不同之处,本文目录较长,可以根据需要自动选取要看的内容~

说明:在此试验下,我们使用的是使用tf2.x版本,在jupyter环境下完成 在本文中,我们将主要完成以下四个任务:

  • 加载keras内置的mnist数据库

  • 自己搭建简单神经网络,并自选损失函数和优化方法

  • 搭建4层全连接神经网络,除输入层以外,各层神经元个数分别为1000,300,64,10,激活函数自选

  • 搭建CNN网络,要求有1个卷积层(32卷积核),1个池化层(2x2),1个卷积层(16卷积核),1个全局池化层(globalMaxPool),一个全连接输出层,激活函数自选

一、搭建4层全连接神经网络

加载keras内置的mnist数据库,搭建4层全连接神经网络,除输入层以外,各层神经元个数分别为1000,300,64,10,激活函数自选

1.调用库函数

python 复制代码
import tensorflow as tf
import matplotlib.pyplot as plt
mnist = tf.keras.datasets.mnist
from tensorflow.keras.layers import Flatten,Dense,Dropout

2.选择模型,构建网络

搭建4层全连接神经网络,除输入层以外,各层神经元个数分别为1000,300,64,10

python 复制代码
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

# 选择模型,构建网络
model = tf.keras.models.Sequential()
model.add(Flatten(input_shape=(28, 28)))
# 各层神经元个数分别为1000,300,64,10
model.add(Dense(1000, activation='relu'))
model.add(Dense(300, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.2))  # 采用20%的dropout
model.add(Dense(10, activation='softmax'))  # 输出结果是10个类别,所以维度是10,最后一层用softmax作为激活函数

3.编译(使用交叉熵作为loss函数)

指明优化器、损失函数、准确率计算函数

python 复制代码
# 编译(使用交叉熵作为loss函数),指明优化器、损失函数、准确率计算函数
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=[tf.keras.metrics.sparse_categorical_accuracy])

# 训练(训练10个epoch)
history = model.fit(x_train, y_train, epochs=10)

这里是训练的结果:

4.输出

输出测试集上的预测准确率

python 复制代码
# 输出
scores = model.evaluate(x_test,y_test)
print(scores)
print("The accuracy of the model is %f" % scores[1])  #输出测试集上的预测准确率

这里是输出的结果:

5.画出图像

使用plt模块进行数据可视化处理

python 复制代码
# 画出图像
plt.plot(history.history['loss'], color='red', label='Loss')
plt.legend(loc='best')
plt.title('Training Loss')
plt.show()

6.结论

第一种神经网络准确率:0.976200

二、搭建CNN网络

要求有1个卷积层,1个池化层,1个全局池化层(globalMaxPool),一个全连接输出层,激活函数自选

1.调用库函数

python 复制代码
import matplotlib.pyplot as plt
import tensorflow as tf
import tensorflow_datasets as tfds
import math
from tensorflow.keras.layers import Conv2D,MaxPooling2D,GlobalMaxPooling2D,Flatten,Dense

2.调用数据集

加载keras内置的mnist数据库

python 复制代码
# 调用数据集
dataset, metaset = tfds.load('mnist', as_supervised=True, with_info=True)
train_dataset, test_dataset = dataset['train'], dataset['test']

3.图片归一化

python 复制代码
# 图片归一化
def normalize(images, labels):
    images = tf.cast(images, tf.float32)
    images /= 255
    return images, labels
train_dataset = train_dataset.map(normalize)
test_dataset = test_dataset.map(normalize)

4.选择模型,构建网络

构建出1个卷积层,1个池化层,1个全局池化层(globalMaxPool),一个全连接输出层

python 复制代码
# 选择模型,构建网络
model = tf.keras.Sequential()

# 卷积层
model.add(Conv2D(32, (5, 5), padding='same', activation=tf.nn.relu, input_shape=(28, 28, 1))),  

# 池化层 
model.add(MaxPooling2D((2, 2), strides=2)), 

# 全局池化层(globalMaxPool)
model.add(Conv2D(64, (5, 5), padding='same', activation=tf.nn.relu)),  # 卷积层
model.add(GlobalMaxPooling2D()),

 # 全连接输出层
model.add(Flatten()),#展平
model.add(Dense(512, activation=tf.nn.relu)),
model.add(Dense(10, activation=tf.nn.softmax))# 输出结果是10个类别,所以维度是10,最后一层用softmax作为激活函数

5.编译

指明优化器、损失函数、准确率计算函数

python 复制代码
# 编译(使用交叉熵作为loss函数),指明优化器、损失函数、准确率计算函数
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
# 展示训练的过程
display(model.summary())

这里是输出的结果:

6.批量输入的样本个数

python 复制代码
# 批量输入的样本个数
BATCH_SIZE = 64
num_train = metaset.splits['train'].num_examples
num_test = metaset.splits['test'].num_examples
train_dataset = train_dataset.repeat().shuffle(num_train).batch(BATCH_SIZE)
test_dataset = test_dataset.repeat().shuffle(num_test).batch(BATCH_SIZE)

7.训练

训练10个epoch

python 复制代码
# 训练(训练10个epoch)
history = model.fit(train_dataset, epochs=10, steps_per_epoch=math.ceil(num_train / BATCH_SIZE))

这里是输出的结果:

8.输出

python 复制代码
# 输出
test_loss, test_accuracy = model.evaluate(test_dataset, steps=math.ceil(num_test / BATCH_SIZE))
print(test_loss, test_accuracy)

这里是输出的结果:

9.画出图像

使用plt模块进行数据可视化处理

python 复制代码
# 画出图像
plt.plot(history.history['loss'], color='red', label='Loss')
plt.legend(loc='best')
plt.title('Training Loss')
plt.show()

这里是输出的结果:

10.结论

第二种神经网络准确率:0.993232

三、两种网络对比

第一种神经网络准确率:0.976200 第二种神经网络准确率:0.993232 总结: 通过对比我们可以发现CNN卷积神经网络相对于传统神经网络NN准确率会高一些,由卷积的操作可知,输出图像中的任何一个单元,只跟输入图像的一部分有关系。而传统神经网络中,由于都是全连接,所以输出的任何一个单元,都要受输入的所有的单元的影响。这样无形中会对图像的识别效果大打折扣,因此CNN在此种方面会更具优势

相关推荐
小强19884 分钟前
SQL Server 慢查询怎么定位?一套从“卡”到“快”的完整排查流程
后端
水深火乐6 分钟前
interface和any
后端
步行cgn7 分钟前
MyBatis Error evaluating expression ‘ids‘. Return value (3) was not iterable 错误详
java·后端
神奇小汤圆10 分钟前
Spring Boot + LangChain4j实现RAG——从零搭建企业级知识库问答系统
后端
H_Peak14 分钟前
Python运算符与流程控制:if条件判断
后端
H_Peak17 分钟前
Python字符串操作:从基础到正则入门
后端
自进化Agent智能体17 分钟前
Hermes 子代理委派 —— 并行工作的艺术
后端
步行cgn20 分钟前
MyBatis 动态 SQL 中的 <foreach> 标签完全解析
后端
SomeB1oody1 小时前
【RustyML入门】5.0. 模型评估
开发语言·后端·机器学习·rust·教程
唐青枫2 小时前
别只把 enum 当常量列表:Zig 枚举、状态机与 Tagged Union 实战
后端