Morvan教程笔记2019.9.13——线性函数的神经网络&matplotlib

第5例

添加神经层的函数

import tensorflow as tf
import numpy as np

def add_layer(inputs, in_size , out_size , activation_function = None):
    Weights = tf.Variable(tf.random_normal([in_size , out_size]))
    biases = tf.Variable(tf.zeros([1 , out_size]) + 0.1)
    Wx_plus_b = tf.matmul(inputs , Weights) + biases
    if activation_function is None :
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b)
    return (outputs)

构建数据,线性排列,从-1到1,300个单位;[:, np.newaxis]用来加一个维度,有300行

x_data = np.linspace(-1 , 1 ,300)[:, np.newaxis]
#加入噪点,正态分布,均值是0,标准差是0.05,格式是x_data.shape
noise = np.random.normal(0 , 0.05 , x_data.shape)
#y_data是x_data的二次方
y_data = np.square(x_data) - 0.5 + noise

用于把值输入train_step , None表示无论给多少给例子都可以

tf.placeholder(dtype, shape=None, name=None)
此函数可以理解为形参,用于定义过程,在执行的时候再赋具体的值
dtype:数据类型。常用的是tf.float32,tf.float64等数值类型
shape:数据形状。默认是None,就是一维值,也可以是多维,比如[2,3], [None, 3]表示列是3,行不定
name:名称。

xs = tf.placeholder(tf.float32,[None , 1])
ys = tf.placeholder(tf.float32,[None , 1])

构建layer,输入层只有1个神经元x,输出层也只有1个y,假设隐藏层有10个神经元

l1 = add_layer(xs , 1 , 10 , activation_function = tf.nn.relu)
prediction = add_layer(l1 , 10 , 1 , activation_function = None)
#reduction_indices = [1]表示行求和,前面数据有300行
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction) , reduction_indices = [1]))

0.1指的是学习效率,通常小于1

train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

初始化

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

执行训练,并输出loss

for i in range(1000):
    sess.run(train_step , feed_dict = {xs : x_data , ys : y_data})
    if i % 50==0:
        print(sess.run(loss , feed_dict = {xs : x_data , ys : y_data}))
        

输出结果:

0.004406632
0.004337411
0.0042773443
0.0042187506
0.0041610654
0.0041027893
0.00404956
0.0040028533
0.0039618597
0.0039221407
0.0038872377
0.0038500058
0.003817556
0.0037809452
0.0037482325
0.0037158246
0.0036712526
0.0036255915
0.0035736489
0.0035149178
​

在第5例的基础上实现图像显示

在导入模块中,加上matplotlib.pyplot

Jupyter不能显示红线,一定要加上 %matplotlib%matplotlib qt%matplotlib qt5
其中%matplotlib,在最上面的页面打开,会导致程序卡住
而另外两个不会卡住,但是是在后台打开

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

在初始化后面,可以显示真实数据

fig = plt.figure()
ax = fig.add_subplot( 1 , 1 , 1 )
ax.scatter( x_data , y_data )
plt.ion()
plt.show()

scatter是用点表示数据(后面ax.plot()使用线)
加上
plt.ion()
,使得程序不会在执行pot.show()后,就停止

进行训练,输出loss。改写后显示拟合的曲线

for i in range(1000):
    sess.run(train_step , feed_dict = {xs : x_data , ys : y_data})
    if i % 50==0:
        #print(sess.run(loss , feed_dict = {xs : x_data , ys : y_data}))
        ######### try可以先尝试移除曲线,若是不存在,则跳过
        try :
            ax.lines.remove( lines[0])
        except Exception:
            pass
        ######## 此处prediction中涉及了 l1中的xs,故要加上feed_dict
        prediction_value = sess.run( prediction , feed_dict = { xs : x_data })
        lines = ax.plot( x_data , prediction_value , 'r-' , lw = 5 )
        plt.pause(0.1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值