tensor_stream 0.8.5 → 0.8.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/README.md +9 -7
- data/lib/tensor_stream/evaluator/operation_helpers/array_ops_helper.rb +17 -2
- data/lib/tensor_stream/evaluator/ruby/array_ops.rb +92 -10
- data/lib/tensor_stream/evaluator/ruby/check_ops.rb +9 -0
- data/lib/tensor_stream/evaluator/ruby/images_ops.rb +1 -1
- data/lib/tensor_stream/evaluator/ruby/math_ops.rb +38 -38
- data/lib/tensor_stream/evaluator/ruby/nn_ops.rb +87 -12
- data/lib/tensor_stream/evaluator/ruby_evaluator.rb +16 -13
- data/lib/tensor_stream/graph.rb +2 -0
- data/lib/tensor_stream/helpers/op_helper.rb +1 -0
- data/lib/tensor_stream/math_gradients.rb +86 -5
- data/lib/tensor_stream/nn/nn_ops.rb +47 -0
- data/lib/tensor_stream/operation.rb +25 -4
- data/lib/tensor_stream/ops.rb +160 -6
- data/lib/tensor_stream/session.rb +1 -0
- data/lib/tensor_stream/tensor.rb +4 -7
- data/lib/tensor_stream/tensor_shape.rb +10 -1
- data/lib/tensor_stream/train/adagrad_optimizer.rb +46 -0
- data/lib/tensor_stream/train/optimizer.rb +12 -0
- data/lib/tensor_stream/train/rmsprop_optimizer.rb +84 -0
- data/lib/tensor_stream/train/slot_creator.rb +14 -9
- data/lib/tensor_stream/trainer.rb +2 -0
- data/lib/tensor_stream/utils.rb +6 -4
- data/lib/tensor_stream/version.rb +1 -1
- data/samples/iris.rb +4 -3
- data/samples/linear_regression.rb +3 -0
- data/samples/rnn.rb +105 -0
- metadata +6 -2
data/lib/tensor_stream/tensor.rb
CHANGED
@@ -27,9 +27,7 @@ module TensorStream
|
|
27
27
|
# check if single dimenstion array is passed
|
28
28
|
options[:value] = reshape(options[:value], shape.reverse.dup) if shape.size >= 2 && !options[:value].empty? && !options[:value][0].is_a?(Array)
|
29
29
|
|
30
|
-
@value = options[:value].
|
31
|
-
v.is_a?(Tensor) ? Tensor.cast_dtype(v, @data_type) : v
|
32
|
-
end
|
30
|
+
@value = options[:value].map { |v| v.is_a?(Tensor) ? Tensor.cast_dtype(v, @data_type) : v }
|
33
31
|
elsif !shape.empty?
|
34
32
|
@value = reshape(Tensor.cast_dtype(options[:value], @data_type), shape.dup)
|
35
33
|
else
|
@@ -88,8 +86,7 @@ module TensorStream
|
|
88
86
|
end
|
89
87
|
|
90
88
|
def %(other)
|
91
|
-
|
92
|
-
_op(:mod, self, TensorStream.convert_to_tensor(other, dtype: data_type))
|
89
|
+
TensorStream.mod(self, other)
|
93
90
|
end
|
94
91
|
|
95
92
|
def floor
|
@@ -292,8 +289,8 @@ module TensorStream
|
|
292
289
|
end
|
293
290
|
|
294
291
|
def add_consumer(consumer)
|
295
|
-
@consumers ||=
|
296
|
-
@consumers << consumer.name if
|
292
|
+
@consumers ||= Set.new
|
293
|
+
@consumers << consumer.name if consumer.name != name
|
297
294
|
end
|
298
295
|
|
299
296
|
def setup_output(consumer)
|
@@ -23,6 +23,10 @@ module TensorStream
|
|
23
23
|
shape.size
|
24
24
|
end
|
25
25
|
|
26
|
+
def scalar?
|
27
|
+
shape.size.zero?
|
28
|
+
end
|
29
|
+
|
26
30
|
def known?
|
27
31
|
return false if shape.nil?
|
28
32
|
shape.each { |s| return false if s.nil? }
|
@@ -54,8 +58,13 @@ module TensorStream
|
|
54
58
|
end
|
55
59
|
|
56
60
|
def self.reshape(arr, new_shape)
|
57
|
-
|
61
|
+
arr = arr.is_a?(Array) ? arr.flatten : [arr]
|
62
|
+
|
63
|
+
new_shape = TensorShape.fix_inferred_elements(new_shape, arr.size)
|
64
|
+
return arr[0] if arr.size == 1 && new_shape.empty?
|
65
|
+
|
58
66
|
new_shape = new_shape.dup
|
67
|
+
|
59
68
|
s = new_shape.shift
|
60
69
|
|
61
70
|
if new_shape.size.zero?
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module TensorStream
|
2
|
+
module Train
|
3
|
+
# High Level implementation of the Adagrad algorithm
|
4
|
+
class AdagradOptimizer < Optimizer
|
5
|
+
include TensorStream::OpHelper
|
6
|
+
|
7
|
+
attr_accessor :learning_rate
|
8
|
+
|
9
|
+
def initialize(learning_rate, initial_accumulator_value = 0.1,
|
10
|
+
use_locking: false, name: "Adagrad")
|
11
|
+
@learning_rate = learning_rate
|
12
|
+
@initial_accumulator_value = initial_accumulator_value
|
13
|
+
@learning_rate_tensor = nil
|
14
|
+
super(name: name, use_locking: use_locking)
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
def create_slots(var_list)
|
20
|
+
var_list.each do |v|
|
21
|
+
dtype = v.data_type
|
22
|
+
init = nil
|
23
|
+
if v.shape.known?
|
24
|
+
init = TensorStream.constant_initializer(@initial_accumulator_value, dtype: dtype)
|
25
|
+
else
|
26
|
+
init_constant = TensorStream.fill(TensorStream.shape(v), @initial_accumulator_value)
|
27
|
+
init = TensorStream.cast(init_constant, dtype)
|
28
|
+
end
|
29
|
+
get_or_make_slot_with_initializer(v, init, v.shape, dtype, "accumulator", @name)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def prepare
|
34
|
+
learning_rate = call_if_callable(@learning_rate)
|
35
|
+
@learning_rate_tensor = TensorStream.convert_to_tensor(learning_rate, name: "learning_rate")
|
36
|
+
end
|
37
|
+
|
38
|
+
def apply_dense(grad, var)
|
39
|
+
acc = get_slot(var, "accumulator")
|
40
|
+
_op(:apply_adagrad,
|
41
|
+
var, acc, TensorStream.cast(@learning_rate_tensor, var.data_type),
|
42
|
+
grad, use_locking: @use_locking)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -147,6 +147,18 @@ module TensorStream
|
|
147
147
|
end
|
148
148
|
v
|
149
149
|
end
|
150
|
+
|
151
|
+
##
|
152
|
+
# Find or create a slot for a variable, using an Initializer.
|
153
|
+
def get_or_make_slot_with_initializer(var, initializer, shape, dtype, slot_name, op_name)
|
154
|
+
named_slots = slot_dict(slot_name)
|
155
|
+
if !named_slots.key?(var_key(var))
|
156
|
+
new_slot_variable = create_slot_with_initializer(
|
157
|
+
var, initializer, shape, dtype, op_name)
|
158
|
+
named_slots[var_key(var)] = new_slot_variable
|
159
|
+
end
|
160
|
+
named_slots[var_key(var)]
|
161
|
+
end
|
150
162
|
end
|
151
163
|
end
|
152
164
|
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module TensorStream
|
2
|
+
module Train
|
3
|
+
# High Level implementation of the RMSProp algorithm
|
4
|
+
# This is a straight port from TensorFlows rmsprop.py
|
5
|
+
class RMSPropOptimizer < Optimizer
|
6
|
+
include TensorStream::OpHelper
|
7
|
+
|
8
|
+
attr_accessor :learning_rate
|
9
|
+
|
10
|
+
##
|
11
|
+
# Optimizer that implements the RMSProp algorithm.
|
12
|
+
#
|
13
|
+
# [paper](http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf).
|
14
|
+
def initialize(learning_rate, decay = 0.9, momentum = 0.0, epsilon = 1e-10, centered: false,
|
15
|
+
use_locking: false, name: "RMSProp")
|
16
|
+
@learning_rate = learning_rate
|
17
|
+
@decay = decay
|
18
|
+
@momentum = momentum
|
19
|
+
@epsilon = epsilon
|
20
|
+
@centered = centered
|
21
|
+
|
22
|
+
# Tensor versions of the constructor arguments, created in _prepare().
|
23
|
+
@learning_rate_tensor = nil
|
24
|
+
@decay_tensor = nil
|
25
|
+
@momentum_tensor = nil
|
26
|
+
@epsilon_tensor = nil
|
27
|
+
|
28
|
+
super(name: name, use_locking: use_locking)
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
def prepare
|
34
|
+
lr = call_if_callable(@learning_rate)
|
35
|
+
decay = call_if_callable(@decay)
|
36
|
+
momentum = call_if_callable(@momentum)
|
37
|
+
epsilon = call_if_callable(@epsilon)
|
38
|
+
|
39
|
+
@learning_rate_tensor = TensorStream.convert_to_tensor(lr, name: "learning_rate")
|
40
|
+
@decay_tensor = TensorStream.convert_to_tensor(decay, name: "decay")
|
41
|
+
@momentum_tensor = TensorStream.convert_to_tensor(momentum, name: "momentum")
|
42
|
+
@epsilon_tensor = TensorStream.convert_to_tensor(epsilon, name: "epsilon")
|
43
|
+
end
|
44
|
+
|
45
|
+
def create_slots(var_list)
|
46
|
+
# Create slots for the first and second moments.
|
47
|
+
var_list.each do |v|
|
48
|
+
init_rms = if v.shape.known?
|
49
|
+
TensorStream.ones_initializer(dtype: v.data_type)
|
50
|
+
else
|
51
|
+
TensorStream.ones_like(v)
|
52
|
+
end
|
53
|
+
|
54
|
+
get_or_make_slot_with_initializer(v, init_rms, v.shape, v.data_type, "rms", @name)
|
55
|
+
|
56
|
+
zeros_slot(v, "mg", @name) if @centered
|
57
|
+
zeros_slot(v, "momentum", @name)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def apply_dense(grad, var)
|
62
|
+
rms = get_slot(var, "rms")
|
63
|
+
mom = get_slot(var, "momentum")
|
64
|
+
|
65
|
+
if @centered
|
66
|
+
mg = get_slot(var, "mg")
|
67
|
+
_op(:apply_centered_rms_prop, var, mg, rms, mom,
|
68
|
+
TensorStream.cast(@learning_rate_tensor, var.data_type),
|
69
|
+
TensorStream.cast(@decay_tensor, var.data_type),
|
70
|
+
TensorStream.cast(@momentum_tensor, var.data_type),
|
71
|
+
TensorStream.cast(@epsilon_tensor, var.data_type),
|
72
|
+
grad, use_locking: @use_locking)
|
73
|
+
else
|
74
|
+
_op(:apply_rms_prop, var, rms, mom,
|
75
|
+
TensorStream.cast(@learning_rate_tensor, var.data_type),
|
76
|
+
TensorStream.cast(@decay_tensor, var.data_type),
|
77
|
+
TensorStream.cast(@momentum_tensor, var.data_type),
|
78
|
+
TensorStream.cast(@epsilon_tensor, var.data_type),
|
79
|
+
grad, use_locking: @use_locking)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -5,9 +5,9 @@ module TensorStream
|
|
5
5
|
|
6
6
|
##
|
7
7
|
# Helper function for creating a slot variable.
|
8
|
-
def create_slot_var(primary, val, scope)
|
9
|
-
slot = get_variable(scope, initializer: val, trainable: false,
|
10
|
-
validate_shape: val.shape.
|
8
|
+
def create_slot_var(primary, val, scope, shape)
|
9
|
+
slot = get_variable(scope, initializer: val, trainable: false, shape: shape,
|
10
|
+
validate_shape: val.shape && val.shape.known?)
|
11
11
|
slot
|
12
12
|
end
|
13
13
|
|
@@ -24,16 +24,21 @@ module TensorStream
|
|
24
24
|
# Returns: A `Variable` object
|
25
25
|
def create_slot(primary, val, name, colocate_with_primary: true)
|
26
26
|
TensorStream.variable_scope(nil, primary.op.name + "/" + name) do
|
27
|
-
if colocate_with_primary
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
else
|
32
|
-
return create_slot_var(primary, val, "")
|
27
|
+
return create_slot_var(primary, val, "", nil) if colocate_with_primary
|
28
|
+
|
29
|
+
TensorStream.colocate_with(primary) do
|
30
|
+
return create_slot_var(primary, val, "", nil)
|
33
31
|
end
|
34
32
|
end
|
35
33
|
end
|
36
34
|
|
35
|
+
def create_slot_with_initializer(primary, initializer, shape, dtype, name, colocate_with_primary: true)
|
36
|
+
prefix = primary.op.name
|
37
|
+
TensorStream.variable_scope(nil, prefix + "/" + name) do
|
38
|
+
create_slot_var(primary, initializer, "", shape.shape)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
37
42
|
##
|
38
43
|
# Create a slot initialized to 0 with same shape as the primary object.
|
39
44
|
#
|
@@ -4,6 +4,8 @@ require 'tensor_stream/train/gradient_descent_optimizer'
|
|
4
4
|
require 'tensor_stream/train/momentum_optimizer'
|
5
5
|
require 'tensor_stream/train/adam_optimizer'
|
6
6
|
require 'tensor_stream/train/adadelta_optimizer'
|
7
|
+
require 'tensor_stream/train/adagrad_optimizer'
|
8
|
+
require 'tensor_stream/train/rmsprop_optimizer'
|
7
9
|
require 'tensor_stream/train/saver'
|
8
10
|
|
9
11
|
module TensorStream
|
data/lib/tensor_stream/utils.rb
CHANGED
@@ -225,13 +225,15 @@ module TensorStream
|
|
225
225
|
end
|
226
226
|
|
227
227
|
def convert_to_tensor(value, dtype: nil, name: nil, preferred_dtype: nil)
|
228
|
+
return value if value.is_a?(Tensor)
|
228
229
|
return convert_to_tensor(value.call) if value.is_a?(Proc)
|
230
|
+
if value.is_a?(Array) && value[0].is_a?(Tensor)
|
231
|
+
return TensorStream.stack(value) if value.size > 1
|
229
232
|
|
230
|
-
|
231
|
-
i_cons(value, dtype: dtype || Tensor.detect_type(value), name: name)
|
232
|
-
else
|
233
|
-
value
|
233
|
+
return TensorStream.expand_dims(value[0], 0)
|
234
234
|
end
|
235
|
+
|
236
|
+
i_cons(value, dtype: dtype || Tensor.detect_type(value), name: name)
|
235
237
|
end
|
236
238
|
|
237
239
|
def check_allowed_types(input, types)
|
data/samples/iris.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
+
require "bundler/setup"
|
1
2
|
require 'tensor_stream'
|
2
|
-
require 'tensor_stream/evaluator/opencl/opencl_evaluator'
|
3
|
+
# require 'tensor_stream/evaluator/opencl/opencl_evaluator'
|
3
4
|
|
4
5
|
# This neural network will predict the species of an iris based on sepal and petal size
|
5
6
|
# Dataset: http://en.wikipedia.org/wiki/Iris_flower_data_set
|
@@ -79,9 +80,9 @@ predict = tf.argmax(yhat, 1)
|
|
79
80
|
# Backward propagation
|
80
81
|
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels: y, logits: yhat))
|
81
82
|
|
82
|
-
updates = TensorStream::Train::GradientDescentOptimizer.new(0.01).minimize(cost)
|
83
|
+
# updates = TensorStream::Train::GradientDescentOptimizer.new(0.01).minimize(cost)
|
83
84
|
# updates = TensorStream::Train::MomentumOptimizer.new(0.01, 0.5, use_nesterov: true).minimize(cost)
|
84
|
-
|
85
|
+
updates = TensorStream::Train::RMSPropOptimizer.new(0.01).minimize(cost)
|
85
86
|
|
86
87
|
# Run SGD
|
87
88
|
sess = tf.session
|
@@ -31,9 +31,12 @@ pred = X * W + b
|
|
31
31
|
cost = ((pred - Y) ** 2).reduce(:+) / ( 2 * n_samples)
|
32
32
|
|
33
33
|
# Other possible Optimizers
|
34
|
+
|
34
35
|
# optimizer = TensorStream::Train::MomentumOptimizer.new(learning_rate, momentum, use_nesterov: true).minimize(cost)
|
35
36
|
# optimizer = TensorStream::Train::AdamOptimizer.new(learning_rate).minimize(cost)
|
36
37
|
# optimizer = TensorStream::Train::AdadeltaOptimizer.new(1.0).minimize(cost)
|
38
|
+
# optimizer = TensorStream::Train::AdagradOptimizer.new(0.01).minimize(cost)
|
39
|
+
# optimizer = TensorStream::Train::RMSPropOptimizer.new(0.01, centered: true).minimize(cost)
|
37
40
|
optimizer = TensorStream::Train::GradientDescentOptimizer.new(learning_rate).minimize(cost)
|
38
41
|
|
39
42
|
|
data/samples/rnn.rb
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
# RNN sample
|
2
|
+
#
|
3
|
+
# Ruby port Example based on article by Erik Hallström
|
4
|
+
# https://medium.com/@erikhallstrm/hello-world-rnn-83cd7105b767
|
5
|
+
#
|
6
|
+
#
|
7
|
+
|
8
|
+
require "bundler/setup"
|
9
|
+
require 'tensor_stream'
|
10
|
+
|
11
|
+
tf = TensorStream
|
12
|
+
|
13
|
+
num_epochs = 100
|
14
|
+
total_series_length = 50000
|
15
|
+
truncated_backprop_length = 15
|
16
|
+
state_size = 4
|
17
|
+
num_classes = 2
|
18
|
+
echo_step = 3
|
19
|
+
batch_size = 5
|
20
|
+
num_batches = total_series_length / batch_size / truncated_backprop_length
|
21
|
+
randomizer = TensorStream.random_uniform([total_series_length], minval: 0, maxval: 2)
|
22
|
+
|
23
|
+
|
24
|
+
def generate_data(randomizer, total_series_length, batch_size, echo_step)
|
25
|
+
x = randomizer.eval
|
26
|
+
y = x.rotate(-echo_step)
|
27
|
+
|
28
|
+
y[echo_step] = 0
|
29
|
+
|
30
|
+
x = TensorStream::TensorShape.reshape(x, [batch_size, -1]) # The first index changing slowest, subseries as rows
|
31
|
+
y = TensorStream::TensorShape.reshape(y, [batch_size, -1])
|
32
|
+
[x, y]
|
33
|
+
end
|
34
|
+
|
35
|
+
batchX_placeholder = tf.placeholder(:float32, shape: [batch_size, truncated_backprop_length], name: 'batch_x')
|
36
|
+
batchY_placeholder = tf.placeholder(:int32, shape: [batch_size, truncated_backprop_length], name: 'batch_y')
|
37
|
+
|
38
|
+
init_state = tf.placeholder(:float32, shape: [batch_size, state_size], name: 'init_state')
|
39
|
+
|
40
|
+
|
41
|
+
W = tf.variable(tf.random_uniform([state_size+1, state_size]), dtype: :float32, name: 'W')
|
42
|
+
b = tf.variable(tf.zeros([state_size]), dtype: :float32, name: 'b')
|
43
|
+
|
44
|
+
W2 = tf.variable(tf.random_uniform([state_size, num_classes]), dtype: :float32, name: 'W2')
|
45
|
+
b2 = tf.variable(tf.zeros([num_classes]), dtype: :float32, name: 'b2')
|
46
|
+
|
47
|
+
|
48
|
+
inputs_series = tf.unpack(batchX_placeholder, axis: 1)
|
49
|
+
labels_series = tf.unpack(batchY_placeholder, axis: 1)
|
50
|
+
|
51
|
+
current_state = init_state
|
52
|
+
states_series = []
|
53
|
+
|
54
|
+
inputs_series.each do |current_input|
|
55
|
+
current_input = tf.reshape(current_input, [batch_size, 1])
|
56
|
+
input_and_state_concatenated = tf.concat([current_input, current_state], 1) # Increasing number of columns
|
57
|
+
next_state = tf.tanh(tf.matmul(input_and_state_concatenated, W) + b) # Broadcasted addition
|
58
|
+
states_series << next_state
|
59
|
+
current_state = next_state
|
60
|
+
end
|
61
|
+
|
62
|
+
logits_series = states_series.collect do |state|
|
63
|
+
tf.matmul(state, W2) + b2
|
64
|
+
end
|
65
|
+
|
66
|
+
predictions_series = logits_series.collect do |logits|
|
67
|
+
tf.nn.softmax(logits)
|
68
|
+
end
|
69
|
+
|
70
|
+
losses = logits_series.zip(labels_series).collect do |logits, labels|
|
71
|
+
tf.nn.sparse_softmax_cross_entropy_with_logits(logits: logits, labels: labels)
|
72
|
+
end
|
73
|
+
total_loss = tf.reduce_mean(losses)
|
74
|
+
|
75
|
+
train_step = TensorStream::Train::AdagradOptimizer.new(0.3).minimize(total_loss)
|
76
|
+
|
77
|
+
puts "#{tf.get_default_graph.nodes.keys.size} nodes created"
|
78
|
+
zeros_state = tf.zeros([batch_size, state_size]).eval
|
79
|
+
tf.session do |sess|
|
80
|
+
sess.run(tf.global_variables_initializer)
|
81
|
+
(0..num_epochs).each do |epoch_idx|
|
82
|
+
x, y = generate_data(randomizer, total_series_length, batch_size, echo_step)
|
83
|
+
_current_state = zeros_state
|
84
|
+
print("New data, epoch", epoch_idx, "\n")
|
85
|
+
(0..num_batches - 1).each do |batch_idx|
|
86
|
+
start_idx = batch_idx * truncated_backprop_length
|
87
|
+
end_idx = start_idx + truncated_backprop_length
|
88
|
+
|
89
|
+
batchX = x.map { |x| x[start_idx...end_idx] }
|
90
|
+
batchY = y.map { |y| y[start_idx...end_idx] }
|
91
|
+
|
92
|
+
_total_loss, _train_step, _current_state, _predictions_series = sess.run(
|
93
|
+
[total_loss, train_step, current_state, predictions_series],
|
94
|
+
feed_dict: {
|
95
|
+
batchX_placeholder => batchX,
|
96
|
+
batchY_placeholder => batchY,
|
97
|
+
init_state => _current_state
|
98
|
+
})
|
99
|
+
|
100
|
+
if batch_idx%100 == 0
|
101
|
+
print("Step",batch_idx, " Loss ", _total_loss, "\n")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tensor_stream
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joseph Emmanuel Dayo
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-09-
|
11
|
+
date: 2018-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -261,6 +261,7 @@ files:
|
|
261
261
|
- lib/tensor_stream/evaluator/operation_helpers/math_helper.rb
|
262
262
|
- lib/tensor_stream/evaluator/operation_helpers/random_gaussian.rb
|
263
263
|
- lib/tensor_stream/evaluator/ruby/array_ops.rb
|
264
|
+
- lib/tensor_stream/evaluator/ruby/check_ops.rb
|
264
265
|
- lib/tensor_stream/evaluator/ruby/images_ops.rb
|
265
266
|
- lib/tensor_stream/evaluator/ruby/math_ops.rb
|
266
267
|
- lib/tensor_stream/evaluator/ruby/nn_ops.rb
|
@@ -288,10 +289,12 @@ files:
|
|
288
289
|
- lib/tensor_stream/tensor.rb
|
289
290
|
- lib/tensor_stream/tensor_shape.rb
|
290
291
|
- lib/tensor_stream/train/adadelta_optimizer.rb
|
292
|
+
- lib/tensor_stream/train/adagrad_optimizer.rb
|
291
293
|
- lib/tensor_stream/train/adam_optimizer.rb
|
292
294
|
- lib/tensor_stream/train/gradient_descent_optimizer.rb
|
293
295
|
- lib/tensor_stream/train/momentum_optimizer.rb
|
294
296
|
- lib/tensor_stream/train/optimizer.rb
|
297
|
+
- lib/tensor_stream/train/rmsprop_optimizer.rb
|
295
298
|
- lib/tensor_stream/train/saver.rb
|
296
299
|
- lib/tensor_stream/train/slot_creator.rb
|
297
300
|
- lib/tensor_stream/train/utils.rb
|
@@ -311,6 +314,7 @@ files:
|
|
311
314
|
- samples/multigpu.rb
|
312
315
|
- samples/nearest_neighbor.rb
|
313
316
|
- samples/raw_neural_net_sample.rb
|
317
|
+
- samples/rnn.rb
|
314
318
|
- tensor_stream.gemspec
|
315
319
|
homepage: http://www.github.com/jedld/tensor_stream
|
316
320
|
licenses:
|