TensorFlow实战——入门
来源:互联网 发布:电脑壁纸 知乎 编辑:程序博客网 时间:2024/06/07 15:04
http://blog.csdn.net/u011239443/article/details/70224863
入门
我们先来理解一下TensorFlow字面上的意思:
- Tensor,张量,其实我们可以简单的理解为是多维数组,这也是TensorFlow中的基本数据结构。
- Flow,流,很直观的表达了,Tensor之间的转化是一种类似于流的方式。
ex.
import tensorflow as tfa = tf.constant([1.0,2.0],name="a")b = tf.constant([2.0,3.0],name="b")result = a+bsess = tf.Session()sess.run(result)
解析
tf.constant
是用来创建常量Tensor
的。在运行到result = a+b
时,TensorFlow
并没有真的把两个Tensor
相加。tf.Session()
返回的是和TensorFlow
的会话,该会话我们可以调用其的run
方法。如sess.run(result)
,这时TensorFlow
才会去回溯帮我们,类似于流水一样,从上面流下来,真正的帮计算出result
。结果:
array([ 3., 5.], dtype=float32)
实现前馈神经网络
import tensorflow as tffrom numpy.random import RandomState# 每次我们训练的时候 只喂8条数据进去batch_size = 8"""random_normal 生成随机多维数组def random_normal(shape, mean=0.0, stddev=1.0, dtype=dtypes.float32, seed=None, name=None):如 w1 就生成了 2×3 的随机数组,数值发布为平均数为0,标准差为1这里,我们准备构建的神经网络为:输入层为 2个节点隐藏层(只有一层)为 3个节点w1 和 w2 """w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))"""这里的 placeholder 可以看成一个入口,我们不希望把如此巨大的数据量全都一下子装进TensorFlow里,这极大的增加了开销。我们更希望是,每次喂一部分的数据,然后每次更新优化优化权值。x 是特征数据的入口,就2维y_ 是label数据的入口None 代表行数任意"""x = tf.placeholder(tf.float32, shape=(None, 2), name='x-input')y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input')# 矩阵相乘,得到预测结果 ya = tf.matmul(x, w1)y = tf.matmul(a, w2)# 损失函数,后面会讲cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))""" 创建优化器, 0.001 是学习率 优化目标三 最小化 cross_entropy"""train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)# 随机生成数据rdm = RandomState(1)dataset_size = 128X = rdm.rand(dataset_size, 2)Y = [[int(x1 + x2 < 1)] for (x1, x2) in X]"""TF的会话需要关闭,但若我们使用with tf.Session() as sess: ..... .....的编码写法,就不用担心忘记关闭会话了。"""with tf.Session() as sess: # 创建变量初始化的操作,并run它 init_op = tf.global_variables_initializer() sess.run(init_op) """ 于是便执行了 tf.Variable ,w1 w2 被初始化了。我们来看下打印结果: [[-0.81131822 1.48459876 0.06532937] [-2.44270396 0.0992484 0.59122431]] [[-0.81131822] [ 1.48459876] [ 0.06532937]] """ print sess.run(w1) print sess.run(w2) # 迭代次数 STEPS = 5000 for i in range(STEPS): # 截取数据 start = (i * batch_size) % dataset_size end = min(start + batch_size, dataset_size) # 喂数据给 x 和 y_,并 run 训练 sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]}) """ 每训练 1000 次 我们打印出整个数据集的 cross_entropy Atter 0 training step(s),cross entropy on all data is 0.0674925 Atter 1000 training step(s),cross entropy on all data is 0.0163385 Atter 2000 training step(s),cross entropy on all data is 0.00907547 Atter 3000 training step(s),cross entropy on all data is 0.00714436 Atter 4000 training step(s),cross entropy on all data is 0.00578471 我们可以看到随着优化,cross entropy越来越低 """ if i % 1000 == 0: total_cross_entropy = sess.run(cross_entropy,feed_dict={x: X, y_: Y}) print("Atter %d training step(s),cross entropy on all data ""is %g " % (i, total_cross_entropy)) """ 最后 看一下 w1 w2 优化调整后的结果: [[-1.9618274 2.58235407 1.68203783] [-3.4681716 1.06982327 2.11788988]][[-1.8247149 ] [ 2.68546653] [ 1.41819501]] """ print sess.run(w1) print sess.run(w2)
损失函数
接下来我们看看上述代码中的损失函数:
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
cross_entropy
,交叉熵,用于计算两个概率分布之间的距离:
这里我们之所以可以使用它作为损失函数,是因为我们这里把二分类label
简单的看作值是1
的概率。
这里的p(x)
就是y_
,label
数据。这里的 logq(x)
就是tf.log(tf.clip_by_value(y, 1e-10, 1.0))
,预测的结果。tf.clip_by_value(y, 1e-10, 1.0)
是为了将y中的取值限制在[1e-10, 1.0]
。最后我们再使用tf.reduce_mean
对其求一个平均值,并取负数,便得到了损失函数。
2 1
- TensorFlow实战——入门
- tensorflow google实战 学习笔记——TensorFlow入门(1)
- tensorflow google实战 学习笔记——TensorFlow入门(2)
- tensorflow google实战 学习笔记——TensorFlow入门(3)
- TensorFlow实战——CNN
- TensorFlow实战——RNN
- TensorFlow入门—1
- TensorFlow实战:Chapter-2(TensorFlow入门)
- TensorFlow实战— —K-Means聚类
- TensorFlow实战— —K-Means聚类
- Tensorflow[实战篇]——Face Recognition
- TensorFlow实战——个性化推荐
- TensorFlow实战—mnist手写数字识别
- TensorFlow从入门到实战资料汇总
- 深度学习入门:Tensorflow实战Digit Recognizer
- TensorFlow入门(一)——了解和运行 TensorFlow
- TensorFlow学习之路——入门
- JavaWeb入门实战—Servlet
- python 之正则表达式
- 常用三种类别的IP地址
- Linux服务端编程经验
- Java设计模式:工厂模式
- Found libBaiduMapSDK_base_v4_3_0.so error
- TensorFlow实战——入门
- threejs中的坐标系
- maven 跳过单元测试打包
- 06-S3C2440学习之移植2012u-boot到S3C2440(移植过程一)新建单板+修改时钟+SDRAM+UART
- 银行家算法
- 解决SecureFXPortable上传文件到Linux服务器中文乱码问题
- Python+Selenium框架设计篇之1-什么是自动化测试框架
- BottomNavigationView结合ViewPager搭建流行UI框架
- bootstrap2.0与3.0可视化布局标签区别---3.0需手动改变标签