欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

tensorflow实现简单神经网络层逼近一个二次函数的demo

程序员文章站 2022-05-22 13:07:14
...

  构造一个满足一元二次函数y=a*x^2 + b的网络,生成一批原始数据,然后搭建简单的神经网络,仅仅包含着一个输入层、一个隐藏层和一个输出层。通过TensorFlow吧隐藏层和输出层的权重w和偏置b学习出来,预估随着实验次数的增加,loss值会不断地减小。

  接下来我们遵循一下的思路进行实验:

  1.构造数据

  2.构建网络

  3.训练模型

  4.评估及预测模型

  一开始用numpy包生成输入数据,然后提出假设为y=x*x - 0.5,我们构造出满足假设的x和y数据后,同时加入一些不满足方程的噪声点。代码如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Jan  4 15:02:04 2018

@author: lisir
"""

import tensorflow as tf
import numpy as np
# 构造满足一元二次方程的函数
# 构建300个点,区间[-1, 1],直接用numpy生成等差数列,然后将结果是300个点的一维数组转换为300X1二维数组
x_data = np.linspace(-1, 1, 300)[:, np.newaxis]
# 此处加入噪声点,使得他们与x_data的维度一致,并且拟合成均值为0,方差为0.05正态分布
noise = np.random.normal(0, 0.05, x_data.shape)
# 假设的方程,并且加入噪声点
y_data = np.square(x_data) - 0.5 + noise

xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])
# 定义网络层
def definate_layer(inputs, in_size, out_size, activation_function=None):
    # 权重构造,in_sizeXout_size大小的矩阵
    weights = tf.Variable(tf.random_normal([in_size, out_size]))
    # 偏置构造,1Xout_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
# 构建隐藏层,设置为10个神经元
h1 = definate_layer(xs, 1, 20, activation_function=tf.nn.relu)
# 构建输出层,与输入层一样,包含一个神经元
prediction = definate_layer(h1, 20, 1, activation_function=None)

# 构建损失函数,计算预测值与真实值的误差
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), reduction_indices=[1]))

train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 初始化,构建TensorFlow会话
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
# 训练10000次
for i in range(100000):
    sess.run(train_step, feed_dict={xs:x_data, ys:y_data})
    if i%50 == 0: # 50次打印一次
        print("loss: ", sess.run(loss, feed_dict={xs:x_data, ys:y_data}))

tensorflow实现简单神经网络层逼近一个二次函数的demo