学习自: https://www.bilibili.com/video/BV1B7411L7Qt?p=1
之前跟的天池的一个学习视频,但是由于tensorflow版本问题,加上在代码讲解部分不够细致所以更换了课程。
强烈安利现在的课程,授课人是北京大学软件与微电子学院的曹健老师,整个课程深入浅出,对于代码部分介绍十分细致,很适合我这种刚想入门tensorflow的小白。第一次见弹幕一直在不由自主各种感叹老师教的真好的哈哈,确实讲的太好了,吐血安利!!!!
1.1人工智能三学派
通过神经网络可以使计算机具有感性思维
基于连接主义的神经网络设计过程
随着我们成长,神经网络连线上的权重发生了变化,有些线上权重增加,有些线上权重减弱
准备数据-》搭建网络-》优化参数-》应用网络
1.2初认神经网络设计过程-鸢尾花分类问题
神经网络通过大量输入特征和标签构成数据集
输入:花瓣长、花瓣宽、花萼长、花萼宽
输出:三种类别
这是一个全连接网络,随机初始化w和b
输出的y中哪个得分最高,便将其归到哪一类,这里鸢尾花的实际标签为0但是根据输出结果被判断成了1,这是因为一开始w和b都是随机初始化的,因此需要用到损失函数来不断寻找最优值
目的:寻找一组w和b使得损失函数最小
从图中可以看出W=-1时候的损失函数最小
import tensorflow as tf
#设置参数w的随机初始值为5,设定为可训练(即vaiable形式?)
w = tf.Variable(tf.constant(5, dtype=tf.float32))
#学习率
lr=0.2
#循环次数
epoch=40
for epoch in range(epoch):
with tf.GradientTape() as tape:#with结构到grad框起到了梯度计算的过程
loss=tf.square(w+1) #损失函数定义为w+1的平方
grads=tape.gradient(loss,w)#gradinet函数告知对谁求导
w.assign_sub(lr*grads) #assign_sub做自减,即w-=
print("After %s epoch,w is %f,loss is %f" % (epoch, w.numpy(), loss))
#可以发现w为-1时候损失函数值最小
#可以尝试更改lr,可以发现lr过小的时候迭代太慢,lr过大的时候一直在最优值跳动找不到最优值
1.3 张量生成
tensorflow中的tensor就是张量,是多维数组(多维列表),用阶来表示张量的维数,判断张量是几阶的可以看有几个方括号
tensorflow中的数据类型
图和创建一个张量tensor
import tensorflow as tf
a=tf.constant([1,5],dtype=tf.int64)
#直接打印a,会输出a的所有信息
print(a)
#打印a的数据类型
print(a.dtype)
#打印a的形状
print(a.shape)
很多时候数据是用numpy给出的,可以通tf.convert_to_tensor(数据名,dtype=数据类型(可选))将其转化为tensor数据类型
import tensorflow as tf
import numpy as np
a=np.arange(0,5)
b=tf.convert_to_tensor(a,dtype=tf.int64)
print(a)
print(b)
结果为
[0 1 2 3 4]
tf.Tensor([0 1 2 3 4], shape=(5,), dtype=int64)
其他张量创建方法
#创建全为0的张量
tf.zeros(维度)
#创建全为1的张量
tf.ones(维度)
#创建全为指定值的张量
tf.fill(维度,指定值)
注意对于维度:
一维直接写个数
二维用【行,列】
多维用【m,j,k…】
a=tf.zeros([2,3])
b=tf.ones(4)
c=tf.fill([2,2],9)
print(a)
print(b)
print(c)
生成随机数
- 生产正态分布的随机数,默认均值为0,标准差为1
tf.random.normal(维度,mean=均值,stddev=标准差)
如果希望生成的随机数更集中可以采用截断式正态分布,可以保证生成的数在两倍标准差之内
- 生成截断式正态分布的随机数
tf.random.truncated_normal(维度,mean=均值,stddev=标准差)
- 生成均匀分布随机数[minval,maxval),注意是前闭后开
tf.random.uniform(维度,minval=最小值,maxval=最大值)
d=tf.random.normal([2,2],mean=0.5,stddev=1)
print(d)
e=tf.random.truncated_normal([2,2],mean=0.5,stddev=1)
print(e)
f=tf.random.uniform([2,2],minval