基础
深度学习介绍
深度学习,如深度神经网络、卷积神经网络和递归神经网络已被应用计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域。并获取了极好的效果。
tensorflow特点
1、真正的可移植性
引入各种计算设备的支持包括CPU/GPU/TPU,以及能够很好地运行在移动端,
如安卓设备、ios、树莓派等等
2、多语言支持
Tensorflow 有一个合理的c++使用界面,也有一个易用的python使用界面来构建和
执行你的graphs,你可以直接写python/c++程序。
3、高度的灵活性与效率
TensorFlow是一个采用数据流图(data flow graphs),用于数值计算的开源软件库
能够灵活进行组装图,执行图。随着开发的进展,Tensorflow的效率不算在提高
4、支持
TensorFlow 由谷歌提供支持,谷歌投入了大量精力开发 TensorFlow,它希望
TensorFlow 成为机器学习研究人员和开发人员的通用语言
cpu与gpu
cpu:运行操作系统,主要处理业务,计算能力不是特别突出
gpu:专门为计算设计的,计算部件多
tensorflow
tensorflow中的图
数据流图
tensorflow中的数据是tensor(张量)
flow是流动的意思,tensorflow就是说数据在整张图中进行运算,流动
图中的方块被称之为节点(operation):专门进行运算。所有操作都是一个op
图(Graph)的概念:你的整个程序的结构
图默认已经注册,一组表示 tf.Operation计算单位的对象和tf.Tensor表示操作之间流动的数据单元的对象
会话:运算程序的图,当你定义好图之后,还需要进行运算才能得出结果。Session的运算只能运算一张图
图的获取调用:
- tf.get_default_graph()
- op、sess或者tensor 的graph属性
默认的这张图相当于给程序分配一个内存,
tensorflow进阶
在机器学习中,io操作并不频繁,大多都是计算密集型
图
图的创建
tf.Graph()
import tensorflow as tf
#创建一张图
g = tf.Graph()
print(g)
with g.as_default(): #使用这张图,在这个上下文环境中使用的图和其他的图互不干扰
c = tf.constant(11.0)
print(c.graph)
op
op:只要使用tensorflow的API定义的函数都是OP
tensor:指代的就是数据
会话
tensorflow分为前端系统和后端系统
前端系统:定义程序的图的结构
后端系统:运算图结构
会话的作用
- 运行图的结构(只能运算一张图,可以在会话中指定运行哪张图)
- 分配资源计算
- 掌握资源(变量、队列、线程),会话结束,这些资源就不能再使用
Session.run()即运行整张图,如果不用上下文管理器就需要手动close
import tensorflow as tf
#实现一个加法运算
a = tf.constant(5.0)
b = tf.constant(0.4)
mysum = tf.add(a, b)
print(mysum)
print(tf.get_default_graph())
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess: #Session的这个参数可以让我们知道op在那个设备上运行(比如add是在哪个cpu上执行的)
print(sess.run(mysum))
print(a.graph)
print(mysum.eval()) #也可以得到数据的值
print(mysum.graph)
print(sess.graph)
run方法
import tensorflow as tf
#实现一个加法运算
a = tf.constant(5.0)
b = tf.constant(0.4)
mysum = tf.add(a, b)
"""重载机制,默认会给运算符重载成op类型"""
var1 = 2.0
sum2 = a + var1
"""end"""
"""
训练模型,实时的提供数据去进行训练
placeholder是一个占位符,先占个位置,运行的时候再提供数据。与feed_dict结合使用
"""
plt = tf.placeholder(dtype=tf.float32, shape=[2,3]) #占位符也是一个tensor。这里参数的意思是将来的数据类型是tf.float32,其shape我2行3列的tensor
print("plt的类型:\n",type(plt))
plt2 = tf.placeholder(dtype=tf.float32, shape=[None, 3]) #None表示形状不固定,这里表示任意行,3列
"""end"""
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
print(sess.run([a, b, mysum]))
print(sess.run(plt, feed_dict={plt:[[1,2,3],[4,5,6]]})) #将feed_dict的数据给占位符
print(sess.run(plt2, feed_dict={plt2:[[1,2,3],[4,5,6]]}))
张量
numpy中的数组都是ndarray类型。矩阵运算通过np.dot()实现
矩阵必须是二维的
tensorflow中的数据是tensor类型的,而tensorflow依赖的是numpy,所以将ndarray封装成了tensor
张量的阶和数据类型
阶
与数组的维度相似
数据类型
ps:tf.float64实际没有意思的,因为一般不会让一个数字占用那么大的内存空间;我们常用的数据类型一般为表格中bool及其之前的类型
张量的属性
shape:
- 如果是0维的,就是();
- 如果是1维,(数字);
- 2维,(数字1, 数字2);
- 如果某个没有确定,(?,数字);
- 3维,(数字1, 数字2, 数字3)
形状的改变
- 对于静态形状来说,一旦形状固定,就不能再次设置静态形状,对于有None维度的tensor,也不能跨维度修改
- 动态形状可以去创建一个新的张量,但是元素的数量应该匹配
API
import tensorflow as tf
zero = tf.zeros([3,4], tf.float32)
one = tf.ones([3,4], dtype=tf.float32, name="One")
fill_tensor = tf.fill([2,3], value=1)
cst = tf.constant(value=3, dtype=tf.float32)
with tf.Session() as sess:
print(sess.run(zero))
print(sess.run(one))
print(sess.run(fill_tensor))
print(sess.run(cst))
"""运行结果
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1 1 1]
[1 1 1]]
3.0
随机张量
mean:平均值
stddev:标准差
改变张量的类型
常用的为cast
concat:连接两个张量
import tensorflow as tf
a = [[1, 2, 3], [4, 5, 6]]
b = [[7, 8, 9], [10, 11, 12]]
ret = tf.concat([a, b], axis=0) #0就是按照行合并
with tf.Session() as sess:
print(sess.run(ret))
可视化学习
变量
变量(tf.Variable)是也是一种op,是一种特殊的张量,能够进行存储持久化(保存在文件中),它的值就是张量,默认被训练
当定义一个变量op的时候,一定要在会话当中去运行初始化
import tensorflow as tf
a = tf.constant([1,2,3,4,5])
var = tf.Variable(tf.random_normal([2,3], mean=0.0, stddev=1.0))
print(a, var) #都是Tensor
#变量必须进行初始化,不然var里面是没有值的。比如下面的run会报错
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
#必须运行初始化op
sess.run(init_op)
print(sess.run([a, var]))
可视化
定义图结构——》 序列化文件成events事件文件——》通过tensorboard工具把文件里面的数据读取出来——》将读取出来的文件显示到web界面
import tensorflow as tf
a = tf.constant([1,2,3,4,5])
var = tf.Variable(tf.random_normal([2,3], mean=0.0, stddev=1.0))
print(a, var) #都是Tensor
#变量必须进行初始化,不然var里面是没有值的。比如下面的run会报错
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
#必须运行初始化op
sess.run(init_op)
#把程序的图结构写入事件文件
filewriter = tf.summary.FileWriter("./", graph=sess.graph) #保存的文件一般以主机名结尾
然后在terminal里面运行:tensorboard --logdir=“事件文件的路径(不包括文件名)”,默认显示最新的文件
图中符号的意义:
所有的op都有name,其作用为在tensorboard使用的使用显示明细,可以让相同op名字的进行区分
增加变量显示