tensorflow、pytorch、keras框架的区别?
1.简介
PyTorch 最大优势是建立的神经网络是动态的, 对比静态的 Tensorflow, 它能更有效地处理一些问题, 比如说 RNN 变化时间长度的输出。PyTorch的源码只有TensorFlow的十分之一左右,更少的抽象、更直观的设计使得PyTorch的源码十分易于阅读。
tensorflow2.0是tensorflow新发布的版本,从简单、强大、可扩展三个层面进行了重新设计。特别是在简单化方面,TensorFlow 2.0 提供更简化的 API、注重 Keras、结合了 Eager execution。
2.根据写法来理解:
1/2+1/2^2+1/2^3+...+1/2^50
(1)python
x=0
y=1
for iteration in range(50):
x=x+y
y=y/2
print(x)
(2)tensorflow1.0
import tensorflow as tf
print(tf.__version__)
x=tf.Variable(0.)
y=tf.Variable(1.)
#x=x+y
add_op=x.assign(x+y)
#y=y/2
div_op=y.assign(y/2)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for iteration in range(50):
sess.run(add_op)
sess.run(div_op)
print(x.eval())
(3)pytorch
import torch
print(torch.__version__)
x=torch.Tensor([0.])
y=torch.Tensor([1.])
for iteration in range(50):
x=x+y
y=y/2
print(x)
(4)tensorflow2.0
这里,注意Tensorflow2.0的安装:https://www.cnblogs.com/xiaosongshine/p/11615639.html
import tensorflow as tf
#tf.enable_eager_execution()
print(tf.__version__)
x=tf.constant(0.)
y=tf.constant(1.)
for iteration in range(50):
x=x+y
y=y/2
print(x.numpy())
3.理解tensorflow前后的静态图和动态图
TensorFlow之前是静态图,即必须把所有的操作以及网络结构定义好,最后才执行,是分开的。后来有了动态图功能,即Eager Execution 。
动态计算意味着程序将按照我们编写命令的顺序进行执行。这种机制将使得调试更加容易,并且也使得我们将大脑中的想法转化为实际代码变得更加容易。而静态计算则意味着程序在编译执行时将先生成神经网络的结构,然后再执行相应操作。而静态计算是通过先定义后运行的方式,之后再次运行的时候就不再需要重新构建计算图,所以速度会比动态图更快。从理论上讲,静态计算这样的机制允许编译器进行更大程度的优化,但是这也意味着你所期望的程序与编译器实际执行之间存在着更多的代沟。这也意味着,代码中的错误将更加难以发现(比如,如果计算图的结构出现问题,你可能只有在代码执行到相应操作的时候才能发现它)。
动态图、静态图写法:看tensorflow和pytorch就行。
(1)可以看到 TensorFlow 需要将整个图构建成静态的,换句话说,每次运行的时候图都是一样的,是不能够改变的,所以不能直接使用 Python 的 while 循环语句,需要使用辅助函数 tf.while_loop
写成 TensorFlow 内部的形式。
# tensorflow
import tensorflow as tf
first_counter = tf.constant(0)
second_counter = tf.constant(10)
# tensorflow
import tensorflow as tf
first_counter = tf.constant(0)
second_counter = tf.constant(10)
def cond(first_counter, second_counter, *args):
return first_counter < second_counter
def body(first_counter, second_counter):
first_counter = tf.add(first_counter, 2)
second_counter = tf.add(second_counter, 1)
return first_counter, second_counter
c1, c2 = tf.while_loop(cond, body, [first_counter, second_counter])
with tf.Session() as sess:
counter_1_res, counter_2_res = sess.run([c1, c2])
print(counter_1_res)
print(counter_2_res)
(2)可以看到 PyTorch 的写法跟 Python 的写法是完全一致的,没有任何额外的学习成本.
# pytorch
import torch
first_counter = torch.Tensor([0])
second_counter = torch.Tensor([10])
while (first_counter < second_counter)[0]:
first_counter += 2
second_counter += 1
print(first_counter)
print(second_counter)
为什么要用图?
(1)节省资源、高效运算
我么只需要运算需要的依赖项,不需要的不进行运算。
(2)把整个运算分解成子环节,方便自动求导;
(3)对分布式运算友好,计算工作可以分给多个GPU、CPU,或者多个设备运算。
(4)很多机器学习的模型,本身就是适用组织成 图的格式
4.结论
(1)PyTorch:
更有利于研究人员、爱好者、小规模项目等快速搞出原型。
选用pytorch的原因:
PyTorch是Python!(简单、易用、开发效率快)
无论PyTorch接管了多少研究工作,TensorFlow仍会为生产使用量起主导作用(部署的劣势)
(2)Tensorflow1.0:
静态图,难以调试;更适合大规模部署,特别是需要跨平台和嵌入式部署时。嵌入式用tensorflow。
(3)Tensorflow2.0:
动态图,python自带调试的工具
Tensorflow相比于Pytorch的序列化与部署支持的更加广泛
(4)Keras:
Keras本身并不是一个框架,而是一个位于其他深度学习框架之上的高级API。目前它支持TensorFlow、Theano和CNTK。
Keras的优点在于它的易用性。这是迄今为止最容易上手并快速运行的框架。定义神经网络是非常直观的,因为使用API可以将层定义为函数。
选用keras的原因:
学习友好,开发效率高。
【参考链接】
https://zhuanlan.zhihu.com/p/28636490
https://blog.csdn.net/weixin_45670288/article/details/103748668