神经网络--从0开始搭建全连接网络和CNN网络
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了神经网络--从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.调用库函数
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
(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函数)
指明优化器、损失函数、准确率计算函数
# 编译(使用交叉熵作为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.输出
输出测试集上的预测准确率
# 输出
scores = model.evaluate(x_test,y_test)
print(scores)
print("The accuracy of the model is %f" % scores[1]) #输出测试集上的预测准确率
这里是输出的结果:
5.画出图像
使用plt模块进行数据可视化处理
# 画出图像
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.调用库函数
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数据库
# 调用数据集
dataset, metaset = tfds.load(mnist, as_supervised=True, with_info=True)
train_dataset, test_dataset = dataset[train], dataset[test]
3.图片归一化
# 图片归一化
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),一个全连接输出层
# 选择模型,构建网络
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.编译
指明优化器、损失函数、准确率计算函数
# 编译(使用交叉熵作为loss函数),指明优化器、损失函数、准确率计算函数
model.compile(optimizer=adam,loss=sparse_categorical_crossentropy,metrics=[accuracy])
# 展示训练的过程
display(model.summary())
这里是输出的结果:
6.批量输入的样本个数
# 批量输入的样本个数
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
# 训练(训练10个epoch)
history = model.fit(train_dataset, epochs=10, steps_per_epoch=math.ceil(num_train / BATCH_SIZE))
这里是输出的结果:
8.输出
# 输出
test_loss, test_accuracy = model.evaluate(test_dataset, steps=math.ceil(num_test / BATCH_SIZE))
print(test_loss, test_accuracy)
这里是输出的结果:
9.画出图像
使用plt模块进行数据可视化处理
# 画出图像
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在此种方面会更具优势
以上是关于神经网络--从0开始搭建全连接网络和CNN网络的主要内容,如果未能解决你的问题,请参考以下文章
人工智能 AI 3:全连接网络,前馈神经网络卷积神经网络:非全连接网络CNN:循环神经网络
人工智能 AI 3:全连接网络,前馈神经网络卷积神经网络:非全连接网络CNN:循环神经网络