tensor_stream 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +1 -0
- data/Gemfile +1 -1
- data/LICENSE.txt +1 -1
- data/README.md +34 -34
- data/Rakefile +3 -3
- data/USAGE_GUIDE.md +235 -0
- data/bin/stubgen +20 -0
- data/exe/model_utils +2 -2
- data/lib/tensor_stream.rb +45 -44
- data/lib/tensor_stream/constant.rb +2 -2
- data/lib/tensor_stream/control_flow.rb +1 -1
- data/lib/tensor_stream/debugging/debugging.rb +2 -2
- data/lib/tensor_stream/dynamic_stitch.rb +2 -2
- data/lib/tensor_stream/evaluator/base_evaluator.rb +18 -18
- data/lib/tensor_stream/evaluator/buffer.rb +1 -1
- data/lib/tensor_stream/evaluator/evaluator.rb +2 -2
- data/lib/tensor_stream/evaluator/operation_helpers/array_ops_helper.rb +41 -41
- data/lib/tensor_stream/evaluator/operation_helpers/math_helper.rb +1 -1
- data/lib/tensor_stream/evaluator/ruby/array_ops.rb +39 -39
- data/lib/tensor_stream/evaluator/ruby/check_ops.rb +2 -2
- data/lib/tensor_stream/evaluator/ruby/images_ops.rb +18 -18
- data/lib/tensor_stream/evaluator/ruby/math_ops.rb +13 -14
- data/lib/tensor_stream/evaluator/ruby/nn_ops.rb +33 -36
- data/lib/tensor_stream/evaluator/ruby/random_ops.rb +20 -21
- data/lib/tensor_stream/evaluator/ruby_evaluator.rb +36 -49
- data/lib/tensor_stream/exceptions.rb +1 -1
- data/lib/tensor_stream/generated_stub/ops.rb +691 -0
- data/lib/tensor_stream/generated_stub/stub_file.erb +24 -0
- data/lib/tensor_stream/graph.rb +18 -18
- data/lib/tensor_stream/graph_builder.rb +17 -17
- data/lib/tensor_stream/graph_deserializers/protobuf.rb +97 -97
- data/lib/tensor_stream/graph_deserializers/yaml_loader.rb +1 -1
- data/lib/tensor_stream/graph_keys.rb +3 -3
- data/lib/tensor_stream/graph_serializers/graphml.rb +33 -33
- data/lib/tensor_stream/graph_serializers/packer.rb +23 -23
- data/lib/tensor_stream/graph_serializers/pbtext.rb +38 -42
- data/lib/tensor_stream/graph_serializers/serializer.rb +3 -2
- data/lib/tensor_stream/graph_serializers/yaml.rb +5 -5
- data/lib/tensor_stream/helpers/infer_shape.rb +56 -56
- data/lib/tensor_stream/helpers/op_helper.rb +8 -9
- data/lib/tensor_stream/helpers/string_helper.rb +15 -15
- data/lib/tensor_stream/helpers/tensor_mixins.rb +17 -17
- data/lib/tensor_stream/images.rb +1 -1
- data/lib/tensor_stream/initializer.rb +1 -1
- data/lib/tensor_stream/math_gradients.rb +28 -187
- data/lib/tensor_stream/monkey_patches/array.rb +1 -1
- data/lib/tensor_stream/monkey_patches/float.rb +1 -1
- data/lib/tensor_stream/monkey_patches/integer.rb +1 -1
- data/lib/tensor_stream/monkey_patches/op_patch.rb +5 -5
- data/lib/tensor_stream/monkey_patches/patch.rb +1 -1
- data/lib/tensor_stream/nn/nn_ops.rb +17 -15
- data/lib/tensor_stream/op_maker.rb +180 -0
- data/lib/tensor_stream/operation.rb +17 -17
- data/lib/tensor_stream/ops.rb +95 -384
- data/lib/tensor_stream/ops/add.rb +23 -0
- data/lib/tensor_stream/ops/argmax.rb +14 -0
- data/lib/tensor_stream/ops/argmin.rb +14 -0
- data/lib/tensor_stream/ops/case.rb +17 -0
- data/lib/tensor_stream/ops/cast.rb +15 -0
- data/lib/tensor_stream/ops/ceil.rb +15 -0
- data/lib/tensor_stream/ops/const.rb +0 -0
- data/lib/tensor_stream/ops/cos.rb +10 -0
- data/lib/tensor_stream/ops/div.rb +21 -0
- data/lib/tensor_stream/ops/equal.rb +15 -0
- data/lib/tensor_stream/ops/expand_dims.rb +17 -0
- data/lib/tensor_stream/ops/fill.rb +19 -0
- data/lib/tensor_stream/ops/floor.rb +15 -0
- data/lib/tensor_stream/ops/floor_div.rb +15 -0
- data/lib/tensor_stream/ops/greater.rb +11 -0
- data/lib/tensor_stream/ops/greater_equal.rb +11 -0
- data/lib/tensor_stream/ops/less_equal.rb +15 -0
- data/lib/tensor_stream/ops/log.rb +14 -0
- data/lib/tensor_stream/ops/mat_mul.rb +60 -0
- data/lib/tensor_stream/ops/max.rb +15 -0
- data/lib/tensor_stream/ops/min.rb +15 -0
- data/lib/tensor_stream/ops/mod.rb +23 -0
- data/lib/tensor_stream/ops/mul.rb +21 -0
- data/lib/tensor_stream/ops/negate.rb +14 -0
- data/lib/tensor_stream/ops/ones_like.rb +19 -0
- data/lib/tensor_stream/ops/pow.rb +25 -0
- data/lib/tensor_stream/ops/prod.rb +60 -0
- data/lib/tensor_stream/ops/random_uniform.rb +18 -0
- data/lib/tensor_stream/ops/range.rb +20 -0
- data/lib/tensor_stream/ops/rank.rb +13 -0
- data/lib/tensor_stream/ops/reshape.rb +24 -0
- data/lib/tensor_stream/ops/round.rb +15 -0
- data/lib/tensor_stream/ops/shape.rb +14 -0
- data/lib/tensor_stream/ops/sigmoid.rb +10 -0
- data/lib/tensor_stream/ops/sign.rb +12 -0
- data/lib/tensor_stream/ops/sin.rb +10 -0
- data/lib/tensor_stream/ops/size.rb +16 -0
- data/lib/tensor_stream/ops/sub.rb +24 -0
- data/lib/tensor_stream/ops/sum.rb +27 -0
- data/lib/tensor_stream/ops/tan.rb +12 -0
- data/lib/tensor_stream/ops/tanh.rb +10 -0
- data/lib/tensor_stream/ops/tile.rb +19 -0
- data/lib/tensor_stream/ops/zeros.rb +15 -0
- data/lib/tensor_stream/placeholder.rb +2 -2
- data/lib/tensor_stream/profile/report_tool.rb +3 -3
- data/lib/tensor_stream/session.rb +36 -38
- data/lib/tensor_stream/tensor.rb +2 -2
- data/lib/tensor_stream/tensor_shape.rb +4 -4
- data/lib/tensor_stream/train/adadelta_optimizer.rb +8 -8
- data/lib/tensor_stream/train/adagrad_optimizer.rb +3 -3
- data/lib/tensor_stream/train/adam_optimizer.rb +11 -11
- data/lib/tensor_stream/train/learning_rate_decay.rb +2 -2
- data/lib/tensor_stream/train/momentum_optimizer.rb +7 -7
- data/lib/tensor_stream/train/optimizer.rb +9 -9
- data/lib/tensor_stream/train/rmsprop_optimizer.rb +16 -16
- data/lib/tensor_stream/train/saver.rb +14 -14
- data/lib/tensor_stream/train/slot_creator.rb +6 -6
- data/lib/tensor_stream/train/utils.rb +12 -12
- data/lib/tensor_stream/trainer.rb +10 -10
- data/lib/tensor_stream/types.rb +1 -1
- data/lib/tensor_stream/utils.rb +33 -32
- data/lib/tensor_stream/utils/freezer.rb +5 -5
- data/lib/tensor_stream/variable.rb +5 -5
- data/lib/tensor_stream/variable_scope.rb +1 -1
- data/lib/tensor_stream/version.rb +1 -1
- data/samples/{iris.data → datasets/iris.data} +0 -0
- data/samples/jupyter_notebooks/linear_regression.ipynb +463 -0
- data/samples/{iris.rb → neural_networks/iris.rb} +21 -23
- data/samples/{mnist_data.rb → neural_networks/mnist_data.rb} +8 -8
- data/samples/neural_networks/raw_neural_net_sample.rb +112 -0
- data/samples/{rnn.rb → neural_networks/rnn.rb} +28 -31
- data/samples/{nearest_neighbor.rb → others/nearest_neighbor.rb} +12 -12
- data/samples/regression/linear_regression.rb +63 -0
- data/samples/{logistic_regression.rb → regression/logistic_regression.rb} +14 -16
- data/tensor_stream.gemspec +9 -8
- metadata +89 -19
- data/data_1.json +0 -4764
- data/data_2.json +0 -4764
- data/data_actual.json +0 -28
- data/data_expected.json +0 -28
- data/data_input.json +0 -28
- data/samples/error.graphml +0 -2755
- data/samples/gradient_sample.graphml +0 -1255
- data/samples/linear_regression.rb +0 -69
- data/samples/multigpu.rb +0 -73
- data/samples/raw_neural_net_sample.rb +0 -112
@@ -1,7 +1,7 @@
|
|
1
1
|
module TensorStream
|
2
2
|
class GraphKeys
|
3
|
-
GLOBAL_VARIABLES =
|
4
|
-
TRAINABLE_VARIABLES =
|
5
|
-
GLOBAL_STEP =
|
3
|
+
GLOBAL_VARIABLES = "variables".freeze
|
4
|
+
TRAINABLE_VARIABLES = "trainable_variables".freeze
|
5
|
+
GLOBAL_STEP = "global_step".freeze
|
6
6
|
end
|
7
7
|
end
|
@@ -48,7 +48,7 @@ module TensorStream
|
|
48
48
|
private
|
49
49
|
|
50
50
|
def add_to_group(groups, name, arr_buf)
|
51
|
-
name_parts = name.split(
|
51
|
+
name_parts = name.split("/")
|
52
52
|
return false if name_parts.size < 2
|
53
53
|
|
54
54
|
prefix = name_parts.shift
|
@@ -67,35 +67,35 @@ module TensorStream
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def find_or_create_group(prefix, groups)
|
70
|
-
|
71
|
-
groups[prefix] = {
|
70
|
+
unless groups[prefix]
|
71
|
+
groups[prefix] = {buf: [], group: {}}
|
72
72
|
end
|
73
73
|
|
74
|
-
|
74
|
+
groups[prefix]
|
75
75
|
end
|
76
76
|
|
77
77
|
def create_group(id, title, group)
|
78
78
|
arr_buf = []
|
79
79
|
arr_buf << "<node id=\"#{id}\" yfiles.foldertype=\"group\">"
|
80
80
|
arr_buf << '<data key="d9">'
|
81
|
-
arr_buf <<
|
81
|
+
arr_buf << "<y:ProxyAutoBoundsNode>"
|
82
82
|
arr_buf << '<y:Realizers active="0">'
|
83
|
-
arr_buf <<
|
83
|
+
arr_buf << "<y:GroupNode>"
|
84
84
|
arr_buf << '<y:Fill color="#CAECFF84" transparent="false"/>'
|
85
85
|
arr_buf << '<y:BorderStyle color="#666699" type="dotted" width="1.0"/>'
|
86
|
-
arr_buf << '<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#99CCFF" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="67.18603515625" x="-8.593017578125" y="0.0">' + title +
|
86
|
+
arr_buf << '<y:NodeLabel alignment="right" autoSizePolicy="node_width" backgroundColor="#99CCFF" borderDistance="0.0" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasLineColor="false" height="21.4609375" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="67.18603515625" x="-8.593017578125" y="0.0">' + title + "</y:NodeLabel>"
|
87
87
|
arr_buf << '<y:Shape type="roundrectangle"/>'
|
88
|
-
arr_buf <<
|
89
|
-
arr_buf <<
|
90
|
-
arr_buf <<
|
91
|
-
arr_buf <<
|
88
|
+
arr_buf << "</y:GroupNode>"
|
89
|
+
arr_buf << "</y:Realizers>"
|
90
|
+
arr_buf << "</y:ProxyAutoBoundsNode>"
|
91
|
+
arr_buf << "</data>"
|
92
92
|
arr_buf << '<graph edgedefault="directed" id="n105:">'
|
93
93
|
arr_buf << group[:buf]
|
94
94
|
group[:group].each do |k, g|
|
95
95
|
arr_buf << create_group(k, k, g)
|
96
96
|
end
|
97
|
-
arr_buf <<
|
98
|
-
arr_buf <<
|
97
|
+
arr_buf << "</graph>"
|
98
|
+
arr_buf << "</node>"
|
99
99
|
arr_buf
|
100
100
|
end
|
101
101
|
|
@@ -120,17 +120,17 @@ module TensorStream
|
|
120
120
|
end
|
121
121
|
node_buf << "<data key=\"d9\">"
|
122
122
|
node_buf << "<y:ShapeNode>"
|
123
|
-
if tensor.internal?
|
124
|
-
|
123
|
+
node_buf << if tensor.internal?
|
124
|
+
" <y:Fill color=\"#FFFF99\" transparent=\"false\"/>"
|
125
125
|
else
|
126
|
-
|
126
|
+
" <y:Fill color=\"#99CC00\" transparent=\"false\"/>"
|
127
127
|
end
|
128
128
|
node_buf << " <y:NodeLabel alignment=\"center\">#{tensor.operation}</y:NodeLabel>"
|
129
129
|
node_buf << "</y:ShapeNode>"
|
130
130
|
node_buf << "</data>"
|
131
131
|
node_buf << "</node>"
|
132
132
|
|
133
|
-
|
133
|
+
unless add_to_group(groups, tensor.name, node_buf)
|
134
134
|
add_to_group(groups, "program/#{tensor.name}", node_buf)
|
135
135
|
end
|
136
136
|
|
@@ -176,10 +176,10 @@ module TensorStream
|
|
176
176
|
input_buf << "<y:ShapeNode>"
|
177
177
|
|
178
178
|
input_buf << if input.internal?
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
179
|
+
" <y:Fill color=\"#C0C0C0\" transparent=\"false\"/>"
|
180
|
+
else
|
181
|
+
" <y:Fill color=\"#FFFFFF\" transparent=\"false\"/>"
|
182
|
+
end
|
183
183
|
|
184
184
|
input_buf << " <y:NodeLabel alignment=\"center\">#{input.name}</y:NodeLabel>"
|
185
185
|
|
@@ -204,7 +204,7 @@ module TensorStream
|
|
204
204
|
end
|
205
205
|
|
206
206
|
def _gml_string(str)
|
207
|
-
str.tr(
|
207
|
+
str.tr("/", "-")
|
208
208
|
end
|
209
209
|
|
210
210
|
def output_edge(input, tensor, arr_buf, index = 0)
|
@@ -215,22 +215,22 @@ module TensorStream
|
|
215
215
|
arr_buf << "<y:PolyLineEdge>"
|
216
216
|
arr_buf << "<y:EdgeLabel >"
|
217
217
|
arr_buf << if !@last_session_context.empty?
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
218
|
+
"<![CDATA[ #{_val(input)} ]]>"
|
219
|
+
elsif input.shape.shape.nil?
|
220
|
+
"<![CDATA[ #{input.data_type} ? ]]>"
|
221
|
+
else
|
222
|
+
"<![CDATA[ #{input.data_type} #{input.shape.shape.empty? ? "scalar" : input.shape.shape.to_json} ]]>"
|
223
|
+
end
|
224
224
|
arr_buf << "</y:EdgeLabel >"
|
225
225
|
arr_buf << "<y:Arrows source=\"none\" target=\"standard\"/>"
|
226
226
|
arr_buf << if index.zero?
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
227
|
+
"<y:LineStyle color=\"#FF0000\" type=\"line\" width=\"1.0\"/>"
|
228
|
+
else
|
229
|
+
"<y:LineStyle color=\"#0000FF\" type=\"line\" width=\"1.0\"/>"
|
230
|
+
end
|
231
231
|
arr_buf << "</y:PolyLineEdge>"
|
232
232
|
arr_buf << "</data>"
|
233
233
|
arr_buf << "</edge>"
|
234
234
|
end
|
235
235
|
end
|
236
|
-
end
|
236
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "base64"
|
2
2
|
|
3
3
|
module TensorStream
|
4
4
|
# Utility class to handle data type serialization
|
@@ -7,36 +7,36 @@ module TensorStream
|
|
7
7
|
value = value.is_a?(Array) ? value.flatten : [value]
|
8
8
|
byte_value = case data_type
|
9
9
|
when :float64
|
10
|
-
value.pack(
|
10
|
+
value.pack("d*")
|
11
11
|
when :float32, :float16, :float
|
12
|
-
value.pack(
|
12
|
+
value.pack("f*")
|
13
13
|
when :uint32
|
14
|
-
value.pack(
|
14
|
+
value.pack("L*")
|
15
15
|
when :int32, :int
|
16
|
-
value.pack(
|
16
|
+
value.pack("l*")
|
17
17
|
when :int64
|
18
|
-
value.pack(
|
18
|
+
value.pack("q*")
|
19
19
|
when :uint64
|
20
|
-
value.pack(
|
20
|
+
value.pack("Q*")
|
21
21
|
when :uint8
|
22
|
-
value.pack(
|
22
|
+
value.pack("C*")
|
23
23
|
when :boolean
|
24
|
-
value.map { |v| v ? 1 : 0 }.pack(
|
24
|
+
value.map { |v| v ? 1 : 0 }.pack("C*")
|
25
25
|
when :string
|
26
26
|
if value.is_a?(Array)
|
27
|
-
|
27
|
+
value.to_yaml
|
28
28
|
else
|
29
|
-
|
29
|
+
value
|
30
30
|
end
|
31
31
|
else
|
32
|
-
|
33
|
-
|
32
|
+
raise "unknown type #{data_type}"
|
33
|
+
end
|
34
34
|
|
35
35
|
byte_value
|
36
36
|
end
|
37
37
|
|
38
38
|
def self.pack_to_str(value, data_type)
|
39
|
-
pack(value, data_type).bytes.map { |b|
|
39
|
+
pack(value, data_type).bytes.map { |b| /[^[:print:]]/.match?(b.chr) ? "\\#{sprintf("%o", b).rjust(3, "0")}" : b.chr }.join
|
40
40
|
end
|
41
41
|
|
42
42
|
def self.unpack_from_str(content, data_type)
|
@@ -47,22 +47,22 @@ module TensorStream
|
|
47
47
|
def self.unpack(unpacked, data_type)
|
48
48
|
case data_type
|
49
49
|
when :float32, :float, :float16
|
50
|
-
unpacked.unpack(
|
50
|
+
unpacked.unpack("f*")
|
51
51
|
when :float64
|
52
|
-
unpacked.unpack(
|
52
|
+
unpacked.unpack("d*")
|
53
53
|
when :int32, :int
|
54
|
-
unpacked.unpack(
|
54
|
+
unpacked.unpack("L*")
|
55
55
|
when :uint32
|
56
|
-
unpacked.unpack(
|
56
|
+
unpacked.unpack("l*")
|
57
57
|
when :int64
|
58
|
-
unpacked.unpack(
|
58
|
+
unpacked.unpack("q*")
|
59
59
|
when :uint64
|
60
|
-
unpacked.unpack(
|
60
|
+
unpacked.unpack("Q*")
|
61
61
|
when :uint8
|
62
|
-
unpacked.unpack(
|
62
|
+
unpacked.unpack("C*")
|
63
63
|
when :boolean
|
64
|
-
unpacked.unpack(
|
64
|
+
unpacked.unpack("C*").map { |v| v == 1 }
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
68
|
-
end
|
68
|
+
end
|
@@ -12,10 +12,10 @@ module TensorStream
|
|
12
12
|
|
13
13
|
node_keys.each do |k|
|
14
14
|
node = if block_given?
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
yield graph, k
|
16
|
+
else
|
17
|
+
graph.get_tensor_by_name(k)
|
18
|
+
end
|
19
19
|
|
20
20
|
@lines << "node {"
|
21
21
|
@lines << " name: #{node.name.to_json}"
|
@@ -27,13 +27,13 @@ module TensorStream
|
|
27
27
|
@lines << " input: #{input.name.to_json}"
|
28
28
|
end
|
29
29
|
# type
|
30
|
-
pb_attr(
|
30
|
+
pb_attr("T", "type: #{sym_to_protobuf_type(node.data_type)}")
|
31
31
|
|
32
32
|
case node.operation.to_s
|
33
|
-
when
|
34
|
-
pb_attr(
|
35
|
-
when
|
36
|
-
pb_attr(
|
33
|
+
when "const"
|
34
|
+
pb_attr("value", tensor_value(node))
|
35
|
+
when "variable_v2"
|
36
|
+
pb_attr("shape", shape_buf(node, "shape"))
|
37
37
|
end
|
38
38
|
process_options(node)
|
39
39
|
end
|
@@ -50,7 +50,7 @@ module TensorStream
|
|
50
50
|
def process_options(node)
|
51
51
|
return if node.options.nil?
|
52
52
|
node.options.reject { |_k, v| v.nil? }.each do |k, v|
|
53
|
-
next if %w[name internal_name data_type].include?(k.to_s) || k.to_s.start_with?(
|
53
|
+
next if %w[name internal_name data_type].include?(k.to_s) || k.to_s.start_with?("__")
|
54
54
|
@lines << " attr {"
|
55
55
|
@lines << " key: \"#{k}\""
|
56
56
|
@lines << " value {"
|
@@ -63,55 +63,51 @@ module TensorStream
|
|
63
63
|
def attr_value(val, indent = 0)
|
64
64
|
spaces = " " * indent
|
65
65
|
case val.class.to_s
|
66
|
-
when
|
66
|
+
when "TrueClass", "FalseClass"
|
67
67
|
@lines << "#{spaces}b: #{val}"
|
68
|
-
when
|
68
|
+
when "Integer"
|
69
69
|
@lines << "#{spaces}i: #{val}"
|
70
|
-
when
|
70
|
+
when "String",
|
71
71
|
@lines << "#{spaces}s: #{val}"
|
72
|
-
when
|
72
|
+
when "Float"
|
73
73
|
@lines << "#{spaces}f: #{val}"
|
74
|
-
when
|
74
|
+
when "Symbol"
|
75
75
|
@lines << "#{spaces}sym: #{val}"
|
76
|
-
when
|
76
|
+
when "Array"
|
77
77
|
@lines << "#{spaces}list {"
|
78
78
|
val.each do |v_item|
|
79
79
|
attr_value(v_item, indent + 2)
|
80
80
|
end
|
81
81
|
@lines << "#{spaces}}"
|
82
|
-
when
|
82
|
+
when "TensorStream::TensorShape"
|
83
83
|
@lines << "#{spaces}shape {"
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
@lines << "#{spaces} }"
|
89
|
-
end
|
84
|
+
val.shape&.each do |dim|
|
85
|
+
@lines << "#{spaces} dim {"
|
86
|
+
@lines << "#{spaces} size: #{dim}"
|
87
|
+
@lines << "#{spaces} }"
|
90
88
|
end
|
91
89
|
@lines << "#{spaces}}"
|
92
|
-
when
|
90
|
+
when "TensorStream::Variable"
|
93
91
|
else
|
94
92
|
raise "unknown type #{val.class}"
|
95
93
|
end
|
96
94
|
end
|
97
95
|
|
98
96
|
def pack_arr_float(float_arr)
|
99
|
-
float_arr.flatten.pack(
|
97
|
+
float_arr.flatten.pack("f*").bytes.map { |b| /[^[:print:]]/.match?(b.chr) ? "\\#{sprintf("%o", b).rjust(3, "0")}" : b.chr }.join
|
100
98
|
end
|
101
99
|
|
102
100
|
def pack_arr_int(int_arr)
|
103
|
-
int_arr.flatten.pack(
|
101
|
+
int_arr.flatten.pack("l*").bytes.map { |b| /[^[:print:]]/.match?(b.chr) ? "\\#{sprintf("%o", b).rjust(3, "0")}" : b.chr }.join
|
104
102
|
end
|
105
103
|
|
106
|
-
def shape_buf(tensor, shape_type =
|
104
|
+
def shape_buf(tensor, shape_type = "tensor_shape")
|
107
105
|
arr = []
|
108
106
|
arr << " #{shape_type} {"
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
arr << " }"
|
114
|
-
end
|
107
|
+
tensor.shape.shape&.each do |dim|
|
108
|
+
arr << " dim {"
|
109
|
+
arr << " size: #{dim}"
|
110
|
+
arr << " }"
|
115
111
|
end
|
116
112
|
arr << " }"
|
117
113
|
arr
|
@@ -140,14 +136,14 @@ module TensorStream
|
|
140
136
|
end
|
141
137
|
else
|
142
138
|
val_type = if TensorStream::Ops::INTEGER_TYPES.include?(tensor.data_type)
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
139
|
+
"int_val"
|
140
|
+
elsif TensorStream::Ops::FLOATING_POINT_TYPES.include?(tensor.data_type)
|
141
|
+
"float_val"
|
142
|
+
elsif tensor.data_type == :string
|
143
|
+
"string_val"
|
144
|
+
else
|
145
|
+
"val"
|
146
|
+
end
|
151
147
|
arr << " #{val_type}: #{tensor.const_value.to_json}"
|
152
148
|
end
|
153
149
|
arr << "}"
|
@@ -186,4 +182,4 @@ module TensorStream
|
|
186
182
|
@lines << " }"
|
187
183
|
end
|
188
184
|
end
|
189
|
-
end
|
185
|
+
end
|
@@ -12,10 +12,10 @@ module TensorStream
|
|
12
12
|
|
13
13
|
node_keys.each do |k|
|
14
14
|
node = if block_given?
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
yield graph, k
|
16
|
+
else
|
17
|
+
graph.get_tensor_by_name(k)
|
18
|
+
end
|
19
19
|
next unless node.is_a?(Operation)
|
20
20
|
|
21
21
|
serialized_arr << node.to_h
|
@@ -24,4 +24,4 @@ module TensorStream
|
|
24
24
|
serialized_arr.to_yaml
|
25
25
|
end
|
26
26
|
end
|
27
|
-
end
|
27
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "tensor_stream/evaluator/operation_helpers/array_ops_helper"
|
2
2
|
module TensorStream
|
3
3
|
##
|
4
4
|
# Convenience class for guessing the shape of a tensor
|
@@ -9,18 +9,35 @@ module TensorStream
|
|
9
9
|
|
10
10
|
def self.infer_shape(tensor)
|
11
11
|
case tensor.operation
|
12
|
+
when :assign
|
13
|
+
possible_shape = if tensor.inputs[0]&.shape&.shape
|
14
|
+
tensor.inputs[0].shape.shape
|
15
|
+
else
|
16
|
+
tensor.inputs[1].shape.shape
|
17
|
+
end
|
18
|
+
|
19
|
+
possible_shape
|
20
|
+
when :const
|
21
|
+
shape_eval(tensor.options[:value])
|
22
|
+
when :variable_v2
|
23
|
+
tensor.shape ? tensor.shape.shape : nil
|
24
|
+
when :placeholder
|
25
|
+
return nil if tensor.inputs[0].nil?
|
26
|
+
return tensor.inputs[0].shape.shape if tensor.inputs.size == 1
|
27
|
+
|
28
|
+
TensorShape.infer_shape(tensor.inputs[0].shape.shape, tensor.inputs[1].shape.shape) if tensor.inputs.size == 2 && tensor.inputs[0] && tensor.inputs[1]
|
12
29
|
when :case, :case_grad
|
13
|
-
tensor.inputs[2]
|
30
|
+
tensor.inputs[2]&.shape&.shape
|
14
31
|
when :const
|
15
32
|
shape_eval(tensor.options[:value])
|
16
33
|
when :variable_v2
|
17
34
|
tensor.shape ? tensor.shape.shape : nil
|
18
35
|
when :assign
|
19
|
-
possible_shape = if tensor.inputs[0]
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
36
|
+
possible_shape = if tensor.inputs[0]&.shape&.shape
|
37
|
+
tensor.inputs[0].shape.shape
|
38
|
+
else
|
39
|
+
tensor.inputs[1].shape.shape
|
40
|
+
end
|
24
41
|
|
25
42
|
possible_shape
|
26
43
|
when :index
|
@@ -39,11 +56,11 @@ module TensorStream
|
|
39
56
|
|
40
57
|
axis = tensor.inputs[1].nil? ? 0 : tensor.inputs[1].const_value
|
41
58
|
new_shape = tensor.inputs[0].shape.shape
|
42
|
-
new_shape.each_with_index.collect
|
59
|
+
new_shape.each_with_index.collect { |shape, index|
|
43
60
|
next nil if index == axis
|
44
61
|
|
45
62
|
shape
|
46
|
-
|
63
|
+
}.compact
|
47
64
|
when :mean, :prod, :sum, :arg_max
|
48
65
|
return [] if tensor.inputs[1].nil?
|
49
66
|
return nil if tensor.inputs[0].nil?
|
@@ -58,24 +75,14 @@ module TensorStream
|
|
58
75
|
axis = [axis] unless axis.is_a?(Array)
|
59
76
|
axis = axis.map { |a| a < 0 ? rank - a.abs : a }
|
60
77
|
|
61
|
-
input_shape.each_with_index.map
|
78
|
+
input_shape.each_with_index.map { |item, index|
|
62
79
|
if axis.include?(index)
|
63
80
|
next 1 if tensor.options[:keepdims]
|
64
81
|
|
65
82
|
next nil
|
66
83
|
end
|
67
84
|
item
|
68
|
-
|
69
|
-
when :reshape
|
70
|
-
new_shape = tensor.inputs[1] && tensor.inputs[1].const_value ? tensor.inputs[1].const_value : nil
|
71
|
-
return nil if new_shape.nil?
|
72
|
-
return nil if tensor.inputs[0].shape.nil?
|
73
|
-
|
74
|
-
input_shape = tensor.inputs[0].shape.shape
|
75
|
-
return new_shape if input_shape.nil? && !new_shape.include?(-1) && !new_shape.include?(nil)
|
76
|
-
return nil if input_shape.nil? || input_shape.include?(nil)
|
77
|
-
|
78
|
-
TensorShape.fix_inferred_elements(new_shape, input_shape.reduce(:*))
|
85
|
+
}.compact
|
79
86
|
when :flow_group
|
80
87
|
[]
|
81
88
|
when :zeros, :ones, :fill, :random_standard_normal, :random_uniform, :truncated_normal
|
@@ -94,28 +101,6 @@ module TensorStream
|
|
94
101
|
size = tensor.inputs[0].shape.shape.reduce(:*) || 1
|
95
102
|
dummy_tensor_for_shape = TensorShape.reshape(Array.new(size), tensor.inputs[0].shape)
|
96
103
|
shape_eval(arr_pad(dummy_tensor_for_shape, tensor.inputs[1].const_value))
|
97
|
-
when :mat_mul
|
98
|
-
return nil if tensor.inputs[0].shape.shape.nil? || tensor.inputs[1].shape.shape.nil?
|
99
|
-
return [] if tensor.inputs[0].shape.shape.empty? || tensor.inputs[1].shape.shape.empty?
|
100
|
-
return nil if tensor.inputs[0].shape.shape.size != 2 || tensor.inputs[1].shape.shape.size != 2
|
101
|
-
|
102
|
-
shape1, m = if tensor.options[:transpose_a]
|
103
|
-
[tensor.inputs[0].shape.shape[0], tensor.inputs[0].shape.shape[1]]
|
104
|
-
else
|
105
|
-
[tensor.inputs[0].shape.shape[1], tensor.inputs[0].shape.shape[0]]
|
106
|
-
end
|
107
|
-
|
108
|
-
shape2, n = if tensor.options[:transpose_b]
|
109
|
-
[tensor.inputs[1].shape.shape[1], tensor.inputs[1].shape.shape[0]]
|
110
|
-
else
|
111
|
-
[tensor.inputs[1].shape.shape[0], tensor.inputs[1].shape.shape[1]]
|
112
|
-
end
|
113
|
-
|
114
|
-
return nil if shape1.nil? || shape2.nil? || shape1 < 0 || shape2 < 0
|
115
|
-
|
116
|
-
raise TensorStream::ValueError, "incompatible shape sizes for matrix multiplication (#{shape1} != #{shape2}) #{tensor.inputs[0].shape.shape} vs #{tensor.inputs[1].shape.shape}" if shape1 != shape2
|
117
|
-
|
118
|
-
[m, n]
|
119
104
|
when :transpose
|
120
105
|
return nil unless shape_full_specified(tensor.inputs[0])
|
121
106
|
return nil if tensor.inputs[1].is_a?(Tensor)
|
@@ -152,10 +137,6 @@ module TensorStream
|
|
152
137
|
new_shape
|
153
138
|
when :slice, :squeeze
|
154
139
|
nil
|
155
|
-
when :tile
|
156
|
-
nil
|
157
|
-
when :expand_dims
|
158
|
-
nil
|
159
140
|
when :broadcast_gradient_args
|
160
141
|
nil
|
161
142
|
when :no_op
|
@@ -168,8 +149,6 @@ module TensorStream
|
|
168
149
|
return [tensor.inputs[0].const_value, tensor.inputs[1].const_value] if tensor.inputs[0].const_value && tensor.inputs[1].const_value
|
169
150
|
|
170
151
|
nil
|
171
|
-
when :size
|
172
|
-
[]
|
173
152
|
when :unstack
|
174
153
|
return nil unless tensor.inputs[0].shape.known?
|
175
154
|
|
@@ -190,10 +169,10 @@ module TensorStream
|
|
190
169
|
strides = tensor.options[:strides]
|
191
170
|
|
192
171
|
case tensor.options[:padding]
|
193
|
-
when
|
172
|
+
when "SAME"
|
194
173
|
new_shape[1] /= strides[1]
|
195
174
|
new_shape[2] /= strides[2]
|
196
|
-
when
|
175
|
+
when "VALID"
|
197
176
|
new_shape[1] = (new_shape[1] - tensor.inputs[1].shape.shape[0]) / strides[1] + 1
|
198
177
|
new_shape[2] = (new_shape[2] - tensor.inputs[1].shape.shape[1]) / strides[2] + 1
|
199
178
|
else
|
@@ -206,11 +185,32 @@ module TensorStream
|
|
206
185
|
|
207
186
|
tensor.inputs[0].const_value
|
208
187
|
else
|
209
|
-
|
210
|
-
return tensor.inputs[0].shape.shape if tensor.inputs.size == 1
|
211
|
-
|
212
|
-
TensorShape.infer_shape(tensor.inputs[0].shape.shape, tensor.inputs[1].shape.shape) if tensor.inputs.size == 2 && tensor.inputs[0] && tensor.inputs[1]
|
188
|
+
TensorStream::OpMaker.infer_shape(self, tensor)
|
213
189
|
end
|
214
190
|
end
|
191
|
+
|
192
|
+
def self._infer_reduction_op_shape(tensor)
|
193
|
+
return [] if tensor.inputs[1].nil?
|
194
|
+
return nil if tensor.inputs[0].nil?
|
195
|
+
return nil unless tensor.inputs[0].shape.known?
|
196
|
+
|
197
|
+
input_shape = tensor.inputs[0].shape.shape
|
198
|
+
rank = input_shape.size
|
199
|
+
|
200
|
+
axis = tensor.inputs[1].const_value
|
201
|
+
return nil if axis.nil?
|
202
|
+
|
203
|
+
axis = [axis] unless axis.is_a?(Array)
|
204
|
+
axis = axis.map { |a| a < 0 ? rank - a.abs : a }
|
205
|
+
|
206
|
+
input_shape.each_with_index.map { |item, index|
|
207
|
+
if axis.include?(index)
|
208
|
+
next 1 if tensor.options[:keepdims]
|
209
|
+
|
210
|
+
next nil
|
211
|
+
end
|
212
|
+
item
|
213
|
+
}.compact
|
214
|
+
end
|
215
215
|
end
|
216
|
-
end
|
216
|
+
end
|