|
|
| ### 1.张量(Tensor) |
|
| 张量(Tensor):多维数组(列表) 阶:张量的维数 |
|
|
|
|
|
|
|
|
| 张量可以表示0阶到N阶数组(列表) |
|
| #### - 数据类型 |
|
| 1.√tf.int,tf.float…… |
| tf.int32,tf.float32,tf.float64 |
|
| 2.√tf.bool |
| tf.constant([True,False]) |
|
| 3.√tf.string |
| tf.constant(“hello,world!”) |
|
| #### - 创建张量 |
|
| 1. tf.constant(维度,dtype=数据类型) 创建张量 |
|
| 1. tf.zeros(维度)------创建全为0的张量 |
|
| 1. tf.ones(维度)-------创建全为的张量 |
|
| 1. tf.fill(维度,指定值)---创建指定值的张量 |
|
| >5.tf.random.normal(维度,mean=均值,stddev=标准差)--生成正态分布的随机数,默认均值为0,标准差为1 |
| > |
>![image-20210303212318719]() |
|
| >6.tf.random.truncted_normal(维度,mean=均值,stddev=标准差) |
| > |
>![image-20210303212807260]() |
| > |
| >注意:在tf.truncated_normal中如果随机生成数据的取值在(u-2q,u+2q)之外则重新进行生成,保证了生成值在均值附近。 u=均值,q=标准差 |
| > |
>![image-20210303213544312]() |
| > |
| > |
|
| >7.tf.random.uniform(维度,minval=最小值,maxval=最大值) |
| > |
>![image-20210303213001619]() |
|
| >8.tf.convert_to_tensor(数据名,dtype=数据类型)--将numpy数据类型的数据转换为Tensor数据类型的数据 |
| > |
>![image-20210303213442231]() |
|
|
| ### 2.复杂度学习率 |
|
| #### - 神经网络(NN)复杂度 |
|
| NN复杂度:多用NN层数和NN参数的个数表示 |
|
> ![image-20210303213914650]() |
|
| 空间复杂度: |
| √ 层数=隐藏层的层数+1个输出层左图为2层NN |
| √ 总参数=总w+总b |
| 左图34+4(第一层) +42+2( 第二层)=26 |
|
| 时间复杂度: |
| √ 乘加运算次数 左图34(第一层)+42(第二层)=20 |
|
| #### - 学习率 |
|
>![image-20210303214316084]() |
|
>![image-20210303214351325]() |
|
| #### - 激活函数 |
|
> ![image-20210303214622559]() |
|
| √ 优秀的激活函数: |
|
|
|
|
|
| √激活函数输出值的范围: |
|
|
|
| > √ Sigmoid函数 |
| > |
> ![image-20210303214858438]() |
|
| > √ Tanh函数 |
| > |
> ![image-20210303215431827]() |
|
| > √ Relu函数 |
| > |
> ![image-20210303215543306]() |
|
| >√ Leaky Relu函数 |
| > |
>![image-20210303215630008]() |
|
| 总结: |
| √首选relu激活函数; |
| √学习率设置较小值; |
| √输入特征标准化,即让输入特征满足以0为均值,1为标准差的正太分布; |
| √初始参数中心化,即让随机生成的参数满足以0为均值,“根号下当前层输入特征个数分之2”为标准差的正太分布 |
|
| #### - 损失函数 |
|
| 损失函数:预测值与标准函数之间的差距,损失函数可以定量判断W,b的优劣,当损失函数输出最小时,参数W,b会出现最优值 |
|
| 梯度:函数对各参数求偏大后的向量。 函数梯度下降的方向就是函数减小的方向。 |
|
| 梯度下降法:沿损失函数梯度下降的方向,寻找损失函数的最小值,得到最优参数的方法。 |
|
> ![]() |
|
| - √ 交叉熵损失函数CE(Cross Emtropy):表征两个概率分布之间的距离tf.losses.categorical_crossentropy(标准答案,输出结果) |
|
| - softmax与交叉熵结合 |
|
| √ 输出先过softmax函数,再计算y与与y_的交叉熵损失函数。或者直接用tf.nn.softmax_cross_entropy_with_logits(标准结果,输出值) |
|
| #### - 欠拟合与过拟合 |
|
| 欠拟合:欠拟合是模型不能有效拟合数据集,是对现有数据集的学习不够彻底 |
| 过拟合:模型对当前数据模拟的太好了,但对未见过的新数据难以做出判断 |
|
| >  |
|
| √ 欠拟合的解决方法: |
|
| - 增加输入项特征 |
| - 增加网络参数 |
| - 减少正则化参数 |
|
| √ 过拟合的解决方法: |
|
| - 数据清洗 |
| - 增大训练集 |
| - 采用正则化 |
| - 增大正则化参数 |
|
| √ 正则化缓解过拟合 |
|
> ![]() |
|
| √ 正则化的选择 |
|
| - L1正则化大概率会使很多参数变为零,因此该方法可通过稀疏参数,即减少参数的数量,降低复杂度。 |
| - L2正则化会使参数很接近零但不为零,因此该方法可通过减小参数值的大小降低复杂度 |
|
| #### - 神经网络参数优化器 |
|
> ![]() |
|
| --- |
|
| #### - 搭建网络八股sequential |
|
| ##### - 六步法: |
|
| 1. import |
| 1. train ,test 导入要喂入网络的训练集和测试集 |
| 1. model=tf.keras.models.Sequetial 搭建网络结构 , 逐层描述每层网络(相当于走一边前向传播) |
| 1. model.compile 配置训练方法选择优化器,损失函数,评测指标 |
| 1. model.fit 执行训练过程,告知训练集和测试集的输入特征和标签,告知batch的个数是多少,迭代数据集的次数 |
| 1. model.summary 用summary( )打印出网络的结构和参数统计 |
|
| ##### - Sequential搭建顺序网络结构 |
|
> ![]() |
| > |
| > 总结:用Sequential可以搭建上层输出就是下层输入的顺序网络结构,但无法写出带跳连的非顺序网络结构 |
|
| ##### - class类封装非顺序网络结构 |
|
> ![]() |
| > |
| > ```python |
| > 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) |
| > |
| > 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() |
| > ``` |
|
| ##### - 神经网络八股功能扩展 |
|
| 1. 自制数据集,解决本领域应用 |
| 1. 数据增强,扩充数据集 |
| 1. 断点续训,存取模型 |
| 1. 参数提取,把参数存入文本 |
| 1. acc/loss 可视化,查看训练效果 |
| 1. 应用程序,给图识物 |
|
| ##### - 自制数据集 |
|
![]() |
|
| ##### - 数据增强 |
|
> ![]() |
| > |
> ![]() |
|
| ##### - 断点续训 |
|
| > 读取模型 |
| > |
| > ```python |
| > load_weights(文件路径名) |
| > ------------------------------------------------------ |
| > eg: |
| > checkpoint_sava_path="./checkpoint/mnist.ckpt" |
| > if os.path.exits(check_sava_path+'.index'): |
| > print("{:-^30}".format("load the model")) |
| > ``` |
| > |
| > 保存模型 |
| > |
| > ``` python |
| > tf.kears.callbacks.ModelCheckpoint( |
| > filepath=路径文件名 |
| > sava_weights_only=True/False, #是否只保留模型参数 |
| > sava_best_only=True/False #是否只保留最优模型 |
| > ) |
| > history=model.fit(callbacks=[cp_callback]) |
| > ------------------------------------------------------ |
| > eg: |
| > cp_callback=tf.kears.callbacks.ModelCheckpoint( |
| > |
| > |
| > |
| > ) |
| > |
| > epoch="迭代次数", |
| > |
| > validation_frep="每迭代多少次验证一次结果" |
| > ) |
| > |
| > |
| > ``` |
|
| ##### - 参数提取 |
|
| ```python |
| model.trainable_variables #返回模型可训练的参数 |
| ``` |
|
| ```python |
| np.set_printoptions(threshold=超过多少省略显示)#设置print输出格式 |
| np.set_printoptions(threshold=np.inf) #np.inf 表示无限大 |
| ------------------------------------------------------------ |
| #存入文本 |
| print(model.trainable_variables) |
| file=open('./weights.txt','w') |
| for v in model.trainable_variables: |
| file.write(str(v.name)+'\n') |
| file.write(str(v.shape)+'\n') |
| file.write(str(v.numpy())+'\n') |
| file.close() |
|
| ``` |
|
| ##### -acc&loss可视化 |
|
| ```python |
| history=model.fit("训练集输入特征","训练集标签", |
| batch_size=,epochs=, |
| validation_split="用作测试数据的比例", |
| validation_data="测试集", |
| validation_frep="测试频率") |
| acc=history.history['sparse_catrgorical_accuracy'] |
| val_acc=history.history['val_sparse_categorical'] |
| loss=history.history['loss'] |
| val_loss=history.history['val_loss'] |
|
| ``` |
|
| ##### - 给图识物 |
|
| ```python |
| #前向传播执行应用 |
| predict("输入特征",batch_size="整数") |
| #返回前向传播计算结果 |
|
| #复现模型前向传播 |
| model=tf.keras.models.Squential([ |
| tf.keras.layers.Flatten(), |
| tf.keras.layers.Dense(128,activation='relu') |
| tf.keras.layers.Dense(10,activation='softmax') |
| ]) |
|
| #加载参数 |
| model.load_weights(model_sava_path) |
|
| #预测结果 |
| result=model.predict(x_predict) |
| ``` |