北大慕课Tensorflow实践过程笔记3——神经网络八股

搭建网络八股sequential

用tf.keras 搭建网络八股

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

Sequential()用法

在这里插入图片描述
Sequential()可以认为是一个容器,这个容器里封装了一个神经网络结构,在sequential()中,要描述从输入层到输出层每一层的网络结构,每一层的网络结构可以是拉直层tf.keras.layers.Flatten(), 这一层不含计算,只是形状转换,把输入特征拉直变成一维数组;可以是全连接层tf.keras.layers.Dense(),告知这一层的神经元个数,使用了什么激活函数,使用了什么正则化方法,激活函数可以选择relu,softmax,sigmoid,tanh等,以字符串的形式给出;正则化可以选择L1正则化,L2正则化等;除此之外,还有卷积神经网络层,循环神经网络层,分别在第五讲和第六介绍。

compile()用法

在这里插入图片描述
告知训练时选择优化器,损失函数,和评测指标。优化器可以是以字符串形式给出的优化器名字,比如sgd,adagrad,adadelta,adam,还可以是函数形式,比如tf.keras.optimizers.SGD().使用函数的形式可以设置学习率,动量等超参数,建议入门时先试用左边这些字符串形式的优化器名字,等掌握了整个框架后,可以通过tensorflow官网查询这些函数的具体用法,调节超参数。
loss可以是字符串给出的损失函数名字,比如mse,sparse_categorical_crossentropy,也可以是函数形式,比如tf.kears.losses.MeanSquaredError() ,又比如tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False).在设置损失函数时,我们常使用这个函数,有些神经网络的输出是经过了softmax等函数的概率分布,有些则不经概率分布直接输出,可以认为,这个参数是在询问是否是原始输出,也就是没有经概率分布的输出。如果神经网络预测结果输出前经过了概率分布,这里是False;如果神经网络预测结果输出前没有经过概率分布直接输出了,这里是True。如果最后出来的概率和蒙的差不多,很可能就是这个参数设置错了。
Metrics告知网络评测指标,accuracy表示y_和y都是以数值形式给出的 ,如第一类鸢尾花用数值1表示y_[1] ,y[1].使用字符串categorical_accuracy表示y_与y都是以独热码或概率分布形式给出,比如鸢尾花标签是第一类鸢尾花,用y_=[0,1,0]独热码形式给出,网络输出结果是第一类鸢尾花用概率分布y=[0.256,0.695,0.048]表示。
sparse_categorical_accuracy表示y_是以数值形式给出,y是以独热码形式给出,比如鸢尾花分类第一类鸢尾花表示为y_=[1],网络输出结果是概率分布y
=[0.256,0.695,0.048].后续例子都是以数值形式给出标签,以概率分布形式表示输出,所以应该选用sparse_categorical_accuracy作为评测指标

fit()用法,

在这里插入图片描述
fit()执行训练过程,告知训练集的输入特征;训练集的标签;每次喂入神经网络的样本数,即batch_size()的数值;要迭代多少次数据集,也就是epochs的总次数;validation_data和validation_split二者选择其一;validation_data要告知测试集的输入特征和测试集的标签,写在一个圆括号里;validation_split要告知从训练集中划分多少比例的数据作为测试集;validation_freq表示没多少次epoch迭代使用测试集验证一次结果

summary()用法

在这里插入图片描述
summary()可以打印出网络的结构和参数统计,比如鸢尾花分类的神经网络是四输入三输出的一层网络 ,这一层是Dense()全连接,共有15个参数,可训练的参数共15个,不可训练的参数时0个,以下是鸢尾花分类用6步法如何实现:
在这里插入图片描述
【6行】以后没有写x_test和y_test 是因为选择使用fit()方法直接在训练集里划分 。
【8-12行】代码实现了数据集的乱序,在sequential中搭建网络结构:【15行】Dense里的 3 是神经元个数,activation后是选用的激活函数, kernel_regularizer后是选用的正则化方法。
【18行】compile中配置训练方法,选择SGD优化器,学习率设置为0.1,选择sparse_categorical_crossentropy作为损失函数,由于神经网络末端使用了softmax函数,使得输出是概率分布而不是原始输出,所以from_logits是False.由于鸢尾花数据集给的标签是
0 1 2,是数值,神经网络前向传播的输出是概率分布,所以这里选择sparse_categorical_accuracy作为评测指标。
【 22行】在fit中执行训练过程,x_train是训练集的输入特征,y_train是训练集标签,batch_size写训练时一次喂入神经网络多少组数据batch_size,epochs写数据集迭代循环多少次,validation_split告知从训练集中选择20%的数据作为测试集,validation_freq表示每迭代20次训练集要在测试集中验证一次准确率,
【24行】用summary打印出网络结构和参数统计。

搭建网络八股class

在这里插入图片描述
用sequential()可以搭建出上层输出就是下层输入的顺序网络结构,但是无法写出一些带有跳连的非顺序网络结构,这个时候我们可以选择用类class搭建神经网络结构
在这里插入图片描述
可以使用class类封装一个神经网络结构
Mydel 是这个神经网络的名字,(Model)表示继承了tensorflow的Model类。
类里要定义两个函数,一个是_init_函数,一个是call函数。
_init_函数中,MyModel是类名,和上面那个class的名字要一样,其余的super ,self ,init,每个网络都是一样的代码风格,在这一行下面给出搭建神经网络时所需的各种网络结构块,比如右侧的鸢尾花分类的单层网络是含有三个神经元的全连接,按照这种风格写出来,self.d1=Dense(3),d1是给这一层起的名字,每一层都用self.引导。
在call函数中调用了_init_函数里已经定义好的网络结构块实现一次前向传播过程。对于鸢尾花的例子,前向传播只经过一层网络,这层网络结构块已经在_init_函数中定义好了,直接self.d1调用,输入X输出y,return y 。
实例化出名为model的对象。可以认为_init_函数准备出搭建网络所需的各种积木,call函数调用_init_中搭建好的积木,实现前向传播,从输入x到输出y。
用类实现鸢尾花分类的代码如下:
在这里插入图片描述

MNIST数据集

在这里插入图片描述
把784个像素点的灰度值作为输入特征送入神经网络
在这里插入图片描述
用print函数把训练集中第一个样本的输入特征打印出来,是一个28*28的二维数组,是手写数字5的28行28列个像素值,0表示纯黑色,255表示纯白色。
用pirnt把训练集中第一个样本的标签打印出来,是数值5。
还可以用print函数打印出测试集的形状,一共10000个28行28列的三维数据。
代码如下:
在这里插入图片描述
【5行】对输入网络的输入特征进行归一化,使原本0到255之间的灰度值变为0到1之间的数值,把输入特征的数值变小更适合神经网络吸收。
【7行】用Sequential搭建网络
【8行】先把输入特征拉直为一维数组,也就是拉直为748个数值。
【9行】定义第一层网络有128个神经元,用relu激活函数
【10行】定义第二层网络有10个神经元,用softmax激活函数,使输出符合概率分布。
【13行】用compile配置训练方法,优化器选择adam
【14行】损失函数选择sparse_categorical_crossentropy,由于13行让输出符合概率分布了,不是直接输出的,所以from_logits是False。注意,如果输出不满足概率分布这里要写true
【15行】数据集中的标签是数值,神经网络输出y是概率分布,所以这里选择sparse_categorical_accuracy
【17行】在fit()中执行训练过程x_train是训练集输入特征,y_train
是训练集标签每次喂入网络32组数据,数据集迭代epochs=5次,validation_data里面写测试集输入特征,测试集标签,validation_freq里写每迭代一次训练集执行一次测试集的评测
【18行】打印出网络结构和参数设计
在这里插入图片描述
和sequential只是实例化,model的方法不同。
【10行】_init_函数中定义了call函数中所用到的层
【16行】call函数中从输入x到输出y,走过一次前向传播返回输出y
【22行】实例化model

FASHION数据集

在这里插入图片描述
每张图片都是28行28列像素点的灰度值数据,其中6万张用于训练,1万张用于测试,一共有10个分类,分别对应标签0 1 2…9
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值