TensorFlow学习笔记
张量(Tensor)生成
- Tensor:多维数组(列表)
- 阶:张量的维度
- t = [[[… 有n个‘ [ ’就是n维度tensor
- tf.constant(tensor内容,dtype = 数据类型(可选)) 创建一个内容为tensor 数据类型为dtype的张量
- tf.ones(维度) 创建一个维度指定,内容全是1的tensor
- tf.zeros(维度) 创建一个维度制定,内容全为0的tensor
- tf.fill(维度,指定值) 创建全为制定值的tensor
维度:
一维:直接邪个数
二维:用[行,列]
多维:用[n ,m ,i,j, k…]
如何创建一个tensor
- tf.random.normal(维度,mean=均值,stddev=标准差) 生成正态分布的随机数,均值为mean,方差为stddev。默认均值为0,方差为1
- tf.random.truncated_normal(维度,mean = 均值,stddev = 方差 )生成截断式正态分布的随机数。可以使生成的数据更向均值集中
- tf.random.unifrom(维度,minval=最小值,maxval=最大值) 生成均匀分布随机数【min,max】前闭后开区间
在truncated_normal中如果随机生成数据的取值在(μ-2σ,μ+2σ)之外,则重新生成,保证生成在均值附近。μ:均值 σ:标准差
常用函数
-
tf.cast(张量名,dtype = 数据类型) 强制将目标tensor转换为该数据类型
-
tf.reduce_min(tensor,axis=操作轴) 计算tensor沿指定维度的最小值
-
tf.reduce_max(tensor,axis=操作轴) 计算tensor沿指定维度的最大值
-
tf.reduce_sum(tensor,axis=操作轴)计算tensor沿指定维度的和
-
tf.reduce_mean(tensor,axis=操作轴)计算tensor沿指定维度的平均值
-
ti.Variable(初始值) 将变量标记为可训练的,被标记的变量会在反向传播中记录梯度信息。神经网络的训练中,常用该函数标记待训练的参数
-
对应元素的四则运算:tf.add ,tf.subtract, tf.multiply, tf.divide
-
平方,次方,开方 tf.square, tf.pow , tf.sqrt
-
矩阵乘 tf.matmul
-
只有维度相同的两个张量才能够进行四则运算
-
tf.data.Dataset.from_tensor_slice((输入特征,标签)) 生成输入特征/标签对,构建数据集
-
tf.GradientTape:
tf.GradientTape: with 结构记录计算过程,gradient 求出tensor的梯度
with tf.GradientTape()as tape;
若干个计算过程
grad=tape.gradient(函数,对谁求导) -
enumerate 是python的内建函数,它可遍历每个元素(如列表、元组、或字符串), 他的组合为:索引 元素 常在for循环中使用
enumerate(列表名) -
tf.one_hot(待转换数据,depth= 分几类) 在分类问题中,常用独热码做标签,1表示是 0表示非
-
tf.nn.softmax(x) 使输出x符合概率分布
-
assign_sub()
.赋值操作,更新参数的值并返回
调用assign_sub之前,要先用tf.Veriable 定义变量w为可训练(可以自更新)
w.assign_sub(w要自减的内容) -
tf.argmax(tensor,axis=操作轴) :返回张量沿制定维度的最大值的索引
理解axis
在一个二维张量或数组中,可以通过axis等于0或者1控制执行维度
axis = 0代表跨行(经度,down),而axis = 1 代表跨列(纬度,across)
如果不指定axis,则所有元素参与计算
神经网络实现鸢尾花分类
准备数据
1、数据集读入
2、 数据集乱序
3、生成训练集和测试集
4、 配成(输入特征,标签)对,每一次读入一个batch
数据集读入
从sklearn包datasets读入数据;
from sklearn import datasets
x_data = datasets.load_iris().data
y_data = datasets.load_iris().target
数据集乱序
np…random.seed(16) 使用相同的seed,使输入特征/标签一一对应
np.random.seed(116)
np.random.shuffle(x_data) # 打乱x_data
np.random.seed(116)
np.random.shuffle(y_data)# 打乱 y-data
tf.random.set_seed(116)
数据集分成永不相见的训练集和测试集
x_train = x_data[:30]
y_train = y_data[:30]
x_test = x_data[-30:]
y_test = y_data[-30:]
配成[输入特征,标签]对,每次喂入一个batch
train_db = tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(32)
test_db = tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(32)
搭建网路偶
定义神经网络中所有可训练的参数
定义神经网络中所有的可训练参数
w1 = tf.Variable(tf.random.truncated_normal([4,3],stddev=0.1,seed = 1))
b1 = tf.Variable(tf.random.truncated_normal([3],stddev=0.1,seed=1))
参数优化
嵌套循环迭代,with结构更新参数,显示当前loss
嵌套循环迭代,with结构更新参数,显示当前loss
for epoch in range(epoch):# 数据集级别迭代
for step,(x_train,y_train) in enumerate(train_db):# batch级别迭代
with tf.GradientTape() as tape:# 记录梯度信息
grad = tape.gradient(loss,[w1,b1])
# 前向传播过程计算y
# 计算总loss
w1.assign_sub(lr*grad[0])
b1.assign_sub(lr*grad[1])
print('epoch{},loss:{}'.format(epoch,loss_all/4))
测试效果
计算当前参数前向传播后的准确率,显示当前acc
计算当前参数前向传播后的准确率,显示为当前acc
for x_test,y_test in test_db:
y = tf.matmul(h,w)+b # y为预测结果
y=tf.nn.softmax(y) # 令y符合概率分布 (和为1)
pred = tf.argmax(y,axis=1) # 返回y中最大值的索引,即预测的分类
pred = tf.cast(pred,dtype= y_test.dtype) # 调整预测值的数据类型,使其与标签一致
correct = tf.cast(tf.equal(pred,y_test),dtype=tf.int32)
correct = tf.reduce_sum(correct) # 将每个batch中的correct数加起来
total_correct += int(correct) # 将所有batch中correct数加起来
total_number += x_test.shape[0]
acc = total_correct/total_number
print('test_acc : ' ,acc)
acc/loss 可视化
// acc\loss可视化
plt.title('Acc,Curve') # 图片标题为Acc,Curve
plt.xlabel('Epoch') # x轴名称
plt.ylabel('Acc'') # y轴名称
plt.plot(test_acc,label = "$Accuracy$") # 逐点划出test_acc 值并连线
plt.legend()
plt.show()