Tensorflow2.0学习笔记

Tensorflow2.0

1.张量(Tensor)

张量(Tensor):多维数组(列表) 阶:张量的维数

维数 名字 例子
0-D 0 标量 scalar s=1 2 3
1-D 1 向量 vector v=[1,2,3]
2-D 2 矩阵 matrix m=[[1,2,3],[4,5,6],[7,8,9]]
n-D n 张量 tensor t=[[[ n个

张量可以表示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=数据类型) 创建张量

  2. tf.zeros(维度)------创建全为0的张量

  3. tf.ones(维度)-------创建全为的张量

  4. tf.fill(维度,指定值)---创建指定值的张量

    5.tf.random.normal(维度,mean=均值,stddev=标准差)--生成正态分布的随机数,默认均值为0,标准差为1

    6.tf.random.truncted_normal(维度,mean=均值,stddev=标准差)

    注意:在tf.truncated_normal中如果随机生成数据的取值在(u-2q,u+2q)之外则重新进行生成,保证了生成值在均值附近。 u=均值,q=标准差

    7.tf.random.uniform(维度,minval=最小值,maxval=最大值)

    8.tf.convert_to_tensor(数据名,dtype=数据类型)--将numpy数据类型的数据转换为Tensor数据类型的数据

2.复杂度学习率

- 神经网络(NN)复杂度

NN复杂度:多用NN层数和NN参数的个数表示

空间复杂度:
​ √ 层数=隐藏层的层数+1个输出层左图为2层NN
​ √ 总参数=总w+总b
​ 左图34+4(第一层) +42+2( 第二层)=26

时间复杂度:
​ √ 乘加运算次数 左图34(第一层)+42(第二层)=20

- 学习率

- 激活函数

√ 优秀的激活函数:
非线性:激活函数非线性时,多层神经网络可逼近所有函数
卫微性:优化器大多用梯度下降更新参数
单调性:当激活函数是单调的,能保证单层网络的损失函数是凸函数
近似恒等性:f(x)≈x 当参数初始化为随机小值时,神经网络更稳定

√激活函数输出值的范围:
激活函数输出值为有限值时,基于梯度的优化方法更稳定
激活函数输出为无限值时,建议调小学习率

√ Sigmoid函数

√ Tanh函数

√ Relu函数

√ Leaky Relu函数

总结:
​ √首选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 导入相关模块
  2. train ,test 导入要喂入网络的训练集和测试集
  3. model=tf.keras.models.Sequetial 搭建网络结构 , 逐层描述每层网络(相当于走一边前向传播)
  4. model.compile 配置训练方法选择优化器,损失函数,评测指标
  5. model.fit 执行训练过程,告知训练集和测试集的输入特征和标签,告知batch的个数是多少,迭代数据集的次数
  6. model.summary 用summary( )打印出网络的结构和参数统计
- Sequential搭建顺序网络结构

总结:用Sequential可以搭建上层输出就是下层输入的顺序网络结构,但无法写出带跳连的非顺序网络结构

- 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)

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. 自制数据集,解决本领域应用
  2. 数据增强,扩充数据集
  3. 断点续训,存取模型
  4. 参数提取,把参数存入文本
  5. acc/loss 可视化,查看训练效果
  6. 应用程序,给图识物
- 自制数据集

- 数据增强

- 断点续训

读取模型

load_weights(文件路径名)
------------------------------------------------------
eg:
checkpoint_sava_path="./checkpoint/mnist.ckpt"
if os.path.exits(check_sava_path+'.index'):
 print("{:-^30}".format("load the model"))

保存模型

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(
				filepath=路径文件名
				sava_weights_only=True,
				sava_best_only=True
 )
	history=model.fit("训练输入特征","训练输入标签",									                         batch_size="batch数",
                     epoch="迭代次数",
                  	validation_data=("测试输入特征","测试输入标签"),
                     validation_frep="每迭代多少次验证一次结果"
                  )


- 参数提取
model.trainable_variables    #返回模型可训练的参数
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可视化
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']

- 给图识物
#前向传播执行应用
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:33  Jilfoyle  阅读(138)  评论(0)    收藏  举报