行为主义:构建感知-动作控制系统,如机器人
符号主义:实现理性思维,如专家系统
连接主义:仿脑神经连接,实现感性思维,如神经网络
当今人工智能主流方向–连接主义
Tensor: 张量,多维数组
阶: Tensor的维度
标量scalar -> 向量vector -> 矩阵matrix -> 张量tensor
数据类型:tf.int, tf.float …、tf.bool、tf.string
Tensor 创建:
鸢尾花数据集来自于sklearn包的datasets
步骤:
pip install tensorflow
神经网络复杂度、指数衰减学习率、激活函数、损失函数、欠拟合与过拟合、正则化减少过拟合、优化器更新网络参数
nn复杂度:多采用nn层数和nn参数的个数表示
空间复杂度:
时间复杂度:
学习率:参数每次更新的幅度
w t + 1 = w t − l r ∗ ∂ l o s s ∂ w t w_{t+1} = w_t - lr * \frac{\partial loss}{\partial w_t} wt+1=wt−lr∗∂wt∂loss
学习率设置策略:可以先用较大的学习率,快速得到较优解,然后逐步减小学习率,使模型在训练后期稳定,动态改变学习率
指数衰减学习率=初始学习率*学习率衰减率^(当前轮数/多少轮衰减一次)
lr = LR_BASE * LR_DECAY ** (epoch / LR_STEP)
线性模型表达力不够,所以要用非线性模型。
优秀的激活函数:非线性、可微性、单调性、近似恒等性
激活函数输出值的范围:
常用激活函数:
sigmoid 函数
f ( x ) = 1 1 + e − x t f . n n . s i g m o i d ( x ) f(x)=\frac{1}{1+e^{-x}} \qquad tf.nn.sigmoid(x) f(x)=1+e−x1tf.nn.sigmoid(x)
Tanh 函数
f ( x ) = 1 − e − 2 x 1 + e − 2 x t f . n n . t a n h ( x ) f(x)=\frac{1-e^{-2x}}{1+e^{-2x}} \qquad tf.nn.tanh(x) f(x)=1+e−2x1−e−2xtf.nn.tanh(x)
Relu 函数
f ( x ) = m a x ( x , 0 ) t f . n n . r e l u ( x ) f(x)=max(x, 0) \qquad tf.nn.relu(x) f(x)=max(x,0)tf.nn.relu(x)
Leaky Relu 函数
f ( x ) = m a x ( a x , x ) t f . n n . l e a k y _ r e l u ( x ) f(x)=max(ax,x) \qquad tf.nn.leaky\_relu(x) f(x)=max(ax,x)tf.nn.leaky_relu(x)
对初学者的建议:首选relu激活函数,学习率设置较小值,输入特征标准化(0为均值,1为标准差),初始参数中心化
损失函数(loss):预测值(y)与已知答案(y_)的差距
nn优化目标:loss最小;mse(Mean Squared Error),自定义,ce(Cross Entropy)
均方误差mse:
MSE ( y _ , y ) = ∑ i = 1 n ( y − y _ ) 2 n l o s s _ m s e = t f . r e d u c e _ m e a n ( t f . s q u a r e ( y _ − y ) ) \text{MSE}(y\_, y) = \frac{\sum_{i=1}^{n} (y-y\_)^2}{n} \\ loss\_mse = tf.reduce\_mean(tf.square(y\_ - y)) MSE(y_,y)=n∑i=1n(y−y_)2loss_mse=tf.reduce_mean(tf.square(y_−y))
交叉熵损失函数CE(Cross Entropy):表征两个概率分布之间的距离
H ( y _ , y ) = − ∑ y _ ∗ ln y t f . l o s s e s . c a t e g o r i c a l _ c r o s s e n t r o p y ( y _ , y ) H(y\_, y) = -\sum y\_ * \ln y \\ tf.losses.categorical\_crossentropy(y\_, y) H(y_,y)=−∑y_∗lnytf.losses.categorical_crossentropy(y_,y)
softmax 与交叉熵结合:输出先过softmax函数,再计算y与y_的交叉熵损失函数
tf.nn.softmax_cross_entropy_with_logits(y_, y)
或者
y_pro = tf.nn.softmax(y)
loss_ce = tf.losses.categorical_crossentropy(y_, y_pro)
欠拟合:对数据集学习的不够彻底
正拟合:对测试数据、新数据拟合的都很好
过拟合:对当前数据拟合很好,但对新数据却无法拟合,模型缺乏泛化力
正则化缓解过拟合:正则化在损失函数中引入模型复杂度指标,利用给W加权值,弱化了训练数据的噪声(一般不正则化b)
l o s s = l o s s _ m s e + R E G U L A R I Z E R ∗ l o s s ( w ) R E G U L A R I Z E R = 0.03 l o s s l 1 ( w ) = ∑ i ∣ w i ∣ l o s s l 2 ( w ) = ∑ i ∣ w i 2 ∣ t f . n n . l 2 _ l o s s ( w ) = s u m ( w ∗ ∗ 2 ) / 2 loss = loss\_mse + REGULARIZER * loss(w) \\ REGULARIZER = 0.03 \\ loss_{l1} (w) = \sum_i |w_i| \\ loss_{l2} (w) = \sum_i |w_i^2| \\ tf.nn.l2\_loss(w) = sum(w ** 2) / 2 loss=loss_mse+REGULARIZER∗loss(w)REGULARIZER=0.03lossl1(w)=i∑∣wi∣lossl2(w)=i∑∣wi2∣tf.nn.l2_loss(w)=sum(w∗∗2)/2
优化器是引导神经网络更新参数的工具
假设:待优化参数w,损失函数loss,学习率lr,每次迭代一个batch,t表示当前batch迭代的总次数
注:一阶动量是与梯度相关的函数,二阶动量是与梯度平方相关的函数,不同的优化器,实质上只是定义了不同的一阶动量和二阶动量公式
五种优化器:
搭建网络八股、iris代码复现、mnist数据集、训练mnist数据集、Fashion数据集
import: 导入相关模块
train, test: 告知要喂入网络的训练集和测试集
model = tf.keras.models.Sequential: 搭建网络结构,逐层描述网络,相当于前向传播
model.compile: 配置训练方法–优化器、损失函数、评测指标
model.fit: 执行训练过程
model.summary: 打印网络结构和参数统计
model = tf.keras.models.Sequential([ 网络结构 ])
网络结构:
拉直层:tf.keras.layers.Flatten()
全连接层:tf.keras.layers.Dense(神经元个数, activation=“激活函数”, kernel_regularizer=哪种正则化),activation(字符串给出)可选–relu, softmax, sigmoid, tanh,kernel_regularizer 可选–tf.keras.regularizers.l1(), tf.keras.regularizers.l2()
卷积层:tf.keras.layers.Conv2D(filters=卷积核个数,kernel_size=卷积核尺寸,strides=卷积步长,padding=“valid"or"same”)
LSTM层:tf.keras.layers.LSTM()
model.compile(optimizer=优化器, loss=损失函数, metrics=[‘准确率’])
optimizer可选:sgd–tf.keras.optimizers.SGD, adagrad, adadelta, adam
loss可选:mse–tf.keras.losses.MeanSquaredError(), sparse_categorical_crossentropy
metrics可选:accuracy, categorical_accuracy, sparse_categorical_accuracy
model.fit(训练集的输入特征,训练集的标签,batch_size=, epochs=, validation_data=(测试集的输入特征,测试集的标签),validation_split=从训练集划分多少比例给测试集,validation_freq=多少次epoch测试一次)
class IrisModel(Model):
def __init__(self):
super(IrisModel, self).__init__()
# 定义网络结构块
self.d1 = Dense(3)
del call(self, x):
# 调用网络结构块,实现前向传播
y = self.d1(x)
return y
model = IrisModel()
mnist数据集包含了7万张手写数字图片
fashion数据集包含了7万张衣裤等图片和标签