tensorflow学习笔记

张量(Tensor)生成

  1. Tensor:多维数组(列表)
  2. 阶:张量的维度
  3. t = [[[… 有n个‘ [ ’就是n维度tensor
  4. tf.constant(tensor内容,dtype = 数据类型(可选)) 创建一个内容为tensor 数据类型为dtype的张量
  5. tf.ones(维度) 创建一个维度指定,内容全是1的tensor
  6. tf.zeros(维度) 创建一个维度制定,内容全为0的tensor
  7. tf.fill(维度,指定值) 创建全为制定值的tensor

维度:

一维:直接邪个数
二维:用[行,列]
多维:用[n ,m ,i,j, k…]

如何创建一个tensor

  1. tf.random.normal(维度,mean=均值,stddev=标准差) 生成正态分布的随机数,均值为mean,方差为stddev。默认均值为0,方差为1
  2. tf.random.truncated_normal(维度,mean = 均值,stddev = 方差 )生成截断式正态分布的随机数。可以使生成的数据更向均值集中
  3. tf.random.unifrom(维度,minval=最小值,maxval=最大值) 生成均匀分布随机数【min,max】前闭后开区间

在truncated_normal中如果随机生成数据的取值在(μ-2σ,μ+2σ)之外,则重新生成,保证生成在均值附近。μ:均值 σ:标准差

常用函数

  1. tf.cast(张量名,dtype = 数据类型) 强制将目标tensor转换为该数据类型

  2. tf.reduce_min(tensor,axis=操作轴) 计算tensor沿指定维度的最小值

  3. tf.reduce_max(tensor,axis=操作轴) 计算tensor沿指定维度的最大值

  4. tf.reduce_sum(tensor,axis=操作轴)计算tensor沿指定维度的和

  5. tf.reduce_mean(tensor,axis=操作轴)计算tensor沿指定维度的平均值

  6. ti.Variable(初始值) 将变量标记为可训练的,被标记的变量会在反向传播中记录梯度信息。神经网络的训练中,常用该函数标记待训练的参数

  7. 对应元素的四则运算:tf.add ,tf.subtract, tf.multiply, tf.divide

  8. 平方,次方,开方 tf.square, tf.pow , tf.sqrt

  9. 矩阵乘 tf.matmul

  10. 只有维度相同的两个张量才能够进行四则运算

  11. tf.data.Dataset.from_tensor_slice((输入特征,标签)) 生成输入特征/标签对,构建数据集

  12. tf.GradientTape:
    tf.GradientTape: with 结构记录计算过程,gradient 求出tensor的梯度
    with tf.GradientTape()as tape;
    若干个计算过程
    grad=tape.gradient(函数,对谁求导)

  13. enumerate 是python的内建函数,它可遍历每个元素(如列表、元组、或字符串), 他的组合为:索引 元素 常在for循环中使用
    enumerate(列表名)

  14. tf.one_hot(待转换数据,depth= 分几类) 在分类问题中,常用独热码做标签,1表示是 0表示非

  15. tf.nn.softmax(x) 使输出x符合概率分布

  16. assign_sub()
    .赋值操作,更新参数的值并返回
    调用assign_sub之前,要先用tf.Veriable 定义变量w为可训练(可以自更新)
    w.assign_sub(w要自减的内容)

  17. 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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值