Tensorflow2.0学习笔记

# Tensorflow2.0
### 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(标准结果,输出值)
#### - 欠拟合与过拟合
欠拟合:欠拟合是模型不能有效拟合数据集,是对现有数据集的学习不够彻底
过拟合:模型对当前数据模拟的太好了,但对未见过的新数据难以做出判断
> ![](img/屏幕截图 2021-03-06 211522.png)
√ 欠拟合的解决方法:
- 增加输入项特征
- 增加网络参数
- 减少正则化参数
√ 过拟合的解决方法:
- 数据清洗
- 增大训练集
- 采用正则化
- 增大正则化参数
√ 正则化缓解过拟合
>
√ 正则化的选择
- 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)
```
posted @ 2021-04-17 14:11  Jilfoyle  阅读(113)  评论(0)    收藏  举报