non_linear_regression

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


#****************************生成模拟的训练集数据*********************************

#np.linspace生成一个长度为200的,数据均匀分布在-0.5到0.5间的array,
#后面的[np.newaxis,:]是将生成的长度为200的array转换为1行200列的矩阵
#若写成[:,np.newaxis]则是将其转为一个200行1列的矩阵
#这些x_data可以类比为图片分类中训练集所有的图片数据,x_data的每一列数据类比于训练集中的一张图片,
#但这里的一列只是1个数据,图片分类中的一列是一整张图片的全部像素数据
x_data = np.linspace(-0.5,0.5,200)[np.newaxis,:]

#生成一个形状和x_data一样的矩阵(即1行200列),矩阵中的数据元素为0到0.02之间呈正态分布的随机值
#这是在模拟噪声,即数据的分布不是刚好呈线装的,而是上下浮动的,可以从最终生成图的散点可看出,
#而我们要做的就是找出一个可以很好的拟合这些散点的函数(即生成图片中的红色线状图)
noise = np.random.normal(0,0.02,x_data.shape)

#将x_data开平方后和noise相加得出y_data,类比于图像分类的得分输出,但本质区别就在这,
#图片分类的输出是多维的,这里这个叫线性回归(即求出这些散点数据的函数)输出是一维的
y_data = np.square(x_data) + noise

#*********************将上面生成的数据赋给x和y作为计算图中的op*************************
#*****x作为神经网络的输入层(输入层只有一个神经元),y是用在计算loss的图中进行损失计算的*****
#**因为神经网络就相当于分类器函数,函数的输入只有一个数字,所以神经网络的输入层就是一个神经元**

#创建两个形状为不定列数和一行的占位符(具体的值会在session run feed给它的时候确定,
#但是其实这里直接让它等于x_data和y_data也是可以的)
#其实这里x和y就是输入数据x_data和准确答案y_data
#(因为这里在后面就是要feed给它x_data和y_data)
# ~ x = tf.cast(x_data,tf.float32)
# ~ y = tf.cast(y_data,tf.float32)
x = tf.placeholder(tf.float32,[1,None])
y = tf.placeholder(tf.float32,[1,None])

#和之前的demo1不同,demo1中是将输入神经元直接与输出神经元相连,权重是k偏置为b,
#只用学出k和b即可,这里的神经网络为两层,以下这段为隐藏层设计
#****************这里开始设计神经网络图的中间层(10个神经元的中间层)*******************

#创建一个形状为10行1列的变量op,初始值设置为呈正态分布的随机值
#这里是权重矩阵的设置,类比于图片分类的w矩阵,图片分类中要分成10个类则w矩阵要有10行,
#而这里因为中间层有10个神经元,类比于图片分先分为10类,所以这里的权重矩阵也要有10行,
#只不过图片分类中的w矩阵一行的数据个数是很长的,和输入图片像素数一样(即输入数据的长度),
#而这里一行只有一个数据,因为输入也只有一个数据。所以是10行1列的权重矩阵
weight_L1 = tf.Variable(tf.random_normal([10,1])) 

#创建一个形状为10行1列的变量op,初始值为全0
#类比于图片分类问题,每行w和x相乘后都要和一个b偏置相加才得出输出,所以要有10个偏置,
#偏置矩阵要能和wx矩阵做加法,所以是列向量(10行1列)
biases_L1 = tf.Variable(tf.zeros([10,1]))

#虽然前面一直说输入是一个神经元(即一个数字),但这里做运算时,是以矩阵方式做运算,即对那么多训练数据,
#并不是一个个输入进神经网络中进行运算,而是将所有输入数据放在一起变成一个矩阵,一起送入网络中,
#一次性让所有训练集数据进网络进行运算,所以这里传如的x是包含了所有训练集数据的矩阵
#当输入1个数据时,w(10*1)*x(1*1)得出10*1的矩阵,和10*1的偏置相加激活后得出中间层的输出,
#而用gpu并行计算则是一次性输入200个数据w(10*1)*x(1*200)得出10*200的矩阵,
#并且在和偏置相加时op中的add算法和矩阵加法规则略有不同,因为正常10*200的矩阵是不能和10*1的偏置相加的
#而这里的算法是令wx的每列和偏置列向量相加,这样就一次性算出了所有训练集数据在该层的输出(当然后面还要激活下)
wx_plus_b_L1 = tf.matmul(weight_L1,x) + biases_L1
# ~ 上式等同于wx_plus_b_L1 = tf.add(tf.matmul(weight_L1,x),biases_L1)

#对wx_plus_b_L1调用tanh函数进行激活,输出L1为10*200,是将所有训练集数据在这层都进行激活了,
#每列为一个数据激活后的输出,200列即时200个数据在这层激活后的输出
L1 = tf.nn.tanh(wx_plus_b_L1)

#***************神经网络输出层(1个神经元,因为输出也是只有一个数字)*******************

#上面中间层的输出作为下层(即这层)的输入,所以相当于有10个输入,并且要将这10个输入最终归为一个数
#类比于图片分类问题中将中间层的分类归为最终指定分类的得分,只不过这里最终归为1个数,而不是好几个分类的得分
#图片分类问题中,要归为几类则w矩阵要有几行(这里为1),并且一行的元素个数等于输入数据的个数(这里为10)
#所以w矩阵为1行10列
weight_L2 = tf.Variable(tf.random_normal([1,10]))
#偏置要和wx相加,w为1*10,x为上层的输出,为10*1,所以偏置为1*1
biases_L2 = tf.Variable(tf.zeros([1,1]))
#同样,在计算时一次性将所有输入一次性放入,所以这里的输入是上层的输出,为10*200的矩阵
#这是输出层,不需要激活,得出prediction
prediction = tf.matmul(weight_L2,L1) + biases_L2
#*****************************************************************************
loss = tf.reduce_mean(tf.square(y-prediction))
optimizer = tf.train.GradientDescentOptimizer(0.1)
train_step = optimizer.minimize(loss)
#*****************************************************************************
with tf.Session() as session:
    session.run(tf.global_variables_initializer())
    for step in range(2000):
        session.run(train_step,feed_dict={x:x_data,y:y_data})
#*****************************************************************************
    #通过session.run获得prediction这个op的输出并打印出来
    #(一定要run才能得到它值的输出,不run它就是一个op,打出来的并不是数值)
    #通过上面2000次的训练后,现在是已经将分类器训练好了,即已经得到了一个参数正确的函数
    #这个函数就是prediction = tanh{W2[tanh(W1x+b1)]+b2},其中W1、W2、b1、b2是训练好的值
    #相当于用这个函数去拟合y = x^2函数
    #这里只用feed给这个训练好的函数一系列输入(即feed x_data),让其算出对应的输出,
    #并用这些输出画出我们拟合出的图像,并可以看出,这条图像和那些散点图是非常接近的,
    #是对应所有散点loss最小的
    prediction_value = session.run(prediction,feed_dict={x:x_data})
    #配置pyplot,用其进行画图
    plt.figure()
    
    #将传给它的两个参数向量,分别作为x坐标和y坐标,画出散点图
    #这里画出的是数据样本的散点图像
    plt.scatter(x_data,y_data)
    
    #同样是根据传给它的x_data和prediction_value作为x和y,但画的是连线图。
    #后面的参数分别配置的是线的颜色和宽度
    #这里画出的是预测函数图像,但在传给它参数之前,还对数据进行了下矩阵转置,
    #因为这个plot函数要收到列向量才能出图像= =
    plt.plot(np.transpose(x_data),np.transpose(prediction_value),'r-',lw=5)
    plt.show()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值