tensorflow例子-【老鱼学tensorflow】

本节主要用一个例子来讲述一下基本的tensorflow用法。

在这个例子中,我们首先伪造一些线性数据点,其实这些数据中本身就隐藏了一些规律,但我们假装不知道是什么规律,然后想通过神经网络来揭示这个规律。

伪造数据

import numpy as np
# 创建100个随机数
x_data = np.random.rand(100).astype(np.float32)
# 创建最终要模拟的线性公式
y_data = x_data * 0.1 + 0.3

创建模型

在伪造数据之后,我们当作不知道这些数据中蕴含的规律,我们只看到有一堆(x, y)的数据,但其中是什么规律我们不知道,但想通过神经网络的方式来揭示其中的规律。

我们觉得这个规律是线性规律,因此需要有权重值和偏置值,并且先随便设置一下其初始值:

import tensorflow as tf

# tensorflow中的变量系数,1维的初始化为从-1到1之间的一个随机数
Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
# 偏置,其实就是线性方程中的截距值,1维数据,初始化为0
biases = tf.Variable(tf.zeros([1]))

# 在tensorflow中就是根据看到的数值,通过逼近的方式来寻找出数值的规律,最终会把这里的Weights值和biases值设置成接近原始数据中的参数值。
y = Weights * x_data + biases

# 计算损失值为预测值和实际值之差平方和的平均值,损失值越小就表示越接近实际值
loss = tf.reduce_mean(tf.square(y - y_data))

# 神经网络要做的就是通过不停地迭代使这个损失值越来越小,而计算越来越小的方法是通过梯度下降算法来实现的
optimizer = tf.train.GradientDescentOptimizer(0.5)

train = optimizer.minimize(loss)

上面创建了基本的模型,然后需要开始要启动这个模型了,在启动之前,由于我们创建了几个变量,但只是通知TensorFlow说我们拥有这些变量值,但还未进行实际的赋值,要进行实际的赋值,需要通过:

# 初始化所有变量
init = tf.global_variables_initializer()
sess = tf.Session()
# 激活初始化值
sess.run(init)

不停拟合数据

我们可以通过不停给模型数据,让这个模型逐步降低损失值来达到最能拟合输入值的系数:

for step in range(200):
    sess.run(train)
    # 每隔20步打印一下模拟出来的权重值和偏置值
    if (step % 20 == 0):
        print(step, sess.run(Weights), sess.run(biases))

输出为:

0 [ 0.3676317] [ 0.21848023]
20 [ 0.16707394] [ 0.26867095]
40 [ 0.11792699] [ 0.29162663]
60 [ 0.10479139] [ 0.29776204]
80 [ 0.1012806] [ 0.29940188]
100 [ 0.10034226] [ 0.29984015]
120 [ 0.10009148] [ 0.29995728]
140 [ 0.10002445] [ 0.2999886]
160 [ 0.10000654] [ 0.29999697]
180 [ 0.10000175] [ 0.29999918]

从输出结果上来看权重值比较接近于我们原先进行伪造的系数值0.1,而偏置值也比较接近我们伪造的截距值0.3,看来神经网络很好地从一堆数据中揭示了我们预先设置好的规律值。

完整的代码为:

import tensorflow as tf
import numpy as np
# 创建100个随机数
x_data = np.random.rand(100).astype(np.float32)
# 创建最终要模拟的线性公式
y_data = x_data * 0.1 + 0.3

# tensorflow中的变量系数,1维的初始化为从-1到1之间的一个随机数
Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
# 偏置,其实就是线性方程中的截距值,1维数据,初始化为0
biases = tf.Variable(tf.zeros([1]))

# 在tensorflow中就是根据看到的数值,通过逼近的方式来寻找出数值的规律,最终会把这里的Weights值和biases值设置成接近原始数据中的参数值。
y = Weights * x_data + biases

# 计算损失值为预测值和实际值之差平方和的平均值,损失值越小就表示越接近实际值
loss = tf.reduce_mean(tf.square(y - y_data))

# 神经网络要做的就是通过不停地迭代使这个损失值越来越小,而计算越来越小的方法是通过梯度下降算法来实现的
optimizer = tf.train.GradientDescentOptimizer(0.5)

train = optimizer.minimize(loss)

# 初始化所有变量
init = tf.global_variables_initializer()
sess = tf.Session()
# 激活初始化值
sess.run(init)

for step in range(200):
    sess.run(train)
    # 每隔20步打印一下模拟出来的权重值和偏置值
    if (step % 20 == 0):
        print(step, sess.run(Weights), sess.run(biases))