tensor_stream 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +10 -0
- data/CHANGELOG.md +8 -0
- data/README.md +40 -1
- data/benchmark/benchmark.rb +4 -1
- data/lib/tensor_stream.rb +5 -0
- data/lib/tensor_stream/debugging/debugging.rb +4 -2
- data/lib/tensor_stream/device.rb +2 -1
- data/lib/tensor_stream/evaluator/base_evaluator.rb +43 -32
- data/lib/tensor_stream/evaluator/evaluator.rb +0 -1
- data/lib/tensor_stream/evaluator/opencl/kernels/acos.cl +8 -0
- data/lib/tensor_stream/evaluator/opencl/kernels/apply_gradient.cl +9 -0
- data/lib/tensor_stream/evaluator/opencl/kernels/asin.cl +9 -0
- data/lib/tensor_stream/evaluator/opencl/kernels/floor_mod.cl +3 -0
- data/lib/tensor_stream/evaluator/opencl/kernels/log_softmax.cl +26 -0
- data/lib/tensor_stream/evaluator/opencl/kernels/max.cl +5 -5
- data/lib/tensor_stream/evaluator/opencl/kernels/min.cl +46 -0
- data/lib/tensor_stream/evaluator/opencl/kernels/real_div.cl +3 -0
- data/lib/tensor_stream/evaluator/opencl/kernels/softmax_cross.cl +27 -0
- data/lib/tensor_stream/evaluator/opencl/kernels/softmax_cross_grad.cl +28 -0
- data/lib/tensor_stream/evaluator/opencl/opencl_buffer.rb +5 -6
- data/lib/tensor_stream/evaluator/opencl/opencl_evaluator.rb +200 -265
- data/lib/tensor_stream/evaluator/operation_helpers/array_ops_helper.rb +4 -8
- data/lib/tensor_stream/evaluator/ruby_evaluator.rb +193 -122
- data/lib/tensor_stream/exceptions.rb +6 -0
- data/lib/tensor_stream/graph.rb +21 -6
- data/lib/tensor_stream/graph_builder.rb +67 -0
- data/lib/tensor_stream/graph_deserializers/protobuf.rb +271 -0
- data/lib/tensor_stream/graph_keys.rb +1 -0
- data/lib/tensor_stream/graph_serializers/pbtext.rb +11 -10
- data/lib/tensor_stream/helpers/op_helper.rb +7 -33
- data/lib/tensor_stream/helpers/string_helper.rb +16 -0
- data/lib/tensor_stream/math_gradients.rb +67 -44
- data/lib/tensor_stream/nn/nn_ops.rb +7 -1
- data/lib/tensor_stream/operation.rb +14 -27
- data/lib/tensor_stream/ops.rb +82 -29
- data/lib/tensor_stream/session.rb +4 -0
- data/lib/tensor_stream/tensor.rb +30 -12
- data/lib/tensor_stream/tensor_shape.rb +1 -1
- data/lib/tensor_stream/train/gradient_descent_optimizer.rb +37 -4
- data/lib/tensor_stream/train/saver.rb +46 -0
- data/lib/tensor_stream/train/utils.rb +37 -0
- data/lib/tensor_stream/trainer.rb +2 -0
- data/lib/tensor_stream/utils.rb +24 -14
- data/lib/tensor_stream/variable.rb +5 -11
- data/lib/tensor_stream/variable_scope.rb +15 -0
- data/lib/tensor_stream/version.rb +1 -1
- data/samples/iris.rb +8 -4
- data/samples/linear_regression.rb +1 -1
- data/samples/multigpu.rb +73 -0
- data/samples/nearest_neighbor.rb +3 -3
- data/tensor_stream.gemspec +1 -1
- data/test_samples/raw_neural_net_sample.rb +4 -1
- metadata +21 -6
data/samples/iris.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require "bundler/setup"
|
2
2
|
require 'tensor_stream'
|
3
|
-
require 'tensor_stream/evaluator/opencl/opencl_evaluator'
|
3
|
+
# require 'tensor_stream/evaluator/opencl/opencl_evaluator'
|
4
4
|
|
5
5
|
# This neural network will predict the species of an iris based on sepal and petal size
|
6
6
|
# Dataset: http://en.wikipedia.org/wiki/Iris_flower_data_set
|
@@ -75,7 +75,7 @@ w_2 = init_weights([h_size, y_size])
|
|
75
75
|
|
76
76
|
# Forward propagation
|
77
77
|
yhat = forwardprop(X, w_1, w_2)
|
78
|
-
predict = tf.argmax(yhat,
|
78
|
+
predict = tf.argmax(yhat, 1)
|
79
79
|
|
80
80
|
# Backward propagation
|
81
81
|
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels: y, logits: yhat))
|
@@ -89,13 +89,17 @@ sess.run(init)
|
|
89
89
|
loss = sess.run(cost, feed_dict: { X => x_train, y => y_train })
|
90
90
|
puts "Testing the untrained network..."
|
91
91
|
puts loss
|
92
|
+
start_time = Time.now
|
92
93
|
(0..100).each do |epoch|
|
93
94
|
x_train.size.times do |i|
|
94
95
|
sess.run(updates, feed_dict: {X => [x_train[i]], y => [y_train[i]]})
|
95
|
-
loss = sess.run(cost, feed_dict: { X => [x_train[i]], y => [y_train[i]] })
|
96
96
|
end
|
97
|
+
loss = sess.run(cost, feed_dict: { X => x_train, y => y_train })
|
97
98
|
puts "epoch: #{epoch}, loss #{loss}"
|
98
99
|
end
|
99
100
|
|
100
101
|
loss = sess.run(cost, feed_dict: { X => x_train, y => y_train })
|
101
|
-
puts "loss after training #{loss}"
|
102
|
+
puts "loss after training #{loss}"
|
103
|
+
loss = sess.run(cost, feed_dict: { X => x_test, y => y_test })
|
104
|
+
puts "loss test data set #{loss}"
|
105
|
+
puts("time elapsed ", Time.now.to_i - start_time.to_i)
|
@@ -26,7 +26,7 @@ b = tf.variable(rand, name: "bias")
|
|
26
26
|
pred = X * W + b
|
27
27
|
|
28
28
|
# Mean squared error
|
29
|
-
cost =
|
29
|
+
cost = ((pred - Y) ** 2).reduce(:+) / ( 2 * n_samples)
|
30
30
|
|
31
31
|
optimizer = TensorStream::Train::GradientDescentOptimizer.new(learning_rate).minimize(cost)
|
32
32
|
|
data/samples/multigpu.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
require 'tensor_stream'
|
3
|
+
require 'tensor_stream/evaluator/opencl/opencl_evaluator'
|
4
|
+
require 'pry-byebug'
|
5
|
+
|
6
|
+
ts = TensorStream
|
7
|
+
|
8
|
+
n = 10
|
9
|
+
DIMEN = 1024
|
10
|
+
|
11
|
+
A = ts.random_uniform([DIMEN, DIMEN]).eval
|
12
|
+
B = ts.random_uniform([DIMEN, DIMEN]).eval
|
13
|
+
|
14
|
+
|
15
|
+
# Create a graph to store results
|
16
|
+
c1 = []
|
17
|
+
c2 = []
|
18
|
+
a = nil
|
19
|
+
b = nil
|
20
|
+
|
21
|
+
def matpow(m, n)
|
22
|
+
return m if n < 1
|
23
|
+
TensorStream.matmul(m, matpow(m, n-1))
|
24
|
+
end
|
25
|
+
|
26
|
+
ts.device('/device:GPU:0') do
|
27
|
+
a = ts.placeholder(:float32, shape: [DIMEN, DIMEN])
|
28
|
+
b = ts.placeholder(:float32, shape: [DIMEN, DIMEN])
|
29
|
+
# Compute A^n and B^n and store results in c1
|
30
|
+
c1 << matpow(a, n)
|
31
|
+
c1 << matpow(b, n)
|
32
|
+
end
|
33
|
+
|
34
|
+
sum = ts.device('/device:GPU:0') do
|
35
|
+
ts.add_n(c1)
|
36
|
+
end
|
37
|
+
|
38
|
+
t1_1 = Time.now.to_i
|
39
|
+
t2_1 = nil
|
40
|
+
|
41
|
+
ts.session(log_device_placement: true) do |sess|
|
42
|
+
sess.run(sum, feed_dict: { a => A, b => B})
|
43
|
+
t2_1 = Time.now.to_i
|
44
|
+
end
|
45
|
+
|
46
|
+
# Multi GPU computing
|
47
|
+
# GPU:0 computes A^n
|
48
|
+
ts.device('/device:GPU:1') do
|
49
|
+
a = ts.placeholder(:float32, shape: [DIMEN, DIMEN])
|
50
|
+
c2 << matpow(a, n)
|
51
|
+
end
|
52
|
+
|
53
|
+
# GPU:1 computes B^n
|
54
|
+
ts.device('/device:GPU:1') do
|
55
|
+
b = ts.placeholder(:float32, shape: [DIMEN, DIMEN])
|
56
|
+
c2 << matpow(b, n)
|
57
|
+
end
|
58
|
+
|
59
|
+
ts.device('/device:GPU:1') do
|
60
|
+
sum = ts.add_n(c2) #Addition of all elements in c2, i.e. A^n + B^n
|
61
|
+
end
|
62
|
+
|
63
|
+
t1_2 = Time.now.to_i
|
64
|
+
t2_2 = nil
|
65
|
+
ts.session(log_device_placement:true) do |sess|
|
66
|
+
# Run the op.
|
67
|
+
sess.run(sum, feed_dict: {a => A, b => B})
|
68
|
+
t2_2 = Time.now.to_i
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
print("Single GPU computation time: " + (t2_1-t1_1).to_s)
|
73
|
+
print("Multi GPU computation time: " + (t2_2-t1_2).to_s)
|
data/samples/nearest_neighbor.rb
CHANGED
@@ -36,14 +36,14 @@ accuracy = 0.0
|
|
36
36
|
init = tf.global_variables_initializer()
|
37
37
|
|
38
38
|
# Start training
|
39
|
-
tf.session
|
39
|
+
tf.session do |sess|
|
40
40
|
# Run the initializer
|
41
41
|
sess.run(init)
|
42
42
|
Xte.size.times do |i|
|
43
43
|
# Get nearest neighbor
|
44
44
|
nn_index = sess.run(pred, feed_dict: {xtr => Xtr, xte => Xte[i]})
|
45
|
-
print("Test", i, "Prediction:",Ytr[nn_index].max, \
|
46
|
-
"True Class:", Yte[i].max)
|
45
|
+
print("Test ", i, "Prediction: ",Ytr[nn_index].max, \
|
46
|
+
"True Class: ", Yte[i].max, "\n")
|
47
47
|
if Ytr[nn_index].max == Yte[i].max
|
48
48
|
accuracy += 1.0/ Xte.size
|
49
49
|
end
|
data/tensor_stream.gemspec
CHANGED
@@ -41,7 +41,7 @@ Gem::Specification.new do |spec|
|
|
41
41
|
spec.add_development_dependency "rspec_junit_formatter"
|
42
42
|
spec.add_development_dependency "mnist-learn"
|
43
43
|
spec.add_development_dependency "opencl_ruby_ffi"
|
44
|
+
spec.add_development_dependency "simplecov"
|
44
45
|
spec.add_dependency "deep_merge"
|
45
46
|
spec.add_dependency "concurrent-ruby"
|
46
|
-
spec.add_dependency "sciruby"
|
47
47
|
end
|
@@ -86,8 +86,11 @@ tf.session do |sess|
|
|
86
86
|
# Run the initializer
|
87
87
|
sess.run(init)
|
88
88
|
|
89
|
+
print("Testing Accuracy:", \
|
90
|
+
sess.run(accuracy, feed_dict: { X => mnist.test.images,
|
91
|
+
Y => mnist.test.labels}))
|
92
|
+
|
89
93
|
(1..num_steps+1).each do |step|
|
90
|
-
|
91
94
|
batch_x, batch_y = mnist.train.next_batch(batch_size)
|
92
95
|
# Run optimization op (backprop)
|
93
96
|
puts "."
|
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.
|
4
|
+
version: 0.7.0
|
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-
|
11
|
+
date: 2018-08-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -165,13 +165,13 @@ dependencies:
|
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
|
-
name:
|
168
|
+
name: simplecov
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
170
170
|
requirements:
|
171
171
|
- - ">="
|
172
172
|
- !ruby/object:Gem::Version
|
173
173
|
version: '0'
|
174
|
-
type: :
|
174
|
+
type: :development
|
175
175
|
prerelease: false
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
177
177
|
requirements:
|
@@ -179,7 +179,7 @@ dependencies:
|
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0'
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
|
-
name:
|
182
|
+
name: deep_merge
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
184
184
|
requirements:
|
185
185
|
- - ">="
|
@@ -193,7 +193,7 @@ dependencies:
|
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '0'
|
195
195
|
- !ruby/object:Gem::Dependency
|
196
|
-
name:
|
196
|
+
name: concurrent-ruby
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
198
198
|
requirements:
|
199
199
|
- - ">="
|
@@ -246,9 +246,12 @@ files:
|
|
246
246
|
- lib/tensor_stream/evaluator/opencl/kernels/_bool_operand.cl
|
247
247
|
- lib/tensor_stream/evaluator/opencl/kernels/_operand.cl
|
248
248
|
- lib/tensor_stream/evaluator/opencl/kernels/abs.cl
|
249
|
+
- lib/tensor_stream/evaluator/opencl/kernels/acos.cl
|
249
250
|
- lib/tensor_stream/evaluator/opencl/kernels/add.cl
|
251
|
+
- lib/tensor_stream/evaluator/opencl/kernels/apply_gradient.cl
|
250
252
|
- lib/tensor_stream/evaluator/opencl/kernels/argmax.cl
|
251
253
|
- lib/tensor_stream/evaluator/opencl/kernels/argmin.cl
|
254
|
+
- lib/tensor_stream/evaluator/opencl/kernels/asin.cl
|
252
255
|
- lib/tensor_stream/evaluator/opencl/kernels/cast.cl
|
253
256
|
- lib/tensor_stream/evaluator/opencl/kernels/ceil.cl
|
254
257
|
- lib/tensor_stream/evaluator/opencl/kernels/cond.cl.erb
|
@@ -257,14 +260,18 @@ files:
|
|
257
260
|
- lib/tensor_stream/evaluator/opencl/kernels/exp.cl
|
258
261
|
- lib/tensor_stream/evaluator/opencl/kernels/floor.cl
|
259
262
|
- lib/tensor_stream/evaluator/opencl/kernels/floor_div.cl
|
263
|
+
- lib/tensor_stream/evaluator/opencl/kernels/floor_mod.cl
|
260
264
|
- lib/tensor_stream/evaluator/opencl/kernels/gemm.cl
|
261
265
|
- lib/tensor_stream/evaluator/opencl/kernels/log.cl
|
262
266
|
- lib/tensor_stream/evaluator/opencl/kernels/log1p.cl
|
267
|
+
- lib/tensor_stream/evaluator/opencl/kernels/log_softmax.cl
|
263
268
|
- lib/tensor_stream/evaluator/opencl/kernels/max.cl
|
269
|
+
- lib/tensor_stream/evaluator/opencl/kernels/min.cl
|
264
270
|
- lib/tensor_stream/evaluator/opencl/kernels/mod.cl
|
265
271
|
- lib/tensor_stream/evaluator/opencl/kernels/mul.cl
|
266
272
|
- lib/tensor_stream/evaluator/opencl/kernels/negate.cl
|
267
273
|
- lib/tensor_stream/evaluator/opencl/kernels/pow.cl
|
274
|
+
- lib/tensor_stream/evaluator/opencl/kernels/real_div.cl
|
268
275
|
- lib/tensor_stream/evaluator/opencl/kernels/reciprocal.cl
|
269
276
|
- lib/tensor_stream/evaluator/opencl/kernels/round.cl
|
270
277
|
- lib/tensor_stream/evaluator/opencl/kernels/sigmoid.cl
|
@@ -272,6 +279,8 @@ files:
|
|
272
279
|
- lib/tensor_stream/evaluator/opencl/kernels/sign.cl
|
273
280
|
- lib/tensor_stream/evaluator/opencl/kernels/sin.cl
|
274
281
|
- lib/tensor_stream/evaluator/opencl/kernels/softmax.cl
|
282
|
+
- lib/tensor_stream/evaluator/opencl/kernels/softmax_cross.cl
|
283
|
+
- lib/tensor_stream/evaluator/opencl/kernels/softmax_cross_grad.cl
|
275
284
|
- lib/tensor_stream/evaluator/opencl/kernels/softmax_grad.cl
|
276
285
|
- lib/tensor_stream/evaluator/opencl/kernels/sqrt.cl
|
277
286
|
- lib/tensor_stream/evaluator/opencl/kernels/square.cl
|
@@ -289,7 +298,10 @@ files:
|
|
289
298
|
- lib/tensor_stream/evaluator/operation_helpers/math_helper.rb
|
290
299
|
- lib/tensor_stream/evaluator/operation_helpers/random_gaussian.rb
|
291
300
|
- lib/tensor_stream/evaluator/ruby_evaluator.rb
|
301
|
+
- lib/tensor_stream/exceptions.rb
|
292
302
|
- lib/tensor_stream/graph.rb
|
303
|
+
- lib/tensor_stream/graph_builder.rb
|
304
|
+
- lib/tensor_stream/graph_deserializers/protobuf.rb
|
293
305
|
- lib/tensor_stream/graph_keys.rb
|
294
306
|
- lib/tensor_stream/graph_serializers/graphml.rb
|
295
307
|
- lib/tensor_stream/graph_serializers/pbtext.rb
|
@@ -308,10 +320,12 @@ files:
|
|
308
320
|
- lib/tensor_stream/tensor_shape.rb
|
309
321
|
- lib/tensor_stream/train/gradient_descent_optimizer.rb
|
310
322
|
- lib/tensor_stream/train/saver.rb
|
323
|
+
- lib/tensor_stream/train/utils.rb
|
311
324
|
- lib/tensor_stream/trainer.rb
|
312
325
|
- lib/tensor_stream/types.rb
|
313
326
|
- lib/tensor_stream/utils.rb
|
314
327
|
- lib/tensor_stream/variable.rb
|
328
|
+
- lib/tensor_stream/variable_scope.rb
|
315
329
|
- lib/tensor_stream/version.rb
|
316
330
|
- samples/error.graphml
|
317
331
|
- samples/gradient_sample.graphml
|
@@ -319,6 +333,7 @@ files:
|
|
319
333
|
- samples/iris.rb
|
320
334
|
- samples/linear_regression.rb
|
321
335
|
- samples/logistic_regression.rb
|
336
|
+
- samples/multigpu.rb
|
322
337
|
- samples/nearest_neighbor.rb
|
323
338
|
- tensor_stream.gemspec
|
324
339
|
- test_samples/error.graphml
|