赞
踩
前言:
Hello大家好,我是Dream。 今天来学习一下如何从0开始搭建全连接网络和CNN网络,并通过实验简单对比一下两种神经网络的不同之处,本文目录较长,可以根据需要自动选取要看的内容~
说明:在此试验下,我们使用的是使用tf2.x版本,在jupyter环境下完成
在本文中,我们将主要完成以下四个任务:
加载keras内置的mnist数据库
自己搭建简单神经网络,并自选损失函数和优化方法
搭建4层全连接神经网络,除输入层以外,各层神经元个数分别为1000,300,64,10,激活函数自选
搭建CNN网络,要求有1个卷积层(32卷积核),1个池化层(2x2),1个卷积层(16卷积核),1个全局池化层(globalMaxPool),一个全连接输出层,激活函数自选
加载keras内置的mnist数据库,搭建4层全连接神经网络,除输入层以外,各层神经元个数分别为1000,300,64,10,激活函数自选
import tensorflow as tf
import matplotlib.pyplot as plt
mnist = tf.keras.datasets.mnist
from tensorflow.keras.layers import Flatten,Dense,Dropout
搭建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作为激活函数
指明优化器、损失函数、准确率计算函数
# 编译(使用交叉熵作为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)
这里是训练的结果:
输出测试集上的预测准确率
# 输出
scores = model.evaluate(x_test,y_test)
print(scores)
print("The accuracy of the model is %f" % scores[1]) #输出测试集上的预测准确率
这里是输出的结果:
使用plt模块进行数据可视化处理
# 画出图像
plt.plot(history.history['loss'], color='red', label='Loss')
plt.legend(loc='best')
plt.title('Training Loss')
plt.show()
第一种神经网络准确率:0.976200
要求有1个卷积层,1个池化层,1个全局池化层(globalMaxPool),一个全连接输出层,激活函数自选
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
加载keras内置的mnist数据库
# 调用数据集
dataset, metaset = tfds.load('mnist', as_supervised=True, with_info=True)
train_dataset, test_dataset = dataset['train'], dataset['test']
# 图片归一化
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)
构建出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作为激活函数
指明优化器、损失函数、准确率计算函数
# 编译(使用交叉熵作为loss函数),指明优化器、损失函数、准确率计算函数
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
# 展示训练的过程
display(model.summary())
这里是输出的结果:
# 批量输入的样本个数
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)
训练10个epoch
# 训练(训练10个epoch)
history = model.fit(train_dataset, epochs=10, steps_per_epoch=math.ceil(num_train / BATCH_SIZE))
这里是输出的结果:
# 输出
test_loss, test_accuracy = model.evaluate(test_dataset, steps=math.ceil(num_test / BATCH_SIZE))
print(test_loss, test_accuracy)
这里是输出的结果:
使用plt模块进行数据可视化处理
# 画出图像
plt.plot(history.history['loss'], color='red', label='Loss')
plt.legend(loc='best')
plt.title('Training Loss')
plt.show()
这里是输出的结果:
第二种神经网络准确率:0.993232
第一种神经网络准确率:0.976200 第二种神经网络准确率:0.993232
总结: 通过对比我们可以发现CNN卷积神经网络相对于传统神经网络NN准确率会高一些,由卷积的操作可知,输出图像中的任何一个单元,只跟输入图像的一部分有关系。而传统神经网络中,由于都是全连接,所以输出的任何一个单元,都要受输入的所有的单元的影响。这样无形中会对图像的识别效果大打折扣,因此CNN在此种方面会更具优势
关注此公众号:人生苦短我用Pythons
,回复 神经网络实验
获取源码,快点击我吧
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。