文档章节

TensorFlow .NET 队列操作

HaipingChen
 HaipingChen
发布于 09/22 00:32
字数 1410
阅读 100
收藏 0

ThensorFlow能够并行处理多个任务,而队列是一种强大的异步计算机制。 如果我们拥有大型数据集,则可以大大加快模型的训练过程。 当以小批量读取,预处理和提取我们的训练数据时,此功能特别方便。 能够对我们的模型进行专业且高性能的训练的秘诀是使用TensorFlow提供的排队操作。 TensorFlow已经实现了4种类型的队列:FIFOQueue,PaddingFIFOQueue,PriorityQueue和RandomShuffleQueue。
在这里插入图片描述

就像TensorFlow中的所有操作一样,队列也是计算图中的一个节点。 它是一个有状态的节点,就像变量一样:其他节点可以修改其内容,特别是节点可以将新元素加入到队列,或从队列中弹出现有元素。

为了开始学习队列操作,让我们先从一个简单的示例开始。 我们将创建一个“先进先出”队列(FIFOQueue)并用数字填充。 然后,我们将构建一个计算图,该图将一个元素从队列中移出,然后将一个元素添加到该项目中,最后将其放回队列的末尾。

[TestMethod]
public void FIFOQueue()
{
	// create a first in first out queue with capacity up to 2
	// and data type set as int32
	var queue = tf.FIFOQueue(2, tf.int32);
	// init queue, push 2 elements into queue.
	var init = queue.enqueue_many(new[] { 10, 20 });
	// pop out the first element
	var x = queue.dequeue();
	// add 1
	var y = x + 1;
	// push back into queue
	var inc = queue.enqueue(y);

	using (var sess = tf.Session())
	{
		// init queue
		init.run();

		// pop out first element and push back calculated y
		(int dequeued, _) = sess.run((x, inc));
		Assert.AreEqual(10, dequeued);

		(dequeued, _) = sess.run((x, inc));
		Assert.AreEqual(20, dequeued);

		(dequeued, _) = sess.run((x, inc));
		Assert.AreEqual(11, dequeued);

		(dequeued, _) = sess.run((x, inc));
		Assert.AreEqual(21, dequeued);
        
		// thread will hang or block if you run sess.run(x) again
		// until queue has more element.
	}
}



Enqueue,_EnqueueMany_和_Dequeue_是特殊的节点。他们使用一个指向队列的指针而不是普通值,从而允许他们对其进行更改。我首先创建一个最大为2的FIFOQueue队列,然后将两个值放入队列。然后,我立即尝试从中取出一个值并将其分配给y,在这里我只需将1添加到已出列的变量。接下来,我们开始一个会话并运行。运行几次该操作后,队列将为空-如果尝试再次运行该操作,则程序的主线程将挂起或阻塞-这是因为它将等待另一个操作运行到将更多值放入队列。

FIFOQueue
创建一个队列,以先进先出的顺序使元素出队。 FIFO队列具有有限的容量;支持多个并发的生产者和消费者;并提供一次精确消费。 FIFOQueue包含最多容量元素的列表。每个元素都是张量的定长元组,其张量类型由dtypes描述,其形状可选地由shapes参数描述。

PaddingFIFOQueue
一个FIFOQueue通过填充支持批量可变大小张量。 PaddingFIFOQueue可以包含具有动态形状的组件,同时还支持dequeue_many。 PaddingFIFOQueue最多可容纳一个容量元素列表。每个元素都是张量的定长元组,其张量由dtypes描述,其形状由shapes参数描述。

PriorityQueue
一个按优先级出队元素的队列实现。 PriorityQueue具有有限的容量;支持多个并发的生产者和消费者;并提供一次精确的投放。 PriorityQueue包含最多容量元素的列表。每个元素都是张量的定长元组,其张量类型由类型描述,其形状可选地由shapes参数描述。

RandomShuffleQueue
一个以随机顺序使元素出队的队列实现。 RandomShuffleQueue具有有限的容量;支持多个并发的生产者和消费者;并提供一次精确的投放。 RandomShuffleQueue包含最多容量元素的列表。每个元素都是张量的定长元组,其张量类型由dtypes描述,其形状可选地由shapes参数描述。

队列方法必须与队列在同一设备上运行。 FIFOQueue和RandomShuffleQueue是重要的TensorFlow对象,用于在图形中异步计算张量。例如,典型的输入体系结构是使用RandomShuffleQueue为训练模型准备输入:

  • 多个线程准备培训示例并将其放入队列。
  • 训练线程执行训练操作,以使迷你批处理从队列中出队。

这种架构体系结构简化了输入管道的构造。

查看C#程序代码

在上面的示例中,一旦队列里没有元素,您必须在程序被阻止时终止程序。很显然,这不是很有用。我们真正想要的事情是,只要队列为空或将要为空,我们的程序就可以重新加载或排队更多的值。我们可以通过在上面的代码中再次明确运行enqueue_op来重新加载值,从而解决此问题。但是,对于大型,更实际的程序,这显然不可行。幸运的是,TensorFlow有一个解决方案。

TensorFlow提供了两个类来帮助执行多线程任务:tf.Coordinator和tf.QueueRunner。有两个类可以一起使用。 Coordinator类可帮助多个线程停在一起并将异常报告给主线程。 QueueRunner类用于创建多个线程,以将张量推入同一队列。

© 著作权归作者所有

HaipingChen
粉丝 12
博文 28
码字总数 11779
作品 3
东城
架构师
私信 提问
Tensorflow 入门学习7.TensorFlow的队列

版权声明:(谢厂节的博客)博主文章绝大部分非原创,转载望留链接。 https://blog.csdn.net/xundh/article/details/82765006 本节学习资源来自《TensorFlow深度学习应用实践》 TensorFlow 队...

谢厂节
2018/09/18
0
0
深度学习之Tensorflow | 我是这样入门的

跟其他很多想学这门技术的同学一样,刚开始也是很懵逼,不知如何开始下手;于是网上搜索各种学习路线,其中Andrew Ng的机器学习课在很多地方被推荐。于是乎——虽然是英语的,但也图文并茂,...

叶业力
2018/07/27
0
0
基于 TensorFlow 、OpenCV 和 Docker 的实时视频目标检测

雷锋网(公众号:雷锋网)按:本文为雷锋网字幕组编译的技术博客,原标题 Real-time and video processing object detection using Tensorflow, OpenCV and Docker,作者为 Léo Beaucourt 。 ...

雷锋字幕组
2018/07/23
0
0
教程 | 如何使用Docker、TensorFlow目标检测API和OpenCV实现实时目标检测和视频处理

  选自TowardsDataScience   作者:Léo Beaucourt   机器之心编译   参与:李诗萌、路雪      本文展示了如何使用 Docker 容器中的 TensorFlow 目标检测 API,通过网络摄像头执...

机器之心
2018/04/20
0
0
十图详解tensorflow数据读取机制(附代码)【转】

在学习tensorflow的过程中,有很多小伙伴反映读取数据这一块很难理解。确实这一块官方的教程比较简略,网上也找不到什么合适的学习材料。今天这篇文章就以图片的形式,用最简单的语言,为大家...

武耀文
2017/07/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java发送html模板的高逼格邮件

最近做了一个监测k8s服务pod水平伸缩发送邮件的功能(当pod的cpu/内存达到指定阈值后会水平扩展出多个pod、或者指定时间内pod数应扩展到指定数量),一开始写了个格式很low的邮件,像下面这样...

码农实战
18分钟前
6
0
php-fpm配置文件详解/MariaDB密码重置、慢查询日志

来源:https://blog.csdn.net/Powerful_Fy php-fpm主配置文件路径:/usr/local/php-fpm/etc/php-fpm.conf #位于安装php安装目录下的etc/目录中,该文件中最后一行将配置文件指向:include=/...

asnfuy
23分钟前
4
0
川普给埃尔多安和内堪尼亚胡的信

任性 https://twitter.com/netanyahu/status/1186647558401253377 https://edition.cnn.com/2019/10/16/politics/trump-erdogan-letter/index.htm...

Iridium
44分钟前
12
0
golang-mysql-原生

db.go package mainimport ("database/sql""time"_ "github.com/go-sql-driver/mysql")var (db *sql.DBdsn = "root:123456@tcp(127.0.0.1:3306)/test?charset=u......

李琼涛
今天
5
0
编程作业20191021092341

1编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时 间。使用#define或const创建一个表示60的符号常量或const变量。通过while 循环让用户重复输入值,直到用户输入小于或等于0的值...

1李嘉焘1
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部