TF2.0-神经网络模型搭建6步法,Sequential顺序神经网络结构,Class类搭建带连跳网络结构含实践

Posted MADE Club

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TF2.0-神经网络模型搭建6步法,Sequential顺序神经网络结构,Class类搭建带连跳网络结构含实践相关的知识,希望对你有一定的参考价值。


目录


〇.引言:

Ⅰ.神经网络模型六步搭建法[Sequential搭建]

    导包-数据-Sequential构建-compile配置-fit训练-summary

Ⅱ.六步法中重要函数的超参数设置及可选项

   tf.keras.models.Sequential-拉直层,全连接层,卷积层,LSTM层

   model.compile(optimizer=优化器,loss=损失率,metrics=[’准确率'])

   model.fit(...)

   model.summary()

Ⅲ.CLASS类搭建神经网络

Ⅳ.实践-Mnist&Fashion


引言:

    搭建神经网络有自己的既定步骤,采用下面的六步法即可,按步骤来搭建模型,更多的时候作为"炼丹师"(真正的炼丹师是基于很强的数学功底和原理掌握,并非所说简单的调参)。
我们要决定的是网络的搭建,选择好网络结构,思考如何搭建层,针对不同问题选择怎么样的损失函数,激活函数,优化器,评价指标等内容。
这些都需要很强的  问题分析能力,数据分析能力,数学功底,以及代码功力
【文中不附全部代码,脑图和代码(含注释)点击原文链接获取】


PARTⅠ:神经网络——六步搭建法


之前我们手动搭建了神经网络,手动实现了参数w和b的更新,大概用了 100行代 码左右( 手动实现对于理解神经网络的原理和过程及其重要 ,推荐记住甚至背下来手动实现的代码, 参考(原文链接中有代码)
下面的例子按照六步法对鸢尾花iris任务三分类,使用tf.keras来搭建我们的神经网络 使用Squentical顺序 神经网络模型堆叠【PARTⅢ中,采用了 class类 来构建,效果一致,两种方式各有好处】。 使用 20行左右 实现之前100行的功能。


和手动实现不同的是:
直接在使用的层中通过超参数来设置损失函数,激活函数,正则化参数,
然后在compile中选择优化器,选择损失函数,评测指标来更新参数w和b( 网络所学习到的知识就在这一个个w和b中,是这些权重学习了模型的知识)。
【阅读完这部分,你会看到很多的超参数,将在第二板块展示这些超参数的含义和可选内容!】
按照六步法分别如下:

步骤一:导包
import tensorflow as tffrom sklearn import datasetsimport numpy as np
步骤二:得到训练集和测试集【此处不划分测试集,后续从训练集划分】
x_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)
步骤三:Sequential建模
# 使用softmax 输出是概率分布model = tf.keras.Sequential([ tf.keras.layers.Dense(3,activation ='softmax', kernel_regularizer =tf.keras.regularizers.l2())])
步骤四:compile指定优化器,损失函数,评价指标
# 因为鸢尾花数据集给的标签是0,1,3# 我们上述使用softmax前向传播的输出是概率分布# 所以使用评价指数sparse_categorical_accuracymodel.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics=['sparse_categorical_accuracy'])
步骤五:fit训练
model.fit(x_train,y_train,batch_size=32, epochs=500,validation_split=0.2,validation_freq=20)

TF2.0-神经网络模型搭建6步法,Sequential顺序神经网络结构,Class类搭建带连跳网络结构【含实践】

步骤六:summary查看网络参数和网络结构
# 第六步:查看模型参数等model.summary()

TF2.0-神经网络模型搭建6步法,Sequential顺序神经网络结构,Class类搭建带连跳网络结构【含实践】上述就是通过keras.Sequentical实现的iris三分类

按照六步法,清晰明了!



PART Ⅱ :六步法中的重要函数

步骤三:

搭建网络网络结构的可选项

TF2.0-神经网络模型搭建6步法,Sequential顺序神经网络结构,Class类搭建带连跳网络结构【含实践】

步骤四:

compile配置网络选择优化器等

TF2.0-神经网络模型搭建6步法,Sequential顺序神经网络结构,Class类搭建带连跳网络结构【含实践】

步骤五:

执行训练fit

TF2.0-神经网络模型搭建6步法,Sequential顺序神经网络结构,Class类搭建带连跳网络结构【含实践】

步骤六:

查看网络结构和超参数

TF2.0-神经网络模型搭建6步法,Sequential顺序神经网络结构,Class类搭建带连跳网络结构【含实践】


上述关于激活函数,损失函数,优化器,正则化等的原理和选择建议参见:


PART Ⅲ :Class类搭建神经网络

在PARTⅠ中,使用的是Sequentical来搭建神经网络:

TF2.0-神经网络模型搭建6步法,Sequential顺序神经网络结构,Class类搭建带连跳网络结构【含实践】

这种搭建方式只能搭建 顺序网络结构,通俗来说,就是怎么搭建的,测试集就怎么走,比较死板。
此处介绍另一种搭建方式: 通过构建class类来搭建 ,这种方法可以搭建 带有连跳的非顺序网络结构

通式如下:

 # 继承tf的Model类 class Mymodel(Model):  # 类里要定义两个函数: # ①__init__初始化函数:定义所需网络结构块 # ② call()函数:写出前向传播 def __init__(self):  super(Mymodel,self).__init__() # 给出搭建神经网络时所需的各种网络结构块 def call(self,x): # 调用网络结构块,实现前向传播 return ymodel = Mymodel()

对于PARTⅠ中实现的鸢尾花Sequentical转换为class构建:

from tensorflow.keras import Modelfrom tensorflow.keras.layers import Dense
class IrisModel(Model): def __init__(self): super(IrisModel,self).__init__() self.d1 = Dense(3,activation='sigmoid', kernel_regularizer=tf.keras.regularizers.l2()) def call(self,x): y = self.d1(x) return ymodel2 = IrisModel()


TF2.0-神经网络模型搭建6步法,Sequential顺序神经网络结构,Class类搭建带连跳网络结构【含实践】

和前一种方式构建的网络结构以及参数量均一样。



接下来是两个实践:

MNIST数据集,Fashion数据集

均都有两种方式(Sequential和class)搭建。

【文中只放了Sequential代码,类class代码见原文链接。】

实践一:MNIST-手写数字数据集

MNIST数据集:

共有7万张图片,均为28*28像素点的灰度手写数字图片

训练:6万张0~9的手写数字图片和标签

测试:1万张0~9的手写数字图片和标签

TF2.0-神经网络模型搭建6步法,Sequential顺序神经网络结构,Class类搭建带连跳网络结构【含实践】

# 步骤一和步骤二import tensorflow as tf from tensorflow.keras import Sequentialfrom tensorflow.keras import layers
# 该数据集可以使用load_data()中读取训练集和测试集(x_train,y_train),(x_test,y_test) = tf.keras.datasets.mnist.load_data()# 0:纯白 , 255:纯黑,特征要进行归一化 ,把输入特征的数值变小更适合神经网络吸收x_train,x_test = x_train/255.0,x_test/255.0
#步骤三:建模model = Sequential([ # 送入神经网络要先把数据拉直一维数组 # 将28*28 784个像素点的灰度作为输入特征送入神经网络 layers.Flatten(), # 第一层网络:128个神经元 layers.Dense(128,activation = 'relu'), # 10个类,多分类,使用softmax layers.Dense(10,activation='softmax')])
# 步骤四:compilemodel.compile(optimizer='adam', loss=tf.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数据集:

共有7万张图片,均为28*28像素点的衣裤图片

训练:6万张衣裤图片和标签

测试:1万张衣裤图片和标签

import tensorflow as tf
fashion = 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.0
model = 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()

本文脑图【高清图见原文链接】:


总结:

        采用六步法搭建神经网络模型直接明了又简单,是基本要掌握的方法。

搭建 顺序网络 ,即一层层走的就 Sequential搭建 究极简单。
那如果要搭建图结构或者非顺序结构等复杂一点的(根据任务需要思考)的神经网络,要学会用类class搭建,里面包括一个init初始化函数(用来放层的),还包括了一个向前传播最后返回预测return y的。
搭建好模型之后, 最重要的是调参 ,调参不是"贪心算法"一样,不是试所有选项选择出最好,之所以选择必有原因,必有优劣。


谢谢阅读!

(提取码:bayn)

以上是关于TF2.0-神经网络模型搭建6步法,Sequential顺序神经网络结构,Class类搭建带连跳网络结构含实践的主要内容,如果未能解决你的问题,请参考以下文章

TF2.0:翻译模型:恢复保存的模型时出错:检查点(根)中未解析的对象.optimizer.iter:属性

tf2.0 Keras:使用 RNN 的自定义张量流代码时无法保存权重

使用 TF2.0 训练 RNN 的每次迭代逐渐增加内存使用量

手把手教你搭建一个神经网络(图像分类)

PyTorch从头搭建并训练一个神经网络模型(图像分类CNN)

PyTorch从头搭建并训练一个神经网络模型(图像分类CNN)