【TensorFlow学习笔记:神经网络八股】(实现MNIST数据集手写数字识别分类以及FASHION数据集衣裤识别分类)

网友投稿 673 2022-11-23

【TensorFlow学习笔记:神经网络八股】(实现MNIST数据集手写数字识别分类以及FASHION数据集衣裤识别分类)

【TensorFlow学习笔记:神经网络八股】(实现MNIST数据集手写数字识别分类以及FASHION数据集衣裤识别分类)

文章目录

​​前言​​​​一、搭建网络八股sequential​​

​​1.函数介绍​​​​2.6步法实现鸢尾花分类​​

​​二、搭建网络八股class​​

​​1.创建自己的神经网络模板:​​​​2.调用自己创建的model对象​​

​​三、MNIST数据集​​

​​1.用sequential搭建网络实现手写数字识别​​​​2.用类搭建网络实现手写数字识别​​

​​四、FASHION数据集​​

​​用sequential搭建网络实现衣裤识别​​

​​总结​​

前言

本讲目标:使用八股搭建神经网络 神经网络搭建八股 iris代码复现 MNIST数据集 训练MNIST数据集 Fashion数据集

一、搭建网络八股sequential

使用六步法,使用TensorFlow的API: tf.keras搭建网络八股 1、import 导入相关模块 2、train、test 告知要喂入网络的训练集、测试集是什么,也就是要指定训练集、测试集的输入特征和训练集的标签 3、model = tf.keras.models.Sequential 在sequential()中搭建网络结构,逐层描述每层网络,相当于走了一遍前向传播 4、model.compile 在compile中配置训练方法,告知训练时选择哪种优化器,选择哪个损失函数,选择哪种评测指标 5、model.fit 在fit中执行训练过程,告知训练集和测试集的输入特征和标签,告知每个batch是多少,告知要迭代多少次数据集 6、model.summary 用summary打印出网络的结构和参数统计

1.函数介绍

2.6步法实现鸢尾花分类

代码如下:

import tensorflow as tffrom sklearn import datasetsimport numpy as np#由于这里是选择从训练集划分出测试集,所以不需要单独导入testx_train = datasets.load_iris().datay_train = datasets.load_iris().target#打乱顺序np.random.seed(116)np.random.shuffle(x_train)np.random.seed(116)np.random.shuffle(y_train)tf.random.set_seed(116)#3个神经元,softmax激活,L2正则化model = tf.keras.models.Sequential([ tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())])#SGD优化器、学习率0.1,使用SparseCategoricalCrossentropy作为损失函数,由于神经网络末端使用softmax函数,输出为概率分布,所以from_logits为false#鸢尾花数据集给的标签为0,1,2,神经网络前向传播的输出是概率分布,使用sparse_categorical_accuracy作为准确率model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['sparse_categorical_accuracy'])#输入训练数据,一次喂入32组数据,迭代500次,从训练集中划分出20%作为测试集,每迭代20次训练集就要在测试集中验证一次准确率model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)#打印网络结构和参数统计model.summary()

二、搭建网络八股class

用sequential可以搭建出上层输出就是下层输入的顺序网络结构,但是无法写出一些带有跳连的非顺序网络结构。这时我们可以选择用类class搭建神经网络结构使用六步法,使用TensorFlow的API: tf.keras搭建网络八股 1、import 2、train、test 3、class MyMode(Model) model=MyModel 4、model.compile 5、model.fit 6、model.summary

1.创建自己的神经网络模板:

伪代码如下:

class MyModel(Model): def _init_(self): super(MyModel,self).init_() 定义网络结构块 def call(self,x): 调用网络结构块,实现前向传播 return ymodel=MyModel()

代码如下:

class IrisModel(Model): def __init__(self): super(IrisModel, self).__init__() #鸢尾花分类的单层网络是含有3个神经元的全连接 self.d1 = Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2()) def call(self, x): y = self.d1(x) return y#实例化名为model的对象model = IrisModel()

2.调用自己创建的model对象

代码如下:

import tensorflow as tffrom tensorflow.keras.layers import Densefrom tensorflow.keras import Modelfrom sklearn import datasetsimport numpy as npx_train = datasets.load_iris().datay_train = datasets.load_iris().targetnp.random.seed(116)np.random.shuffle(x_train)np.random.seed(116)np.random.shuffle(y_train)tf.random.set_seed(116)class IrisModel(Model): def __init__(self): super(IrisModel, self).__init__() self.d1 = Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2()) def call(self, x): y = self.d1(x) return ymodel = IrisModel()model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['sparse_categorical_accuracy'])model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)model.summary()

三、MNIST数据集

MNIST数据集

提供6万张28x28像素点的0~9手写数字图片和标签,用于训练。 提供1万张28x28像素点的0~9手写数字图片和标签,用于测试。

导入数据集

mnist =tf.keras.datasets.mnist (x_train,y_train),(x_test,y_test)=mnist.load_data()

作为输入特征,输入神经网络时,将数据拉伸为一维数组

tf.keras.layers.Flatter()

1.用sequential搭建网络实现手写数字识别

code:

import tensorflow as tfmnist = tf.keras.datasets.mnist(x_train, y_train), (x_test, y_test) = mnist.load_data()#对输入网络的特征进行归一化,使原本0~255的灰度值转化为0~1的小数。#把输入特征的值变小更有利于神经网络吸收x_train, x_test = x_train / 255.0, x_test / 255.0#用Sequential搭建网络model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(), #把输入特征拉直为1维数组,即784(28*28)个数值 tf.keras.layers.Dense(128, activation='relu'), #定义第一层网络有128个神经元,relu为激活函数 tf.keras.layers.Dense(10, activation='softmax') #定义第二层网络有10个神经元,softmax使输出符合概率分布])#用compile配置训练方法model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['sparse_categorical_accuracy'])#每一轮训练集迭代,执行一次测试集评测,随着迭代轮数增加,手写数字识别准确率不断提升(使用测试集)model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)model.summary()

print result:

Train on 60000 samples, validate on 10000 samples Epoch 1/5 60000/60000 [] - 4s 62us/sample - loss: 0.2589 - sparse_categorical_accuracy: 0.9262 - val_loss: 0.1373 - val_sparse_categorical_accuracy: 0.9607 Epoch 2/5 60000/60000 [] - 2s 40us/sample - loss: 0.1114 - sparse_categorical_accuracy: 0.9676 - val_loss: 0.1027 - val_sparse_categorical_accuracy: 0.9699 Epoch 3/5 60000/60000 [] - 3s 43us/sample - loss: 0.0762 - sparse_categorical_accuracy: 0.9775 - val_loss: 0.0898 - val_sparse_categorical_accuracy: 0.9722 Epoch 4/5 60000/60000 [] - 2s 41us/sample - loss: 0.0573 - sparse_categorical_accuracy: 0.9822 - val_loss: 0.0851 - val_sparse_categorical_accuracy: 0.9752 Epoch 5/5 60000/60000 [] - 2s 41us/sample - loss: 0.0450 - sparse_categorical_accuracy: 0.9858 - val_loss: 0.0846 - val_sparse_categorical_accuracy: 0.9738 Model: “sequential” Layer (type) Output Shape Param # ================================================================= flatten (Flatten) multiple 0 dense (Dense) multiple 100480 Total params: 101,770 Trainable params: 101,770 Non-trainable params: 0

可以观察到,随着迭代轮数增加,准确率也不断提升。训练的参数也是极其多的,达到10万多个。

2.用类搭建网络实现手写数字识别

只是实例化model的方法不同,其他与用sequential搭建网络实现手写数字识别一致。 init函数中定义了call函数中所用到的层,call函数中从输入x到输出y走过一次前向传播,返回输出y

import tensorflow as tffrom tensorflow.keras.layers import Dense, Flattenfrom tensorflow.keras import Modelmnist = tf.keras.datasets.mnist(x_train, y_train), (x_test, y_test) = mnist.load_data()x_train, x_test = x_train / 255.0, x_test / 255.0class MnistModel(Model): def __init__(self): super(MnistModel, self).__init__() self.flatten = Flatten() self.d1 = Dense(128, activation='relu') self.d2 = Dense(10, activation='softmax') def call(self, x): x = self.flatten(x) x = self.d1(x) y = self.d2(x) return ymodel = MnistModel()model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['sparse_categorical_accuracy'])model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)model.summary()

四、FASHION数据集

FASHION数据集

导入数据集

fashion = tf.keras.datasets.fashion_mnist (x_train, y_train),(x_test, y_test) = fashion.load_data()

用sequential搭建网络实现衣裤识别

加载数据需要较长时间,需耐心等待

import tensorflow as tffashion = tf.keras.datasets.fashion_mnist(x_train, y_train),(x_test, y_test) = fashion.load_data()x_train, x_test = x_train / 255.0, x_test / 255.0model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(10, activation='softmax')])model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['sparse_categorical_accuracy'])model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)model.summary()

用类的方法也可以实现,这里不做重复展开,套用八股模板即可。

总结

这个单元将整个训练的构架走了一遍,并且以八股的形式做了总结,收获很大。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Shell 日志与打印输出
下一篇:CNN基本步骤以及经典卷积(LeNet、AlexNet、VGGNet、InceptionNet 和 ResNet)网络讲解以及tensorflow代码实现
相关文章

 发表评论

暂时没有评论,来抢沙发吧~