tensorflow入门(1)

关于 TensorFlow

TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。

关于数据流图(Data Flow Graph)

数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点” 一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。

windows下安装TensorFlow

python35 -m pip install --upgrade tensorflow

通过import tensorflow来查看是否安装成功,如果没有报错,则安装成功,否则安装失败。

但是真正运行的时候,会出现这样一个问题,

The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.

不知道为什么会这样,暂时没有找到更好的解决办法,只好通过以下方式把它屏蔽掉。

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'

例子:生成三维数据, 然后用平面拟合它

import tensorflow as tf
import numpy as np # 使用 NumPy 生成假数据(phony data), 总共 100 个点.
x_data = np.float32(np.random.rand(2, 100)) # 随机输入,横坐标
y_data = np.dot([0.100, 0.200], x_data) + 0.300 # 纵坐标 # 构造一个线性模型
b = tf.Variable(tf.zeros([1])) # 变量
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b # 矩阵乘法 # 最小化方差
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5) # 使用梯度下降法
train = optimizer.minimize(loss) # 初始化变量
# init = tf.initialize_all_variables() # 旧式初始化变量方法
init = tf.global_variables_initializer() # 新式初始化变量方法 # 启动图 (graph)
sess = tf.Session()
sess.run(init) # 拟合平面
for step in range(0, 201):
sess.run(train)
if step % 20 == 0:
print("次数:" + str(step) + " W=" + str(sess.run(W)) + " b=" + str(sess.run(b)))

程序运行结果:

次数:0 W=[[ 0.55211174 -0.32715654]] b=[ 0.62308812]
次数:20 W=[[ 0.16676502 0.045885 ]] b=[ 0.33775851]
次数:40 W=[[ 0.11121924 0.16110057]] b=[ 0.31255469]
次数:60 W=[[ 0.10111912 0.18986556]] b=[ 0.30423936]
次数:80 W=[[ 0.09974308 0.19725847]] b=[ 0.3014473]
次数:100 W=[[ 0.09976034 0.19922698]] b=[ 0.30049789]
次数:120 W=[[ 0.09988155 0.19977264]] b=[ 0.30017218]
次数:140 W=[[ 0.09995059 0.19993046]] b=[ 0.30005974]
次数:160 W=[[ 0.09998091 0.19997799]] b=[ 0.30002078]
次数:180 W=[[ 0.09999289 0.19999282]] b=[ 0.30000725]
次数:200 W=[[ 0.09999744 0.19999765]] b=[ 0.30000252]
[Finished in 1.7s]

tensorflow中的Session, 加减乘除, 类型转换

Session

import tensorflow as tf
# 并没有得到想要的结果
a = tf.add(3, 5)
print(a) # Session写法一
sess = tf.Session()
print(sess.run(a))
sess.close()
# Session写法二
with tf.Session() as sess:
print(sess.run(a))

程序输出结果:

Tensor("Add:0", shape=(), dtype=int32)
8
8

tensorflow的每个session是相互独立的:

W = tf.Variable(10)
sess1 = tf.Session()
sess2 = tf.Session()
sess1.run(W.initializer)
sess2.run(W.initializer)
print(sess1.run(W.assign_add(10))) # >> 20
print(sess2.run(W.assign_sub(2))) # >> 8
print(sess1.run(W.assign_add(100))) # >> 120
print(sess2.run(W.assign_sub(50))) # >> -42
sess1.close()
sess2.close()

加减乘除以及类型转换

上面是一个加法的示例,下面看看加减乘除的示例:

a = tf.add(5, 2)  # 加法:7
b = tf.subtract(10, 4) # 减法:6
c = tf.multiply(2, 5) # 乘法:10
d = tf.div(10, 5) # 除法:2
e = tf.subtract(tf.cast(tf.constant(2.0), tf.int32), tf.constant(1)) # 类型转换:1

常数类型(Constant types)

通过以下方式建立常数

tf.constant(value, dtype=None, shape=None, name='Const', verify_shape=False)

建立一维向量和矩阵,然后将它们乘起来:

>>> a = tf.constant([2, 2], name='a')
>>> b = tf.constant([[0, 1], [2, 3]], name='b')
>>> x = tf.multiply(a, b, name='dot_production')
>>> with tf.Session() as sess:
print(sess.run(x))
[[0, 2]
[4, 6]]

特殊常量的创建:

tensorflow的很多操作和numpy很像。

tf.zeros(shape, dtype=tf.float32, name=None)
tf.zeros_like(input_tensor, dtype=None, name=None, optimize=True)
tf.ones(shape, dtype=tf.float32, name=None)
tf.ones_like(input_tensor, dtype=None, name=None, optimize=True)
tf.fill(dims, value, name=None)

示例:

>>> sess = tf.Session()
>>> print(sess.run(tf.zeros(3)))
[ 0. 0. 0.]
>>> print(sess.run(tf.ones([2,3])))
[[ 1. 1. 1.]
[ 1. 1. 1.]]

创建序列:

tf.linspace(start, stop, num, name=None)
tf.range(start, limit=None, delta=1, dtype=None, name='range')

以上示例:

>>> tf.linspace(10.0, 13.0, 4)
[10.0, 11.0, 12.0, 13.0]
>>> tf.range(3, limit=18, delta=3)
[3, 6, 9, 12, 15]

注意这里的序列不能迭代:

for i in tf.range(4): # TypeError

产生随机数:

tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None,
name=None)
tf.random_uniform(shape, minval=0, maxval=None, dtype=tf.float32, seed=None,
name=None)
tf.random_shuffle(value, seed=None, name=None)
tf.random_crop(value, size, seed=None, name=None)
tf.multinomial(logits, num_samples, seed=None, name=None)
tf.random_gamma(shape, alpha, beta=None, dtype=tf.float32, seed=None, name=None)

tensorflow和numpy的数据类型可以通用,比如:

>>> import numpy as np
>>> tf.ones([2, 2], np.float32)
[[1.0, 1.0], [1.0, 1.0]]

变量(Variable)

在计算图的定义当中,如果常量过多,会使得加载计算图变得非常慢,同时常量的值不可改变,所以需要引入变量。

a = tf.Variable(2, name='scalar')
b = tf.Variable([2, 3], name='vector')
c = tf.Variable([[0, 1], [2, 3]], name='matrix')
d = tf.Variable(tf.zeros([784, 10]), name='weight')

变量的几个操作:

x = tf.Variable()
x.initializer # 初始化
x.eval() # 读取里面的值
x.assign() # 分配值给这个变量

变量初始化

在使用变量之前必须对其进行初始化,初始化可以看作是一种变量的分配值操作。最简单的初始化方式是一次性初始化所有的变量

init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)

也可以对某一部分变量进行初始化:

init_ab = tf.variable_initializer([a, b], name='init_ab')
with tf.Session() as sess:
sess.run(init_ab)

或者是对某一个变量进行初始化:

w = tf.Variable(tf.zeros([784, 10]))
with tf.Session() as sess:
sess.run(w.initializer)

打印变量

打印变量值的两种方法:

w = tf.Variable(tf.truncated_normal([10, 10], name='normal'))
with tf.Session() as sess:
sess.run(w.initializer)
print(w.eval()) # 方法一
print(sess.run(w)) # 方法二

给变量分配值

import tensorflow as tf

# 没有run assign
w = tf.Variable(10)
w.assign(100)
with tf.Session() as sess:
sess.run(w.initializer)
print(w.eval()) # run assign
w = tf.Variable(10)
wa = w.assign(100)
with tf.Session() as sess:
sess.run(w.initializer)
print(w.eval())
print(sess.run(wa))

以上代码有三个print,程序运行结果如下:

10
10
100
[Finished in 1.5s]

参考

http://www.tensorfly.cn/

https://sherlockliao.github.io/2017/08/21/cs20si2/

#tensorflow入门(1)的更多相关文章

  1. (转)TensorFlow 入门

        TensorFlow 入门 本文转自:http://www.jianshu.com/p/6766fbcd43b9 字数3303 阅读904 评论3 喜欢5 CS224d-Day 2: 在 Da ...

  2. TensorFlow 入门之手写识别(MNIST) softmax算法

    TensorFlow 入门之手写识别(MNIST) softmax算法 MNIST flyu6 softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...

  3. FaceRank,最有趣的 TensorFlow 入门实战项目

    FaceRank,最有趣的 TensorFlow 入门实战项目 TensorFlow 从观望到入门! https://github.com/fendouai/FaceRank 最有趣? 机器学习是不是 ...

  4. TensorFlow入门(五)多层 LSTM 通俗易懂版

    欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @creat_date: 2017-03-09 前言: 根据我本人学习 TensorFlow 实现 LSTM 的经 ...

  5. TensorFlow入门,基本介绍,基本概念,计算图,pip安装,helloworld示例,实现简单的神经网络

    TensorFlow入门,基本介绍,基本概念,计算图,pip安装,helloworld示例,实现简单的神经网络

  6. [译]TensorFlow入门

    TensorFlow入门 张量(tensor) Tensorflow中的主要数据单元是张量(tensor), 一个张量包含了一组基本数据,可以是列多维数据.一个张量的"等级"(ra ...

  7. 转:TensorFlow入门(六) 双端 LSTM 实现序列标注(分词)

    http://blog.csdn.net/Jerr__y/article/details/70471066 欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @cr ...

  8. TensorFlow入门(四) name / variable_scope 的使

    name/variable_scope 的作用 欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @creat_date: 2017-03-08 refer to: ...

  9. TensorFlow入门教程集合

    TensorFlow入门教程之0: BigPicture&极速入门 TensorFlow入门教程之1: 基本概念以及理解 TensorFlow入门教程之2: 安装和使用 TensorFlow入 ...

随机推荐

  1. 201521123064 《Java程序设计》第6周学习总结

    1. 本章学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  2. 让你的python程序同时兼容python2和python3

    python邮件列表里有人发表言论说「python3在10内都无法普及」.在我看来这样的观点有些过于悲观,python3和python2虽然不兼容,但他们之间差别并没很多人想像的那么大.你只需要对自己 ...

  3. 201521123010 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 常用异常: ①题目5-1 1.1 截图你的提交结果(出现学号) A: 1.2 ...

  4. 201521123065《java程序设计》第9周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 出现的异 ...

  5. 201521123102 《Java程序设计》第12周学习总结

    1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2.书面作业 将Student对象(属性:int id, String name,int age,double ...

  6. lintcode.46 主元素

    给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一. 注意事项 You may assume that the array is non-empty and the ma ...

  7. SpringMVC第二篇【过滤编码器、注解开发、requestMapping、业务方法与传统参数】

    SpringMVC过滤编码器 在SpringMVC的控制器中,如果没有对编码进行任何的操作,那么获取到的中文数据是乱码! 即使我们在handle()方法中,使用request对象设置编码也不行!原因也 ...

  8. 【Spring】Spring的bean装配

    前言 bean是Spring最基础最核心的部分,Spring简化代码主要是依赖于bean,下面学习Spring中如何装配bean. 装配bean Spring在装配bean时非常灵活,其提供了三种方式 ...

  9. 手机管家iPhoneX的适配总结

    WeTest 导读 随着苹果发布会的结束,Xcode的GM版也上线了,也意味着iPhoneX适配之旅的开始. 一.设计关注篇 注意设计的基本原则:(苹果呼吁的) 规格原帖:https://develo ...

  10. 11 Linear Models for Classification

    一.二元分类的线性模型 线性分类.线性回归.逻辑回归 可视化这三个线性模型的代价函数 SQR.SCE的值都是大于等于0/1的 理论分析上界 将回归应用于分类 线性回归后的参数值常用于pla/pa/lo ...