一、TensorFlow简介
1.TensorFlow定义:
tensor :张量,N维数组
Flow : 流,基于数据流图的计算
TensorFlow : 张量从图像的一端流动到另一端的计算过程,是将复杂的数据结 构传输至人工智能神经网络中进行分析和处理的过程。
2. 工作模式:
图graphs表示计算任务,图中的节点称之为op(operation) ,一个 op可以获得0个 或多个张量(tensor),通过创建会话(session)对象来执行计算,产生0个或多个tensor。
其工作模式分为两步:(1)define the computation graph
(2)run the graph (with data) in session
3. 特点:
(1)异步:一处写、一处读、一处训练
(2)全局 : 操作添加到全局的graph中 , 监控添加到全局的summary中,
参数/损失添加到全局的collection中
(3)符号式的:创建时没有具体,运行时才传入
二、 代码
1 、定义神经网络的相关参数和变量
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # -*- coding: utf-8 -*- 2 # version:python 3.5 3 import tensorflow as tf 4 from numpy.random import RandomState 5 6 batch_size = 8 7 x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input") 8 y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input') 9 w1= tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1)) 10 y = tf.matmul(x, w1)
2、设置自定义的损失函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 定义损失函数使得预测少了的损失大,于是模型应该偏向多的方向预测。 2 loss_less = 10 3 loss_more = 1 4 loss = tf.reduce_sum(tf.where(tf.greater(y, y_), (y - y_) * loss_more, (y_ - y) * loss_less)) 5 train_step = tf.train.AdamOptimizer(0.001).minimize(loss)
3、生成模拟数据集
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 rdm = RandomState(1) 2 X = rdm.rand(128,2) 3 Y = [[x1+x2+rdm.rand()/10.0-0.05] for (x1, x2) in X]
4、训练模型
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 with tf.Session() as sess: 2 init_op = tf.global_variables_initializer() 3 sess.run(init_op) 4 STEPS = 5000 5 for i in range(STEPS): 6 start = (i*batch_size) % 128 7 end = (i*batch_size) % 128 + batch_size 8 sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]}) 9 if i % 1000 == 0: 10 print("After %d training step(s), w1 is: " % (i)) 11 print sess.run(w1), "\n" 12 print "Final w1 is: \n", sess.run(w1)
结果:
After 0 training step(s), w1 is: [[-0.81031823] [ 1.4855988 ]] After 1000 training step(s), w1 is: [[ 0.01247112] [ 2.1385448 ]] After 2000 training step(s), w1 is: [[ 0.45567414] [ 2.17060661]] After 3000 training step(s), w1 is: [[ 0.69968724] [ 1.8465308 ]] After 4000 training step(s), w1 is: [[ 0.89886665] [ 1.29736018]] Final w1 is: [[ 1.01934695] [ 1.04280889]]
5、重新定义损失函数,使得预测多了的损失大,于是模型应该偏向少的方向预测
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 loss_less = 1 2 loss_more = 10 3 loss = tf.reduce_sum(tf.where(tf.greater(y, y_), (y - y_) * loss_more, (y_ - y) * loss_less)) 4 train_step = tf.train.AdamOptimizer(0.001).minimize(loss) 5 6 with tf.Session() as sess: 7 init_op = tf.global_variables_initializer() 8 sess.run(init_op) 9 STEPS = 5000 10 for i in range(STEPS): 11 start = (i*batch_size) % 128 12 end = (i*batch_size) % 128 + batch_size 13 sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]}) 14 if i % 1000 == 0: 15 print("After %d training step(s), w1 is: " % (i)) 16 print sess.run(w1), "\n" 17 print "Final w1 is: \n", sess.run(w1)
结果:
After 0 training step(s), w1 is: [[-0.81231821] [ 1.48359871]] After 1000 training step(s), w1 is: [[ 0.18643527] [ 1.07393336]] After 2000 training step(s), w1 is: [[ 0.95444274] [ 0.98088616]] After 3000 training step(s), w1 is: [[ 0.95574027] [ 0.9806633 ]] After 4000 training step(s), w1 is: [[ 0.95466018] [ 0.98135227]] Final w1 is: [[ 0.95525807] [ 0.9813394 ]]