概述
【Tensorflow】用类class搭建神经网络结构
代码实现
import tensorflow as tf
from tensorflow.keras.layers import Dense
from tensorflow.keras import Model
from sklearn import datasets
import numpy as np
x_train = datasets.load_iris().data
y_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)
# 只有这里与上一篇不同,定义了一个类IrisModel,其参数为继承了tensorflow的Model类的Model
# 两个函数__init__函数:super函数继承父类语法,是固定的,self.d1中的d1是这一层神经网络的名字
# 每一层都由self.引导这里定义的网络结构块被call函数调用
# call函数:调用__init__函数,实现对输入x的预测得到输出结果y
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 y
model = 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()
from_logits解释
- 1.tensorflow中经常看到logits,指的就是Logistic(注意逻辑回归Logistic Regression指的是分类问题,并非是指回归问题,而回归问题是预测一个连续的数值)。
而from_logits指的就是是否有经过Logistic函数,常见的Logistic函数包括Sigmoid、Softmax函数。在这里面,鸢尾花分类问题,且使用了softmax函数作为激活函数,已经对输出结果进行概率化,所以这里就不需要将from_logits设置为True,保持默认值即可。 - 2.逻辑回归Logistic Regression指的是分类问题,并非是指回归问题,而回归问题是预测一个连续的数值。
回归问题一般使用MSE作为损失函数,二分类的分类问题一般使用BCE(Binary Cross-Entropy)作为损失函数,
多分类的分类问题一般使用CCE(Categorical Cross-Entropy)作为损失函数,BCE和CCE两者的公式上有些不同,但本质都是一样,都可以使用CE作为统称。
分类问题中的模型预测输出一般都会首先经过Sigmoid或Softmax激活函数。 - 3.常见的激活函数包括Sigmoid、Tanh、ReLU、Softmax。
ReLU 一般可用在每个隐藏层或输出层的后面作为非线性输出。
Sigmoid和Tanh如果作为神经网络中的隐藏层的激活函数的话,都有可能造成梯度消失的问题,所以隐藏层的激活函数一般推荐使用ReLU,不推荐使用Sigmoid和Tanh。
Sigmoid一般只用在输出层中,而不能用在隐藏层中,因为网络层数太深时使用Sigmoid作为隐藏层的非线性输出的话容易导致梯度消失,使得网络难以更新,
而ReLU 则能有效避免梯度消失问题,Softmax也一般用在输出层中。
比如二分类的逻辑回归模型中的输出层末尾一般都加上Sigmoid,那么输出值将介于0到1之间,分别代表两个不同分类。
比如多分类的逻辑回归模型中的输出层末尾一般都加上Softmax,那么全部输出值的总和将等于1,代表了所有不同分类的概率值的总和等于1。
下面举例在反向传播中经过多个隐藏层的Sigmoid,首先因为Sigmoid的导函数最大值为f(0)=0.25,也就是说当反向传播中每经过一层隐藏层的Sigmoid时,
其梯度值都要乘上0.25,代表每经过一次其梯度值就要被衰减0.25倍,如果反向传播中需要经过五层隐藏层的Sigmoid的话,那么其梯度值一共至少会被衰减0.25的5次方的倍数。
那么将造成神经网络前面的几层的权重将很难被更新,同理Tanh也存在类似的状况,因此大多数的隐藏层的激活函数都使用ReLU,
另外ReLU的计算速度也比Sigmoid和Tanh还要快上许多。
解释出处 'あずにゃん’的博客
这篇文章使用类封装我们想要的神经网络每一层的结构。
最后
以上就是体贴手套为你收集整理的【Tensorflow】用类class搭建神经网络结构的全部内容,希望文章能够帮你解决【Tensorflow】用类class搭建神经网络结构所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复