【Tensorflow】用类class搭建神经网络结构

【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还要快上许多。

解释出处 'あずにゃん’的博客

这篇文章使用类封装我们想要的神经网络每一层的结构。

猜你喜欢

转载自blog.csdn.net/qq_45746168/article/details/128038462