永兴的Tensorflow笔记-4 初试机器学习

在这里插入图片描述

一、我们要做什么?

简单问题:如何让机器学会不通过明确的数学公式,输入任意值,输出他的3倍?
我们需要做什么:我们需要让计算机从一组看似混乱的数据中总结出 输出 约等于 3 倍 输入 的规律。

二、我们要怎么做?

一般机器学习分为四个步骤:

  • 准备数据
  • 搭建模型
  • 迭代训练
  • 使用模型

准备数据阶段我们会收集和任务有关的数据,然后我们会搭建神经网络模型,通过一定的迭代训练让神经网络学习到数据的特征,从而得到相关规律,形成可用的模型,最后我们使用模型来解决问题。

三、逐步尝试:

1、准备数据:
我们这里 y = 3x 来做为数据模拟的主体,加入噪声来让‘等号‘变成‘约等于‘,来组成 y = 3x + b

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

train_X = np.linspace(-1,1,100) #从 [-1.1] 取 100个值 给 train_X
train_Y = 3 * train_X + np.random.randn(100) * 0.3 # 模拟 y = 3 * x + b 利用 np 模拟噪声b

#显示模拟数据点
plt.plot(train_X,train_Y,'ro',label="Original data") #设置图像参数 样式:“ro”就是红色的圆圈
plt.legend() #绘制图例
plt.show() #显示

在这里插入图片描述
2、搭建模型:
搭建神经网络能可视化的画出来是能最清晰的,不管是以后的实际项目还是现在的学习都是。
tensorflow其实就是在构建一幅计算图。
计算图:
在这里插入图片描述
基本公式:
y = w*x + b (其中w,x均为向量)
w:权重
b:偏置

神经网络在训练的过程中的数据流有2个方向,即先通过正向神经网络生成一个结果,然后与真实值进行比较,再通反向神经网络将神经网络的参数进行调整,再通过正向生成结果,然后反向进行调整,一直循环往复,直到将神经网络的参数调整到合适的值为止。

  • 创建正向模型
    正向模型简单来说就是 输入 通过 神经网络 得到 输出
# 占位符 , 用于构建计算图
X = tf.placeholder("float")
Y = tf.placeholder("float")

#设置模型变量
w = tf.Variable(tf.random_normal([1]),name="weight")
b = tf.Variable(tf.random_normal([1]),name="bias")

#定义前向结构
z = tf.multiply(X,w) + b
  • 创建反向模型
    先通过正向神经网络生成一个结果,然后与真实值进行比较,再通反向神经网络将神经网络的参数进行调整。
cost = tf.reduce_mean(tf.square(Y-z)) #计算真实值与实际值的平方查
learning_rate = 0.01  #设置学习率
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #设置梯度下降优化

学习率:代表调整参数的速度,一般小于 1

3、迭代训练模型
建立好模型后,我们就要通过迭代来训练模型。在Tensorflow中,是通过 会话 session 来进行的。
一般先进行全局初始化,然后设置训练次数迭代,启动session开始执行训练任务。

#设置初始化所有变量
init = tf.global_variables_initializer()
#定义参数
training_epochs = 200
display_step = 2

with tf.Session() as sess:
    sess.run(init) #进行初始化
    plodata = {"batchsize":[],"loss":[]} #定义字典 存放 批次值 和 损失值
    for epoth in range(training_epochs) :
        for (x,y) in zip(train_X,train_Y):
            sess.run(optimizer,feed_dict={X:x,Y:y})

            #显示训练中的详细信息
            if epoth % display_step ==  0 :  #每运行2次
                loss = sess.run(cost,feed_dict={X:x,Y:y}) #使用feed 放入数据形成数据流
                print("Epoch:",epoth+1,"cost:",loss,"w=",sess.run(w),"b=",sess.run(b)) #打印 相关信息
                if not (loss == "NA"): # 将有效信息放入 plodata
                    plodata["batchsize"].append(epoth)
                    plodata["loss"].append(loss)

    print("Finished !") 
    print("coss=",sess.run(cost,feed_dict={X:train_X,Y:train_Y}),"w=",sess.run(w),"b=",sess.run(b)) #训练完成显示最近一次计算结果

4、模型使用:
模型训练好后,我们就需要进行测试使用

x= 0.5 #测试输入值
print("x=",x,"y_=",sess.run(z,feed_dict={X:x}))

5、模型训练可视化:
后面章节直接讲 TensorBoard

四、完整代码展示:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

train_X = np.linspace(-1,1,100) #从 [-1.1] 取 100个值 给 train_X
train_Y = 3 * train_X + np.random.randn(100) * 0.3 # 模拟 y = 3 * x + b 利用 np 模拟噪声b

# #显示模拟数据点
# plt.plot(train_X,train_Y,'ro',label="Original data") #设置图像参数 样式:“ro”就是红色的圆圈
# plt.legend() #绘制图例
# plt.show() #显示
# 占位符 , 用于构建计算图
X = tf.placeholder("float")
Y = tf.placeholder("float")

#设置模型变量
w = tf.Variable(tf.random_normal([1]),name="weight")
b = tf.Variable(tf.random_normal([1]),name="bias")

#定义前向结构
z = tf.multiply(X,w) + b

cost = tf.reduce_mean(tf.square(Y-z)) #计算真实值与实际值的平方差 作为 损失值 loss
learning_rate = 0.01  #设置学习率
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #设置梯度下降优化

#设置初始化所有变量
init = tf.global_variables_initializer()
#定义参数
training_epochs = 20
display_step = 2

with tf.Session() as sess:
    sess.run(init) #进行初始化
    plodata = {"batchsize":[],"loss":[]} #定义字典 存放 批次值 和 损失值
    for epoth in range(training_epochs) :
            for (x,y) in zip(train_X,train_Y):
                sess.run(optimizer,feed_dict={X:x,Y:y})#显示训练中的详细信息
                if epoth % display_step == 0 :  #每运行2次
                    loss = sess.run(cost,feed_dict={X:x,Y:y}) #使用feed 放入数据形成数据流
                    print("Epoch:",epoth+1,"cost:",loss,"w=",sess.run(w),"b=",sess.run(b)) #打印 相关信息
                    if not (loss == "NA"): # 将有效信息放入 plodata
                        plodata["batchsize"].append(epoth)
                        plodata["loss"].append(loss)

    print("Finished !")
    print("coss=",sess.run(cost,feed_dict={X:x,Y:y}),"w=",sess.run(w),"b=",sess.run(b)) #训练完成显示最近一次计算结果



练习题4:
利用神经网络的方法,向神经网络程序输入 3 程序大约返回 15 ,要求训练的时候加入噪声等,并且具有神经网络的基本步骤。

评论出你的答案。

发布了45 篇原创文章 · 获赞 28 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/m0_43505377/article/details/103871743