深度学习程序员计算机视觉

TensorFlow 基础(F)

2019-10-19  本文已影响0人  zidea
awesome-tensorflow

今天我们来通过解决一个二分类问题实现一个比较完整的神经网络,虽然简单但是在完成这个实例我们就可以大概走了一个开发流程。

引入依赖

#coding=utf-8
import tensorflow as tf
from numpy.random import RandomState

准备数据集

random_state = RandomState(1)
dataset_size = 128
X = random_state.rand(dataset_size,2)
print(X[:5])
[[4.17022005e-01 7.20324493e-01]
 [1.14374817e-04 3.02332573e-01]
 [1.46755891e-01 9.23385948e-02]
 [1.86260211e-01 3.45560727e-01]
 [3.96767474e-01 5.38816734e-01]]

这里我们用 X 表示样板,通过用大写字母表示矩阵以便于与向量进行区分。

[[0], [1], [1], [1], [1]]

定义变量

learning_rate = 0.001
STEPS = 5000
batch_size = 8

w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))

这里定义w_1 输入为 2 为向量输入到一个有 3 个节点的隐藏层所有 w_1 为一个 2 x 3 矩阵,然后因为输出一维矩阵。所以定义 w_2 为 3 x 1 矩阵。

x = tf.placeholder(tf.float32, shape=(None,2),name='x')
y_ = tf.placeholder(tf.float32, shape=(None,1), name='y')

tf.random_normal() 函数用于生成服从指定正太分布的数值中取出指定个数的值作为数值。
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)

参数说明

构建计算图

正向传播
x = tf.placeholder(tf.float32, shape=(None,2),name='x')
y_ = tf.placeholder(tf.float32, shape=(None,1), name='y')
layer_one = tf.matmul(x,w1)
y = tf.matmul(layer_one,w2)

反向传播

定义损失函数和优化过程,我们这损失函数使用的交叉熵来计算损失值。优化器这里使用 AdamOptimizer ,并且学习率给 0.001

cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0)))
train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)
创建会话
init_op = tf.initialize_all_variables()
# 创建会话
with tf.Session() as sess:
    sess.run(init_op)
    print sess.run(w1)
    print sess.run(w2)
[[-0.8113182   1.4845988   0.06532937]
 [-2.4427042   0.0992484   0.5912243 ]]
[[-0.8113182 ]
 [ 1.4845988 ]
 [ 0.06532937]]

我们定义一个 load_data 函数来负责加载按批次来加载数据。

def load_data(index):
    start = (i * batch_size) % dataset_size
    end = min(start+batch_size,dataset_size)
    return X[start:end],Y[start:end]
with tf.Session() as sess:
    sess.run(init_op)
    # print sess.run(w1)
    # print sess.run(w2)
    for i in range(STEPS):
       
        x_data,y_data = load_data(i)
        sess.run(train_step,feed_dict={x:x_data,y_:y_data})

        if i % 1000 == 0:
            total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y})
            print "After %d training steps ,cross_entropy on all data is %g" % (i, total_cross_entropy)
    
After 0 training steps ,cross_entropy on all data is 0.0674925
After 1000 training steps ,cross_entropy on all data is 0.0163385
After 2000 training steps ,cross_entropy on all data is 0.00907547
After 3000 training steps ,cross_entropy on all data is 0.00714436
After 4000 training steps ,cross_entropy on all data is 0.00578471

通过损失函数值逐渐在减少,说明训练结果是有效的。

上一篇下一篇

猜你喜欢

热点阅读