首页 > 其他分享 >神经网络--从0开始搭建全连接网络和CNN网络

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

时间:2023-02-03 19:36:47浏览次数:48  
标签:10 -- 网络 dataset test train tf CNN model

在这里插入图片描述

前言: 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.调用库函数

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在此种方面会更具优势

标签:10,--,网络,dataset,test,train,tf,CNN,model
From: https://blog.51cto.com/u_15492594/6036004

相关文章

  • 跨境电商物流的运营模式
    从事跨境电商行业的卖家应该知道,跨境电商物流是一个非常重要的环节,产品能否快速的送到消费者手中是一个非常重要的环节,让客户有更好的购物体验可以提高用户的回购率,那么跨境......
  • Qt实现 剪映 桌面端的界面效果
    下方是个人实现的桌面端剪映效果,个人觉得自己实现的比较好看,原本的字体太小了再上一张桌面端剪映原版界面原本的界面实现看起来确实字体偏小不好看,因为发现原本也是Qt实现......
  • 速度快高匿又稳定的HTTP代理?
    开春刚上班,还没啥事做,上来知乎摸个鱼,第一时间就看到这个问题推荐给我了。本着摸鱼(划掉)分享的精神,废话不多说,我直接把市面上具体动态短效代理HTTP代理厂商的价格给你搬过来:青......
  • 【MySQL】MySQL 8 的 JSON 新特性详解(1)JSON 数据类型
    一、概述你好,我是小雨青年,一名使用MySQL8的程序员。MySQL8引入了对JSON数据类型的全面支持,并提供了一组内置函数以有效处理JSON数据。MySQL8中的JSON支持的一......
  • EMR修改Core节点EBS卷大小
    本文用于修改已创建好的EMR集群Core节点EBS磁盘容量,由于业务场景、成本等多方面考虑,需要周期性的调整Core节点的磁盘容量,但是通过人工调整EBS卷大小非常耗时,本文通过Bootstr......
  • 杂言
    去年暑假里因为需要,紧急学习了\(\texttt{FFT}\),之后又学了\(\texttt{NTT}\)以及多项式全家桶的一部分。但几乎全是背板,囫囵吞枣地过了一遍,现在已经忘得差不多了。毕竟多......
  • 性能分析结果的顺序
    性能分析结果的顺序:服务器硬件瓶颈--网络瓶颈--服务器操作系统瓶颈(参数配置)---中间件瓶颈(参数配置)--应用软件瓶颈(SQL语句、业务逻辑、算法等);服务器硬件: 包括 CPU(配置、......
  • 原生 js 中 XMLHttpRequest
    完整文档使用XMLHttpRequest对象的open()方法来初始化一个请求,open()方法的语法格式如下:XMLHttpRequest.open(method,url,async,user,password);参数说明如下......
  • 风筝效果小练习
    实现效果如图:<!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title><style>*{margin:0;padding:0;}.mydiv{width:200px;......
  • 数据类型
    数据类型强类型语言要求变量的使用要求严格符合规定,所有变量都必须先定义后才能使用Java是强类型语言弱类型语言Java的数据类型分为两大类基本数据类......