Tensorflow深度学习应用(进阶篇)

#coding=gbk
'''
进阶篇
    相关数据:
    标签:要预测的事物
    特征:用于描述数据的输入变量
    样本:数据的特定实例
    有标签的样本:{特征,标签}
    无标的样本:{特征,...}

    模型:
    将样本映射到预测标签,有内部参数描述,参数通过学习而来。通过有标签的样本来确定所以权重w和偏差b的最优值。

    损失:
    是对糟糕预测的惩罚,损失是一个数值,表示对单个样本而言模型的预测准确度。

    定义损失函数
        L1损失:基于模型预测的值与标签的实际值之差的绝对值
        平方损失(L2损失)
        均方误差(MSE):平均平方误差

    收敛:总体损失不再变化或变化极其缓慢

    梯度:是一个向量,表示某一函数在该点处的方向导数最大,即该方向变化最快,变化率最大。
        f'(x)=dx/xy,沿着梯度的反方向能很快收敛。

    梯度下降法
    学习率:步长设置要合理,才能很快收敛,不会出现左右震荡现象。
    超参数:指机器学习在训练之前需要设置的参数,好的超参数,可以提高学习效率和效果。如学习率隐含层层数等。

扩展篇
'''
#coding=gbk

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  #设置绘图显示中文
mpl.rcParams['axes.unicode_minus'] = False  #防止中文乱码,有时候第一句不能完全避免显示错误

#导入tensorflow 模块
import tensorflow.compat.v1 as tf
import matplotlib.pyplot as plt
import numpy as np

#回归模型实践
#拟合函数y=4.5x+3
#样本数据,有误差
dx = np.linspace(-1, 1, 50)#等差数列
eps = np.random.randn(*dx.shape) * 0.4#*dx.shape表示吧x拆分为一个一维数组,randn参数为一个整数类型的值,而x.shape为一个元组
dy = 4.5 * dx + 3 + eps

print("dx=",dx)
print("dy=", dy)

#构建模型X
#定义x,y占位符
x = tf.placeholder("float32", name='x')
y = tf.placeholder("float32", name='y')

#模型,形参不是占位符变量
def model(a, b, c):
    return tf.multiply(a, b) + c#此处参数定义为形参
    
#创建变量
w = tf.Variable(1.0, name='w')
b = tf.Variable(0.0, name="b")

#构建预测,调用预测模型需要用到占位的变量
pred = model(x, w, b)

#迭代次数
train_c = 15
#学习率Y
learning_rate = 0.05

#L2损失函数y,需要用到占位变量
loss_fun =tf.reduce_mean(tf.square(y - pred))

#梯度下降优化器
op = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_fun)

sess=tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

fig = plt.figure()
plt.subplots_adjust(wspace =0.2, hspace =0.4)#设置子图间距离
ax = fig.add_subplot(221)

list_loss = []
list_w = []
list_b = []

for i in range(train_c):

    for x_, y_ in zip(dx, dy):  #Zip将x,y一维数组组合成一个一维数组,每个元素为x,y对
        _, loss = sess.run([op, loss_fun], feed_dict={x: x_, y: y_})  #将取出来的x_,y_数据输入到占位符X,Y中去
    #获取w和b的值
    b0 = b.eval(session=sess)
    w0 = w.eval(session=sess)
    ax.plot(dx, w0 * dx + b0)
    
    #用于可视化损失值的变化
    list_loss.append(loss)
    list_w.append(w0)
    list_b.append(b0)

ax.set_title("随机样本/y=4.5x+3")
ax.scatter(dx, dy)#散点图
ax.plot(dx, 4.5 * dx + 3, color='red')

ax = fig.add_subplot(222)
ax.set_title("损失loss")
ax.plot(list_loss, c='b',marker='.')

ax=fig.add_subplot(223)
ax.set_title("权重w")
plt.plot(list_w,  c='g',marker='+')

ax=fig.add_subplot(224)
ax.set_title("偏差b")
ax.plot(2,2,list_b, c='yellow',marker='*')

#预测
x1 = 3.9
predict=sess.run(pred,feed_dict={x:x1})
print("预测值:",predict)

plt.show()

在这里插入图片描述
附:
本文章学习自中国大学mooc-深度学习应用开发-Tensorflow实战

发布了89 篇原创文章 · 获赞 8 · 访问量 8872

猜你喜欢

转载自blog.csdn.net/TxyITxs/article/details/103844935