| @@ -58,6 +58,32 @@ Creates a queue that dequeues elements in a first-in first-out order. A `FIFOQue | |||
| A FIFOQueue that supports batching variable-sized tensors by padding. A `PaddingFIFOQueue` may contain components with dynamic shape, while also supporting `dequeue_many`. A `PaddingFIFOQueue` holds a list of up to `capacity` elements. Each element is a fixed-length tuple of tensors whose dtypes are described by `dtypes`, and whose shapes are described by the `shapes` argument. | |||
| ```chsarp | |||
| [TestMethod] | |||
| public void PaddingFIFOQueue() | |||
| { | |||
| var numbers = tf.placeholder(tf.int32); | |||
| var queue = tf.PaddingFIFOQueue(10, tf.int32, new TensorShape(-1)); | |||
| var enqueue = queue.enqueue(numbers); | |||
| var dequeue_many = queue.dequeue_many(n: 3); | |||
| using(var sess = tf.Session()) | |||
| { | |||
| sess.run(enqueue, (numbers, new[] { 1 })); | |||
| sess.run(enqueue, (numbers, new[] { 2, 3 })); | |||
| sess.run(enqueue, (numbers, new[] { 3, 4, 5 })); | |||
| var result = sess.run(dequeue_many[0]); | |||
| Assert.IsTrue(Enumerable.SequenceEqual(new int[] { 1, 0, 0 }, result[0].ToArray<int>())); | |||
| Assert.IsTrue(Enumerable.SequenceEqual(new int[] { 2, 3, 0 }, result[1].ToArray<int>())); | |||
| Assert.IsTrue(Enumerable.SequenceEqual(new int[] { 3, 4, 5 }, result[2].ToArray<int>())); | |||
| } | |||
| } | |||
| ``` | |||
| #### PriorityQueue | |||
| A queue implementation that dequeues elements in prioritized order. A `PriorityQueue` has bounded capacity; supports multiple concurrent producers and consumers; and provides exactly-once delivery. A `PriorityQueue` holds a list of up to `capacity` elements. Each element is a fixed-length tuple of tensors whose dtypes are described by `types`, and whose shapes are optionally described by the `shapes` argument. | |||
| @@ -93,6 +119,28 @@ public void PriorityQueue() | |||
| A queue implementation that dequeues elements in a random order. A `RandomShuffleQueue` has bounded capacity; supports multiple concurrent producers and consumers; and provides exactly-once delivery. A `RandomShuffleQueue` holds a list of up to `capacity` elements. Each element is a fixed-length tuple of tensors whose dtypes are described by `dtypes`, and whose shapes are optionally described by the `shapes` argument. | |||
| ```csharp | |||
| [TestMethod] | |||
| public void RandomShuffleQueue() | |||
| { | |||
| var queue = tf.RandomShuffleQueue(10, min_after_dequeue: 1, dtype: tf.int32); | |||
| var init = queue.enqueue_many(new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); | |||
| var x = queue.dequeue(); | |||
| string results = ""; | |||
| using (var sess = tf.Session()) | |||
| { | |||
| init.run(); | |||
| foreach(var i in range(9)) | |||
| results += (int)sess.run(x) + "."; | |||
| // output in random order | |||
| // 1.2.3.4.5.6.7.8.9. | |||
| } | |||
| } | |||
| ``` | |||
| Queue methods must run on the same device as the queue. `FIFOQueue` and `RandomShuffleQueue` are important TensorFlow objects for computing tensor asynchronously in a graph. For example, a typical input architecture is to use a `RandomShuffleQueue` to prepare inputs for training a model: | |||
| @@ -108,5 +108,20 @@ namespace Tensorflow | |||
| new[] { shape ?? new TensorShape() }, | |||
| shared_name: shared_name, | |||
| name: name); | |||
| public RandomShuffleQueue RandomShuffleQueue(int capacity, | |||
| int min_after_dequeue, | |||
| TF_DataType dtype, | |||
| TensorShape shape = null, | |||
| int? seed = null, | |||
| string shared_name = null, | |||
| string name = "random_shuffle_queue") | |||
| => new RandomShuffleQueue(capacity, | |||
| min_after_dequeue: min_after_dequeue, | |||
| new[] { dtype }, | |||
| new[] { shape ?? new TensorShape() }, | |||
| seed: seed, | |||
| shared_name: shared_name, | |||
| name: name); | |||
| } | |||
| } | |||
| @@ -1,4 +1,20 @@ | |||
| using System; | |||
| /***************************************************************************** | |||
| Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
| Licensed under the Apache License, Version 2.0 (the "License"); | |||
| you may not use this file except in compliance with the License. | |||
| You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| @@ -1,4 +1,20 @@ | |||
| using System; | |||
| /***************************************************************************** | |||
| Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
| Licensed under the Apache License, Version 2.0 (the "License"); | |||
| you may not use this file except in compliance with the License. | |||
| You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| @@ -1,4 +1,20 @@ | |||
| using System; | |||
| /***************************************************************************** | |||
| Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
| Licensed under the Apache License, Version 2.0 (the "License"); | |||
| you may not use this file except in compliance with the License. | |||
| You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| @@ -1,4 +1,20 @@ | |||
| using System; | |||
| /***************************************************************************** | |||
| Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
| Licensed under the Apache License, Version 2.0 (the "License"); | |||
| you may not use this file except in compliance with the License. | |||
| You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| @@ -1,24 +1,53 @@ | |||
| using System; | |||
| /***************************************************************************** | |||
| Copyright 2018 The TensorFlow.NET Authors. All Rights Reserved. | |||
| Licensed under the Apache License, Version 2.0 (the "License"); | |||
| you may not use this file except in compliance with the License. | |||
| You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| ******************************************************************************/ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| namespace Tensorflow.Queues | |||
| { | |||
| /// <summary> | |||
| /// Create a queue that dequeues elements in a random order. | |||
| /// </summary> | |||
| public class RandomShuffleQueue : QueueBase | |||
| { | |||
| public RandomShuffleQueue(int capacity, | |||
| int min_after_dequeue, | |||
| TF_DataType[] dtypes, | |||
| TensorShape[] shapes, | |||
| string[] names = null, | |||
| int? seed = null, | |||
| string shared_name = null, | |||
| string name = "randomshuffle_fifo_queue") | |||
| string name = "random_shuffle_queue") | |||
| : base(dtypes: dtypes, shapes: shapes, names: names) | |||
| { | |||
| _queue_ref = gen_data_flow_ops.padding_fifo_queue_v2( | |||
| var(seed1, seed2) = random_seed.get_seed(seed); | |||
| if (!seed1.HasValue && !seed2.HasValue) | |||
| (seed1, seed2) = (0, 0); | |||
| _queue_ref = gen_data_flow_ops.random_shuffle_queue_v2( | |||
| component_types: dtypes, | |||
| shapes: shapes, | |||
| capacity: capacity, | |||
| min_after_dequeue: min_after_dequeue, | |||
| seed: seed1.Value, | |||
| seed2: seed2.Value, | |||
| shared_name: shared_name, | |||
| name: name); | |||
| @@ -93,6 +93,25 @@ namespace Tensorflow | |||
| return _op.output; | |||
| } | |||
| public static Tensor random_shuffle_queue_v2(TF_DataType[] component_types, TensorShape[] shapes, | |||
| int capacity = -1, int min_after_dequeue = 0, int seed = 0, int seed2 = 0, | |||
| string container = "", string shared_name = "", string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("RandomShuffleQueueV2", name, new | |||
| { | |||
| component_types, | |||
| shapes, | |||
| capacity, | |||
| min_after_dequeue, | |||
| seed, | |||
| seed2, | |||
| container, | |||
| shared_name | |||
| }); | |||
| return _op.output; | |||
| } | |||
| public static Operation queue_enqueue(Tensor handle, Tensor[] components, int timeout_ms = -1, string name = null) | |||
| { | |||
| var _op = _op_def_lib._apply_op_helper("QueueEnqueue", name, new | |||
| @@ -92,5 +92,25 @@ namespace TensorFlowNET.UnitTest | |||
| Assert.AreEqual(result[0].GetInt64(), 4L); | |||
| } | |||
| } | |||
| [TestMethod] | |||
| public void RandomShuffleQueue() | |||
| { | |||
| var queue = tf.RandomShuffleQueue(10, min_after_dequeue: 1, dtype: tf.int32); | |||
| var init = queue.enqueue_many(new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); | |||
| var x = queue.dequeue(); | |||
| string results = ""; | |||
| using (var sess = tf.Session()) | |||
| { | |||
| init.run(); | |||
| foreach(var i in range(9)) | |||
| results += (int)sess.run(x) + "."; | |||
| // output in random order | |||
| Assert.IsFalse(results == "1.2.3.4.5.6.7.8.9."); | |||
| } | |||
| } | |||
| } | |||
| } | |||