tensorflow2.0
一、梯度下降法:
梯度下降法是致力于找到函数极值点的算法,“学习“是指改进模型参数,以便通过大量训练来将损失最小化
可以把梯度下降法应用到寻找损失函数的极值点,这样就构成了依据输入数据的模型学习,寻找的过程是通过不断改变参数和权值来寻找极值点。
可以通过这个图来理解,给定一个初始点,然后判断其左右Z的值的变换,如果下降则将点移到相应位置然后继续进行上一步,直到找到极值点不过需要注意的是,如图所示,每次的间隔不宜太大,否则会导致在极值点附近来回跳跃的情况发生。
二、几种激活函数:
1、relu
该函数在输入数据小于0时,自动屏蔽,在输入大于0时,原样输出
2、sigmoid
该激活函数当X趋向于正无穷大时,对应的值趋于1且逐渐稳定,当X趋向于负无穷大时,对应的值趋于0且逐渐趋于稳定当X靠近于Y轴时,对应值的变化较为明显,总体而言其值在0~1内变换,但在 X趋于正负无穷大时,其传播的梯度比较小, 故很少用在多层感知层的中间层
3、Leak relu
与relu相似但不同的是:Leak relu激活函数,会把小于0的数据传递出来一些,但是传递出来的值非常小,该函数常用于深层网络中。
四、神经网络的基本构架
可以考虑为一个又一个的神经元连接在一起,神经元与神经元之间通过激活函数来传递数据,每个单一神经元有n个特征输入对应n个w权重,接着求特征的加权和,然后通过激活函数(或传递函数)来完成最后的输出。
而神经网络有怎么可能仅局限于浅层的,神经元要求数据必须线性可分,故我们可以在神经网络的输入和输出端加入更多的神经元。这就叫多层感知器。
困扰我许久的是到底如何去实现这一过程,其实超级简单,只需要进行一个tf.keras.(选择模型形式,在这是选择了序贯模型)调用,之后
模型需要知道它所期待的输入的尺寸(shape)。出于这个原因,序贯模型中的第一层(只有第一层,因为下面的层可以自动的推断尺寸)需要接收关于其输入尺寸的信息,后面的各个层则可以自动的推导出中间数据的shape,因此不需要为每个层都指定这个参数。有以下几种方法来做到这一点:
该第一层是隐含层的定义,包括隐含层的个数,输入的参数的个数和最重要的激活函数,第二行是输出层,由这个代码很容易的得出总共有51个参数,其中隐含层有40个参数(共十层,每层都有三个特征参数和一个输出参数),输出层有十个输入特征参数和一个输出参数。
编译
在训练模型之前,我们需要配置学习过程,这是通过compile方法完成的,他接收三个参数:
优化器 optimizer:它可以是现有优化器的字符串标识符,如 rmsprop 或 adagrad,也可以是 Optimizer 类的实例。详见:optimizers。
损失函数 loss:模型试图最小化的目标函数。它可以是现有损失函数的字符串标识符,如 categorical_crossentropy 或 mse,也可以是一个目标函数。
评估标准 metrics:对于任何分类问题,你都希望将其设置为 metrics = [‘accuracy’]。评估标准可以是现有的标准的字符串标识符,也可以是自定义的评估标准函数。
# 多分类问题
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 二分类问题
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 均方误差回归问题
model.compile(optimizer='rmsprop',
loss='mse')
# 自定义评估标准函数
import keras.backend as K
def mean_pred(y_true, y_pred):
return K.mean(y_pred)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy', mean_pred])
训练
Keras 模型在输入数据和标签的 Numpy 矩阵上进行训练。为了训练一个模型,你通常会使用 fit 函数。
# 对于具有2个类的单输入模型(二进制分类):
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 生成虚拟数据
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))
# 训练模型,以 32 个样本为一个 batch 进行迭代
model.fit(data, labels, epochs=10, batch_size=32)
# 对于具有10个类的单输入模型(多分类分类):
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 生成虚拟数据
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(10, size=(1000, 1))
# 将标签转换为分类的 one-hot 编码
one_hot_labels = keras.utils.to_categorical(labels, num_classes=10)
# 训练模型,以 32 个样本为一个 batch 进行迭代
model.fit(data, one_hot_labels, epochs=10, batch_size=32)