抱歉,你查看的文章不存在

13- 深度学习之神经网络核心原理与算法-TensorFlow介绍与框架挑选

TensorFlow以及TensorFlow的应用

支持深度学习的框架。torch caffe TensorFlow

简介

  • 使用图(Graph)来表示计算任务
  • 图中的节点被称为op(operation)
  • 一个op获取0个或多个tensor,执行计算,产生0个或多个tensor
  • 在会话(session)上下文中执行图
  • 使用张量(tensor)来表示数据
  • 通过变量(variable)来维护状态
  • 使用feed和fetch可以为任意的操作赋值或从中获取数据。

Tensor

mark

tensorflow代表数据的流动

具体例子

# 定义常量op
a = tf.constant(2)
b = tf.constant(3)

# 使用seesion 启动默认图
with tf.Session() as sess:
    print("a=2, b=3")
    print("常量相加: %i" % sess.run(a + b))
    print("常量相乘: %i" % sess.run(a * b))

必须在session中执行才会运行。

# 定义连个变量op占位符
a = tf.placeholder(tf.int16)
b = tf.placeholder(tf.int16)

# 定义2个op操作 加法 乘法
add = tf.add(a, b)
mul = tf.multiply(a, b)

with tf.Session() as sess:
    print("加法:%i" % sess.run(add, feed_dict={a: 2, b: 3}))
    print("乘法:%i" % sess.run(mul, feed_dict={a: 2, b: 3}))

TensorFlow中矩阵运算

# 1x2 矩阵常量op
matrix1 = tf.constant([[3., 3.]])

# 2x1 矩阵常量op
matrix2 = tf.constant([[2.], [2.]])

# 矩阵乘op
product = tf.matmul(matrix1, matrix2)

with tf.Session() as sess:
    result = sess.run(product)
    print(type(result))
    print(result)

运行结果:

<class 'numpy.ndarray'>
[[12.]]

如何选择好的框架

  • 性能方面
  • 社区活跃
  • 语言

函数,计算模型模块。底层实现语言。

torch caffe TensorFlow

相同情况下torch运算相对快一些。

活跃度说明有更多人在使用这个项目,贡献代码,提交bug。找到解决方案。

不管什么语言实现的框架,现在都支持python的接口。

TensorFlow 社区活跃

mark

TensorFlow在Stack Overflow上。语言上python2和3都可以。

TensorFlow对于多gpu,分布式支持好。充分利用多个工作站,多块显卡。

适合工程应用。

多环境与集群的支持

支持cpu 也支持gpu 设置可以运行在安卓

一颗cpu gpu的多个核心。一台机器的多gpu也支持

2016.4 Google发布了分布式的TensorFlow,能够支持在几百万台机器上进行并行的训练。

底层是由高性能的RPC库支持的。分布式的TensorFlow集群由一系列的任务组成。 这些任务的执行是在TensorFlow中进行图的计算。

每个任务会关联到一个TensorFlow的服务,这个服务就是用于创建TensorFlow会话,以及执行图计算的。

TensorFlow集群中也可以划分成一个或者多个的作业,每个作业包含一个或多个任务。 在一个TensorFlow集群中,通常一个任务是运行在一台机器上的,如果该机器有多块gpu,就可以把这个任务分配在该机器上运行多个任务。

由应用程序来控制,这多个任务在哪个gpu上运行。通常我们的深度学习模型是数据并行化的。

TensorFlow任务采用相同的训练模型在不同的小批量数据集上进行训练,然后在参数服务器上来更新模型的共享参数。

TensorFlow支持同步训练和异步训练两种训练模式。异步训练就是指在TensorFlow上每个节点的任务,它是作为独立的训练方式。不需要执行任何的操作。

mark

如上图,每个任务在每个节点上都是单独进行训练的,不需要协调工作。

同步训练的方式;

mark

同步训练方式每个节点的任务需要读取共享数据,并且执行并行化的梯度计算。 然后将所有的共享数据进行合并。

具体过程: 初始化一个模型的矩阵w 把一个批次的训练样本平均的分成若干等份。

图中就是分成三等份。分别给三个节点进行计算,然后进行正向传播。

在正向传播之后会得到若干个不同的梯度。在反向更新时,需要把这几个的他p传送到一起。求出平均梯度值。用平均梯度值来更新。

理论上来讲,可以在多台服务器上的多个gpu上共同运行。

你的网络不是足够大的话,那么这种并行计算的方式就不太经济。

因为参数在服务器之间的网络交互是需要时间的。传输时间反倒很常。

三台提高反倒不是很明显。(数据量和网络复杂度不够高)

TensorFlow线性回归实现

import tensorflow as tf
import numpy
import matplotlib.pyplot as plt
from numpy import random

设置我们的学习率等参数

# 训练参数
learning_rate = 0.01
training_epochs = 1000
display_step = 50 # 每隔50步打印一下训练数据

总共有多少个训练数据

# 训练数据
train_X = numpy.asarray([3.3, 4.4, 5.5, 6.71, 6.93, 4.168, 9.779, 6.182, 7.59, 2.167,
                         7.042, 10.791, 5.313, 7.997, 5.654, 9.27, 3.1])
train_Y = numpy.asarray([1.7, 2.76, 2.09, 3.19, 1.694, 1.573, 3.366, 2.596, 2.53, 1.221,
                         2.827, 3.465, 1.65, 2.904, 2.42, 2.94, 1.3])
# 总共有多少个训练数据
n_samples = train_X.shape[0]

定义两个占位符

# 定义两个变量op占位符,设置为浮点类型
X = tf.placeholder("float")
Y = tf.placeholder("float")

初始化w和b

# 初始化模型里所有的w和b
W = tf.Variable(random.random(), name="weight")
b = tf.Variable(random.random(), name="bias")

构造线性模型 & 均方误差

# 构造线性模型
pred = tf.add(tf.multiply(X, W), b)

# 均方误差
cost = tf.reduce_sum(tf.pow(pred - Y, 2)) / (2 * n_samples)

reduce_sum是对每一项累加求和。

# 'x' is [[1, 1, 1]
#         [1, 1, 1]]
# tf.reduce_sum(x) ==> 6
# tf.reduce_sum(x, 0) ==> [2, 2, 2]
# tf.reduce_sum(x, 1) ==> [3, 3]

对于每一列进行相加,对于每一行进行相加。

  • 使用梯度下降算法来优化我们的模型:
# 梯度下降
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

传入学习率,目的是最小化cost

TensorFlow里面规定在使用variable创建变量之后,在程序运行之前必须初始化变量。

# 初始化所有变量
init = tf.global_variables_initializer()

以上都只是描述了是怎么计算的,并没有真正的计算。

# 使用session 启用默认图
with tf.Session() as sess:
    sess.run(init)

    # 训练开始
    for epoch in range(training_epochs):
        for (x, y) in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict={X: train_X, Y: train_Y})

zip同时循环两个列表。TensorFlow会从optimizer主动顺腾摸瓜向上寻找的。

我们只需要运行最后的op, x和y的初始化feed_dict 填充数据

当前运行到了哪一轮,当前的损失值,当前的w当前的b。

        # 每个一个epoch打印一下结果
        if (epoch + 1) % display_step == 0:
            c = sess.run(cost, feed_dict={X: train_X, Y: train_Y})
            print("Epoch:", '%04d' % (epoch + 1), "cost=", "{:.9f}".format(c), \
                  "W=", sess.run(W), "b=", sess.run(b))

训练完毕之后的损失值

    print("Optimization Finished!")
    training_cost = sess.run(cost, feed_dict={X: train_X, Y: train_Y})
    print("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n')

画图。

# 图画
    plt.plot(train_X, train_Y, 'ro', label='Original data')
    plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
    plt.legend()
    plt.show()
    plt.savefig('linear_train.png')

    # 测试数据
    test_X = numpy.asarray([6.83, 4.668, 8.9, 7.91, 5.7, 8.7, 3.1, 2.1])
    test_Y = numpy.asarray([1.84, 2.273, 3.2, 2.831, 2.92, 3.24, 1.35, 1.03])

    print("Testing... (Mean square loss Comparison)")
    testing_cost = sess.run(
        tf.reduce_sum(tf.pow(pred - Y, 2)) / (2 * test_X.shape[0]),
        feed_dict={X: test_X, Y: test_Y})  # same function as cost above
    print("Testing cost=", testing_cost)
    print("Absolute mean square loss difference:", abs(
        training_cost - testing_cost))

    plt.plot(test_X, test_Y, 'bo', label='Testing data')
    plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
    plt.legend()
    plt.show()
    plt.savefig('linear_test.png')

mark

mark

解决使用 plt.savefig 保存图片时一片空白

savefig要在show之前。或者:

 fig = plt.gcf()
    plt.show()
    fig1.savefig('tessstttyyy.png', dpi=100)

gcf获取当前图片。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

有趣的Python

0 篇文章106 人订阅

相关文章

来自专栏杨熹的专栏

TensorFlow-3: 用 feed-forward neural network 识别数字

这一节讲了使用 MNIST 数据集训练并评估一个简易前馈神经网络(feed-forward neural network),input,output 和前两节是...

5220
来自专栏HT

电信网络拓扑图自动布局之总线

在前面《电信网络拓扑图自动布局》一文中,我们大体介绍了 HT for Web 电信网络拓扑图自动布局的相关知识,但是都没有深入地描述各种自动布局的用法,我们今天...

2998
来自专栏程序员的知识天地

Python学习,这有可能是最详细的PIL库基本概念文章了

PIL有如下几个模块:Image模块、ImageChops模块、ImageCrackCode模块、ImageDraw模块、ImageEnhance模块、Imag...

1143
来自专栏吉浦迅科技

DAY16:阅读纹理内存之纹理对象API

1095
来自专栏智能算法

深度学习三人行(第1期)---- TensorFlow爱之初体验

前面十个系列,我们一起学习了机器学习的相关知识,详情可在“智能算法”微信公众号中回复“机器学习”进行查看学习及代码实战。从该期开始,我们将一起学习深度学习相关知...

40814
来自专栏CreateAMind

合成动态视频效果及声音合成

图片大小限制,更多可访问 http://www.stat.ucla.edu/~jxie/STGConvNet/STGConvNet.html

1592
来自专栏瓜大三哥

基于FPGA的均值滤波(四)

基于FPGA的均值滤波(四) 之除法电路模块 假定求和结果为sum,计算后的均值为Average,则有 ? 可以通过上式的计算误差为: ? 以5x5的窗口为例,...

23410
来自专栏数值分析与有限元编程

有限元 | 梁单元有限元程序算例

之前发过一个梁单元有限元分析程序。在好友测试时发现一个问题,就是程序中的real型变量默认为kind=4,我们姑且称为单精度型。这样限制了程序的使用,在一些问题...

3218
来自专栏开发与安全

算法:Solutions for the Maximum Subsequence Sum Problem

The maximum subarray problem is the task of finding the contiguous subarray wit...

2088
来自专栏编程

隐马尔科夫模型 python 实现简单拼音输入法

关键时刻,第一时间送达! ? 在网上看到一篇关于隐马尔科夫模型的介绍,觉得简直不能再神奇,又在网上找到大神的一篇关于如何用隐马尔可夫模型实现中文拼音输入的博客(...

3650

扫码关注云+社区

领取腾讯云代金券