神经网络的步骤
1.准备数据:采集大量的“特征/标签”数据
2.搭建网络:搭建神经网络的结构
3.优化参数:训练网络获取最佳参数(反传)
4.应用网络:将网络保存为模型,输入新数据,输出分类或回归的预测结构(前传)
损失函数:loss function
预测值y与标准答案y_的差距,差距越小越好
损失函数可以定量判断W,b的优劣,当损失函数输出最小时,W,b会出现最优值
均方误差:
训练神经网络就是想找到一组W,b,使得loss最小
梯度:函数对各参数求偏导后的向量。函数梯度下降方向是函数减小方向
梯度下降法:沿损失函数梯度下降的方向,寻找损失函数的最小值,得到最优参数的方法
学习率lr:过小:收敛过程十分缓慢。过大:梯度会在最小值附件震荡,甚至无法收敛
张量
张量(Tensor),阶:张量的维数
数据类型:
tf.int,tf.float…
tf.int32,tf.float32,tf.float64
tf.bool
tf.constant([True,Flase])
tf.constant(“hello,world”)
创建一个tensor:
tf.constant(张量内容,dtype=数据类型)
如a=tf.constant([1,5],dtype=tf.int64)
print(a.shape)为shape=(2,)代表是一维张量,里面有两个元素
a=np.arrange(0,5)
b=tf.convert_to_tensor(a,dtype=tf.int64) # 把numpy生成的数据转化成tensor
tf.zeros(维度) 生成全为0的张量
tf.ones(维度) 生成全为1的张量
tf.fill(维度,指定值) 生成全为指定值的张量
维度:一维直接写个数,二维用[行,列],多维用[n,m,j,k…]
如a=tf.zeros([2,3])生成二维2*3的元素全为0的张量
b=tf.ones(4)生成一维全为1的张量
生成正态分布的随机数,默认均值为0,标准差为1:tf.random.normal(维度,mean=均值,stddev=标准差)
生成截断式正态分布的随机数:tf.random.truncated_normal(维度,mean=均值,stddev=标准差)
后者生成的数据在(μ−2σ,μ+2σ)
如e=tf.random.truncated_normal([2,2],mean=0.5,stddev=1)
生成均匀分布随机数[minval,maxval):tf.random.uniform(维度,minval=最小值,maxval=最大值)
常用函数
tf.cast(张量名,dtype=数据类型)
把一个张量转化成另外一种数据类型的张量
tf.reduce_min(张量名)
计算张量中的最小值
tf.reduce_max(张量名)
计算张量的最大值
axis:二维张量执行的维度
tf.reduce_mean(张量名,axis=操作轴)
计算张量沿指定维度的平均值
tf.reduce_sum((张量名,axis=操作轴)
计算张量沿指定维度的和
如果不指定axis,则对所有元素进行操作
如x=tf.constant([[1,2,3],[2,2,3]])
tf.reduce_sum(x,axis=1)输出[6 7]
tf.Variable()将变量标记为“可训练”,被标记的变量会在反向传播中记录梯度信息,在NN训练中,常用该函数标记带训练参数
如w=tf.Variable(tf.random.normal([2,2],mean=0,stddev=1))
tensor的数学运算:
四则运算:tf.add,tf.subtract,tf.multiply,tf.divide
平方,次方,开发:tf.square,tf.pow,tf.sqrt
矩阵乘:tf.matmul
如tf.multiply(张量1,张量2):张量1的每个元素×张量2的
只有维度相同的张量才可以做四则运算
a=tf.fill([1,2],3.)
print(tf.pow(a,3)) # 三次方
print(tf.square(a)) # 平方
tf.data.Dataset.from_tensor_slices
切分传入张量的第一个维度,生成输入特征/标签对,构建数据集
data=tf.data.Dataset.from_tensor_slices((输入特征,标签))
numpy和tenor格式都可以使用改语句
如
feature=tf.constant([12,23,10,17])
labels=tf.constant([0,1,1,0])
dataset=tf.data.Dataset.from_tensor_slices((feature,labels))
使12和0对应,23和1对应…
用with结构记录计算过程,gradient求出张量的梯度
with tf.GradientTape() as tape:
若干计算过程
grad=tape.gradient(函数,对谁求导)
如
with tf.GradientTape() as tape:
w = tf.Variable(tf.constant(3.0))
loss = tf.pow(w, 2)
grad = tape.gradient(loss, w)
print(grad)
enumerate是python的内建函数,可以遍历每个元素(如列表,元组,字符串),遍历之后再组合为索引 元素,常在for循环中使用
如
seq=['one','two','three']
for i,element in enumerate(seq):
print(i,element)
输出:
0 one
1 two
2 three
独热编码:在分类问题中,常用独热源码做标签,标记类别:1表示是,0表示非
(0狗尾草 1杂色 2佛吉尼亚)
标签:1
表示独热源码为:0 1 0,代表100%的可能为杂色,0可能为狗尾草和佛吉尼亚
tf.one_hot()函数将数据转换为独热编码
tf.one_hot(待转换数据,depth=几分类)
如
classes = 3
labels = tf.constant([1, 0, 2]) # 输入的元素值最小为0,最大为2
output = tf.one_hot(labels, depth=classes)
print("result of labels1:", output)
输出
tf.nn.softmax
当n分类的n个输出(y0,y1,…yn-1)通过softmax()函数可以使其符合概率分布
如
y = tf.constant([1.01, 2.01, -0.66])
y_pro = tf.nn.softmax(y)
输出
assign_sub
更新操作并返回
调用assign_sub前,先用tf.Variable定义变量w为可训练,可子更新的
w.assign_sub(w要自减的内容)
如
x = tf.Variable(4)
x.assign_sub(1)
print("x:", x) # 4-1=3
输出
tf.argmax
返回张量沿指定维度最大值的索引
tf.argmax(张量名,axis=操作轴)
神经网络实现分类问题
1.准备数据
数据集读入
数据集乱序
生成训练集和测试集(x_train,y_train,x_test,y_test)
配成(输入特征,标签)对,每次读入一小撮(batch)
2.搭建网络
定义神经网络中所有可训练参数
3.参数优化
嵌套循环迭代,with结构更新参数,显式当前loss
4.测试效果
计算当前参数前向传播后的准确率,显式当前acc
5.acc,loss可视化