tensor_stream 0.1.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 +7 -0
- data/.gitignore +12 -0
- data/.rake_tasks~ +0 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +123 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/tensor_stream.rb +138 -0
- data/lib/tensor_stream/control_flow.rb +23 -0
- data/lib/tensor_stream/evaluator/evaluator.rb +7 -0
- data/lib/tensor_stream/evaluator/operation_helpers/random_gaussian.rb +32 -0
- data/lib/tensor_stream/evaluator/ruby_evaluator.rb +749 -0
- data/lib/tensor_stream/graph.rb +98 -0
- data/lib/tensor_stream/graph_keys.rb +5 -0
- data/lib/tensor_stream/helpers/op_helper.rb +58 -0
- data/lib/tensor_stream/math_gradients.rb +161 -0
- data/lib/tensor_stream/monkey_patches/integer.rb +0 -0
- data/lib/tensor_stream/nn/nn_ops.rb +17 -0
- data/lib/tensor_stream/operation.rb +195 -0
- data/lib/tensor_stream/ops.rb +225 -0
- data/lib/tensor_stream/placeholder.rb +21 -0
- data/lib/tensor_stream/session.rb +66 -0
- data/lib/tensor_stream/tensor.rb +317 -0
- data/lib/tensor_stream/tensor_shape.rb +25 -0
- data/lib/tensor_stream/train/gradient_descent_optimizer.rb +23 -0
- data/lib/tensor_stream/train/saver.rb +61 -0
- data/lib/tensor_stream/trainer.rb +7 -0
- data/lib/tensor_stream/types.rb +17 -0
- data/lib/tensor_stream/variable.rb +52 -0
- data/lib/tensor_stream/version.rb +7 -0
- data/samples/iris.data +150 -0
- data/samples/iris.rb +117 -0
- data/samples/linear_regression.rb +55 -0
- data/samples/raw_neural_net_sample.rb +54 -0
- data/tensor_stream.gemspec +40 -0
- metadata +185 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
require 'tensor_stream'
|
3
|
+
require 'benchmark'
|
4
|
+
|
5
|
+
tf = TensorStream
|
6
|
+
|
7
|
+
learning_rate = 0.01
|
8
|
+
training_epochs = 1000
|
9
|
+
display_step = 50
|
10
|
+
|
11
|
+
train_X = [3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167,
|
12
|
+
7.042,10.791,5.313,7.997,5.654,9.27,3.1]
|
13
|
+
train_Y = [1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221,
|
14
|
+
2.827,3.465,1.65,2.904,2.42,2.94,1.3]
|
15
|
+
|
16
|
+
n_samples = train_X.size
|
17
|
+
|
18
|
+
X = tf.placeholder("float")
|
19
|
+
Y = tf.placeholder("float")
|
20
|
+
|
21
|
+
# Set model weights
|
22
|
+
W = tf.Variable(rand, name: "weight")
|
23
|
+
b = tf.Variable(rand, name: "bias")
|
24
|
+
|
25
|
+
# Construct a linear model
|
26
|
+
pred = X * W + b
|
27
|
+
|
28
|
+
# Mean squared error
|
29
|
+
cost = tf.reduce_sum(tf.pow(pred - Y, 2)) / ( 2 * n_samples)
|
30
|
+
|
31
|
+
optimizer = TensorStream::Train::GradientDescentOptimizer.new(learning_rate).minimize(cost)
|
32
|
+
|
33
|
+
# Initialize the variables (i.e. assign their default value)
|
34
|
+
init = tf.global_variables_initializer()
|
35
|
+
|
36
|
+
tf.Session do |sess|
|
37
|
+
start_time = Time.now
|
38
|
+
sess.run(init)
|
39
|
+
(0..training_epochs).each do |epoch|
|
40
|
+
train_X.zip(train_Y).each do |x,y|
|
41
|
+
sess.run(optimizer, feed_dict: {X => x, Y => y})
|
42
|
+
end
|
43
|
+
|
44
|
+
if (epoch+1) % display_step == 0
|
45
|
+
c = sess.run(cost, feed_dict: {X => train_X, Y => train_Y})
|
46
|
+
puts("Epoch:", '%04d' % (epoch+1), "cost=", c, \
|
47
|
+
"W=", sess.run(W), "b=", sess.run(b))
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
puts("Optimization Finished!")
|
52
|
+
training_cost = sess.run(cost, feed_dict: { X => train_X, Y => train_Y})
|
53
|
+
puts("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n')
|
54
|
+
puts("time elapsed ", Time.now.to_i - start_time.to_i)
|
55
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
require 'tensor_stream'
|
3
|
+
require 'pry-byebug'
|
4
|
+
|
5
|
+
learning_rate = 0.1
|
6
|
+
num_steps = 500
|
7
|
+
batch_size = 128
|
8
|
+
display_step = 100
|
9
|
+
|
10
|
+
# Network Parameters
|
11
|
+
n_hidden_1 = 256 # 1st layer number of neurons
|
12
|
+
n_hidden_2 = 256 # 2nd layer number of neurons
|
13
|
+
num_input = 784 # MNIST data input (img shape: 28*28)
|
14
|
+
num_classes = 10 # MNIST total classes (0-9 digits)
|
15
|
+
|
16
|
+
tf = TensorStream
|
17
|
+
|
18
|
+
# tf Graph input
|
19
|
+
X = tf.placeholder("float", shape: [nil, num_input])
|
20
|
+
Y = tf.placeholder("float", shape: [nil, num_classes])
|
21
|
+
|
22
|
+
# Store layers weight & bias
|
23
|
+
@weights = {
|
24
|
+
h1: tf.Variable(tf.random_normal([num_input, n_hidden_1])),
|
25
|
+
h2: tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
|
26
|
+
out: tf.Variable(tf.random_normal([n_hidden_2, num_classes]))
|
27
|
+
}
|
28
|
+
|
29
|
+
@biases = {
|
30
|
+
b1: tf.Variable(tf.random_normal([n_hidden_1])),
|
31
|
+
b2: tf.Variable(tf.random_normal([n_hidden_2])),
|
32
|
+
out: tf.Variable(tf.random_normal([num_classes]))
|
33
|
+
}
|
34
|
+
|
35
|
+
|
36
|
+
# Create model
|
37
|
+
def neural_net(x)
|
38
|
+
# Hidden fully connected layer with 256 neurons
|
39
|
+
layer_1 = TensorStream.add(TensorStream.matmul(x, @weights[:h1]), @biases[:b1])
|
40
|
+
# Hidden fully connected layer with 256 neurons
|
41
|
+
layer_2 = TensorStream.add(TensorStream.matmul(layer_1, @weights[:h2]), @biases[:b2])
|
42
|
+
# Output fully connected layer with a neuron for each class
|
43
|
+
TensorStream.matmul(layer_2, @weights[:out]) + @biases[:out]
|
44
|
+
end
|
45
|
+
|
46
|
+
def softmax(logits)
|
47
|
+
TensorStream.exp(logits) / TensorStream.reduce_sum(TensorStream.exp(logits))
|
48
|
+
end
|
49
|
+
|
50
|
+
# Construct model
|
51
|
+
logits = neural_net(X)
|
52
|
+
prediction = softmax(logits)
|
53
|
+
|
54
|
+
puts prediction.to_math
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'tensor_stream/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "tensor_stream"
|
8
|
+
spec.version = TensorStream::VERSION
|
9
|
+
spec.authors = ["Joseph Emmanuel Dayo"]
|
10
|
+
spec.email = ["joseph.dayo@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{A Pure ruby tensorflow implementation}
|
13
|
+
spec.description = %q{A reimplementation of TensorFlow for ruby. This is a ground up implementation with no dependency on TensorFlow. Effort has been made to make the programming style as near to TensorFlow as possible, comes with a pure ruby evaluator by default as well with support for an opencl evaluator.}
|
14
|
+
spec.homepage = "http://www.github.com/jedld/tensor_stream"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
19
|
+
if spec.respond_to?(:metadata)
|
20
|
+
spec.metadata['allowed_push_host'] = "https://rubygems.org"
|
21
|
+
else
|
22
|
+
raise "RubyGems 2.0 or newer is required to protect against " \
|
23
|
+
"public gem pushes."
|
24
|
+
end
|
25
|
+
|
26
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
27
|
+
f.match(%r{^(test|spec|features)/})
|
28
|
+
end
|
29
|
+
spec.bindir = "exe"
|
30
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
31
|
+
spec.require_paths = ["lib"]
|
32
|
+
|
33
|
+
spec.add_development_dependency "bundler", "~> 1.14"
|
34
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
35
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
36
|
+
spec.add_development_dependency "awesome_print"
|
37
|
+
spec.add_development_dependency "rubocop"
|
38
|
+
spec.add_dependency "deep_merge"
|
39
|
+
spec.add_dependency "concurrent-ruby"
|
40
|
+
end
|
metadata
ADDED
@@ -0,0 +1,185 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tensor_stream
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Joseph Emmanuel Dayo
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-05-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - "~>"
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '1.14'
|
19
|
+
name: bundler
|
20
|
+
prerelease: false
|
21
|
+
type: :development
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.14'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - "~>"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '10.0'
|
33
|
+
name: rake
|
34
|
+
prerelease: false
|
35
|
+
type: :development
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '3.0'
|
47
|
+
name: rspec
|
48
|
+
prerelease: false
|
49
|
+
type: :development
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
name: awesome_print
|
62
|
+
prerelease: false
|
63
|
+
type: :development
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
name: rubocop
|
76
|
+
prerelease: false
|
77
|
+
type: :development
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
name: deep_merge
|
90
|
+
prerelease: false
|
91
|
+
type: :runtime
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
name: concurrent-ruby
|
104
|
+
prerelease: false
|
105
|
+
type: :runtime
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: A reimplementation of TensorFlow for ruby. This is a ground up implementation
|
112
|
+
with no dependency on TensorFlow. Effort has been made to make the programming style
|
113
|
+
as near to TensorFlow as possible, comes with a pure ruby evaluator by default as
|
114
|
+
well with support for an opencl evaluator.
|
115
|
+
email:
|
116
|
+
- joseph.dayo@gmail.com
|
117
|
+
executables: []
|
118
|
+
extensions: []
|
119
|
+
extra_rdoc_files: []
|
120
|
+
files:
|
121
|
+
- ".gitignore"
|
122
|
+
- ".rake_tasks~"
|
123
|
+
- ".rspec"
|
124
|
+
- ".travis.yml"
|
125
|
+
- CODE_OF_CONDUCT.md
|
126
|
+
- Gemfile
|
127
|
+
- LICENSE.txt
|
128
|
+
- README.md
|
129
|
+
- Rakefile
|
130
|
+
- bin/console
|
131
|
+
- bin/setup
|
132
|
+
- lib/tensor_stream.rb
|
133
|
+
- lib/tensor_stream/control_flow.rb
|
134
|
+
- lib/tensor_stream/evaluator/evaluator.rb
|
135
|
+
- lib/tensor_stream/evaluator/operation_helpers/random_gaussian.rb
|
136
|
+
- lib/tensor_stream/evaluator/ruby_evaluator.rb
|
137
|
+
- lib/tensor_stream/graph.rb
|
138
|
+
- lib/tensor_stream/graph_keys.rb
|
139
|
+
- lib/tensor_stream/helpers/op_helper.rb
|
140
|
+
- lib/tensor_stream/math_gradients.rb
|
141
|
+
- lib/tensor_stream/monkey_patches/integer.rb
|
142
|
+
- lib/tensor_stream/nn/nn_ops.rb
|
143
|
+
- lib/tensor_stream/operation.rb
|
144
|
+
- lib/tensor_stream/ops.rb
|
145
|
+
- lib/tensor_stream/placeholder.rb
|
146
|
+
- lib/tensor_stream/session.rb
|
147
|
+
- lib/tensor_stream/tensor.rb
|
148
|
+
- lib/tensor_stream/tensor_shape.rb
|
149
|
+
- lib/tensor_stream/train/gradient_descent_optimizer.rb
|
150
|
+
- lib/tensor_stream/train/saver.rb
|
151
|
+
- lib/tensor_stream/trainer.rb
|
152
|
+
- lib/tensor_stream/types.rb
|
153
|
+
- lib/tensor_stream/variable.rb
|
154
|
+
- lib/tensor_stream/version.rb
|
155
|
+
- samples/iris.data
|
156
|
+
- samples/iris.rb
|
157
|
+
- samples/linear_regression.rb
|
158
|
+
- samples/raw_neural_net_sample.rb
|
159
|
+
- tensor_stream.gemspec
|
160
|
+
homepage: http://www.github.com/jedld/tensor_stream
|
161
|
+
licenses:
|
162
|
+
- MIT
|
163
|
+
metadata:
|
164
|
+
allowed_push_host: https://rubygems.org
|
165
|
+
post_install_message:
|
166
|
+
rdoc_options: []
|
167
|
+
require_paths:
|
168
|
+
- lib
|
169
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
|
+
requirements:
|
176
|
+
- - ">="
|
177
|
+
- !ruby/object:Gem::Version
|
178
|
+
version: '0'
|
179
|
+
requirements: []
|
180
|
+
rubyforge_project:
|
181
|
+
rubygems_version: 2.6.13
|
182
|
+
signing_key:
|
183
|
+
specification_version: 4
|
184
|
+
summary: A Pure ruby tensorflow implementation
|
185
|
+
test_files: []
|