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))
这里定义 输入为 2 为向量输入到一个有 3 个节点的隐藏层所有 为一个 2 x 3 矩阵,然后因为输出一维矩阵。所以定义 为 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)
参数说明
- shape: 一维的张量,也是输出的张量。
- mean: 正态分布的均值。
- stddev: 正态分布的标准差。
- dtype: 输出的类型。
- seed: 一个整数,当设置之后,每次生成的随机数都一样。
- name: 操作的名字
构建计算图
正向传播
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
通过损失函数值逐渐在减少,说明训练结果是有效的。