Skip to content

Commit 1fc240e

Browse files
lanpafacebook-github-bot
authored andcommitted
add tests for add_custom_scalars and others (pytorch#20987)
Summary: Originally, the tests for tensorboard writer are smoke tests only. This PR lets CI compare the output with expected results at low level. The randomness of the tensors in the test are also removed. ps. I found that how protobuf serializes data differs between different python environment. One method to solve this is to write the data and then read it back instantly. (compare the data at a higher level) For `add_custom_scalars`, the data to be written is a dictionary. and the serialized result might be different (not `ordereddict`). So only smoke test for that. Pull Request resolved: pytorch#20987 Reviewed By: NarineK, lanpa Differential Revision: D15804871 Pulled By: orionr fbshipit-source-id: 69324c11ff823b19960d50def73adff36eb4a2ac
1 parent 0d6eb20 commit 1fc240e

14 files changed

+259
-28
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
value {
2+
tag: "dummy"
3+
audio {
4+
sample_rate: 44100.0
5+
num_channels: 1
6+
length_frames: 42
7+
encoded_audio_string: "RIFFx\000\000\000WAVEfmt \020\000\000\000\001\000\001\000D\254\000\000\210X\001\000\002\000\020\000dataT\000\000\000\000\000\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177\377\177"
8+
content_type: "audio/wav"
9+
}
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
value {
2+
tag: "dummy"
3+
histo {
4+
max: 1023.0
5+
num: 1024.0
6+
sum: 523776.0
7+
sum_squares: 357389824.0
8+
bucket_limit: 0.0
9+
bucket_limit: 186.0
10+
bucket_limit: 372.0
11+
bucket_limit: 558.0
12+
bucket_limit: 744.0
13+
bucket_limit: 930.0
14+
bucket_limit: 1023.0
15+
bucket: 0.0
16+
bucket: 186.0
17+
bucket: 186.0
18+
bucket: 186.0
19+
bucket: 186.0
20+
bucket: 186.0
21+
bucket: 94.0
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
value {
2+
tag: "dummy"
3+
histo {
4+
max: 1023.0
5+
num: 1024.0
6+
sum: 523776.0
7+
sum_squares: 357389824.0
8+
bucket_limit: 0.0
9+
bucket_limit: 186.0
10+
bucket_limit: 372.0
11+
bucket_limit: 558.0
12+
bucket_limit: 744.0
13+
bucket_limit: 930.0
14+
bucket_limit: 1023.0
15+
bucket: 0.0
16+
bucket: 186.0
17+
bucket: 186.0
18+
bucket: 186.0
19+
bucket: 186.0
20+
bucket: 186.0
21+
bucket: 94.0
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
value {
2+
tag: "dummy"
3+
histo {
4+
max: 1023.0
5+
num: 1024.0
6+
sum: 523776.0
7+
sum_squares: 357389824.0
8+
bucket_limit: 0.0
9+
bucket_limit: 186.0
10+
bucket_limit: 372.0
11+
bucket_limit: 558.0
12+
bucket_limit: 744.0
13+
bucket_limit: 930.0
14+
bucket_limit: 1023.0
15+
bucket: 0.0
16+
bucket: 186.0
17+
bucket: 186.0
18+
bucket: 186.0
19+
bucket: 186.0
20+
bucket: 186.0
21+
bucket: 94.0
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
value {
2+
tag: "dummy"
3+
image {
4+
height: 8
5+
width: 16
6+
colorspace: 3
7+
encoded_image_string: "\211PNG\r\n\032\n\000\000\000\rIHDR\000\000\000\020\000\000\000\010\010\002\000\000\000\177\024\350\300\000\000\000+IDATx\234cd8\320\360\037\033pww\307*\316\362\343\307\217\037\330$~\374\370\361\037\233\004\013\016\365\377q\211\217H\r\000d\305y\224,\220Z\033\000\000\000\000IEND\256B`\202"
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
value {
2+
tag: "dummy"
3+
image {
4+
height: 32
5+
width: 32
6+
colorspace: 3
7+
encoded_image_string: "\211PNG\r\n\032\n\000\000\000\rIHDR\000\000\000 \000\000\000 \010\002\000\000\000\374\030\355\243\000\000\000sIDATx\234\355\323=\n\300 \014\005\340\027p\250\267p\324\373\332\373\345\020vn\007\367>0\204b\311\233\305/\344G\000\334\236\021Uu\005R\000\377\007\244\224\342\013||\007\2655\330BfP\215\337S`>:{_l\020\335\242\tX6-\000\032r\007G\316\000\2561\226\201\244\252/\005V\357\026\271\003\033\0149\000\232\270\003+\260\301\220\003\240y\000T\221\324V\250_v\320\000\000\000\000IEND\256B`\202"
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
value {
2+
tag: "dummy"
3+
image {
4+
height: 8
5+
width: 8
6+
colorspace: 3
7+
encoded_image_string: "\211PNG\r\n\032\n\000\000\000\rIHDR\000\000\000\010\000\000\000\010\010\002\000\000\000Km)\334\000\000\000\031IDATx\234cd``\370\217\r0\376\370\361\003\253\004\313\240\224\000\000;\267\273\313%\020=\255\000\000\000\000IEND\256B`\202"
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
value {
2+
tag: "dummy"
3+
image {
4+
height: 8
5+
width: 16
6+
colorspace: 3
7+
encoded_image_string: "\211PNG\r\n\032\n\000\000\000\rIHDR\000\000\000\020\000\000\000\010\010\002\000\000\000\177\024\350\300\000\000\000(IDATx\234cd``\370\217\r\034?~\034\2538\313\217\037?~\374\370\201)\201U\020\252\001\253\304\250\006$\000\000\230\346y\315\204l;t\000\000\000\000IEND\256B`\202"
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
value {
2+
tag: "dummy"
3+
image {
4+
height: 8
5+
width: 8
6+
colorspace: 3
7+
encoded_image_string: "\211PNG\r\n\032\n\000\000\000\rIHDR\000\000\000\010\000\000\000\010\010\002\000\000\000Km)\334\000\000\000\031IDATx\234cd``\370\217\r0\376\370\361\003\253\004\313\240\224\000\000;\267\273\313%\020=\255\000\000\000\000IEND\256B`\202"
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
value {
2+
tag: "tag"
3+
tensor {
4+
dtype: DT_FLOAT
5+
tensor_shape {
6+
dim {
7+
size: 6
8+
}
9+
dim {
10+
size: 1
11+
}
12+
}
13+
float_val: 57.0
14+
float_val: 43.0
15+
float_val: 0.0
16+
float_val: 0.0
17+
float_val: 0.57
18+
float_val: 1.0
19+
}
20+
metadata {
21+
plugin_data {
22+
plugin_name: "pr_curves"
23+
content: "\020\001"
24+
}
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
value {
2+
tag: "prcurve with raw data"
3+
tensor {
4+
dtype: DT_FLOAT
5+
tensor_shape {
6+
dim {
7+
size: 6
8+
}
9+
dim {
10+
size: 5
11+
}
12+
}
13+
float_val: 75.0
14+
float_val: 64.0
15+
float_val: 21.0
16+
float_val: 5.0
17+
float_val: 0.0
18+
float_val: 150.0
19+
float_val: 105.0
20+
float_val: 18.0
21+
float_val: 0.0
22+
float_val: 0.0
23+
float_val: 0.0
24+
float_val: 45.0
25+
float_val: 132.0
26+
float_val: 150.0
27+
float_val: 150.0
28+
float_val: 0.0
29+
float_val: 11.0
30+
float_val: 54.0
31+
float_val: 70.0
32+
float_val: 75.0
33+
float_val: 0.3333333
34+
float_val: 0.3786982
35+
float_val: 0.5384616
36+
float_val: 1.0
37+
float_val: 0.0
38+
float_val: 1.0
39+
float_val: 0.8533334
40+
float_val: 0.28
41+
float_val: 0.0666667
42+
float_val: 0.0
43+
}
44+
metadata {
45+
plugin_data {
46+
plugin_name: "pr_curves"
47+
content: "\020\001"
48+
}
49+
}
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
value {
2+
tag: "dummy/text_summary"
3+
tensor {
4+
dtype: DT_STRING
5+
tensor_shape {
6+
dim {
7+
size: 1
8+
}
9+
}
10+
string_val: "text 123"
11+
}
12+
metadata {
13+
plugin_data {
14+
plugin_name: "text"
15+
}
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
value {
2+
tag: "dummy"
3+
image {
4+
height: 16
5+
width: 16
6+
colorspace: 1
7+
encoded_image_string: "GIF89a\020\000\020\000\207\000\000\377\377\377\376\376\376\375\375\375\374\374\374\373\373\373\372\372\372\371\371\371\370\370\370\367\367\367\366\366\366\365\365\365\364\364\364\363\363\363\362\362\362\361\361\361\360\360\360\357\357\357\356\356\356\355\355\355\354\354\354\353\353\353\352\352\352\351\351\351\350\350\350\347\347\347\346\346\346\345\345\345\344\344\344\343\343\343\342\342\342\341\341\341\340\340\340\337\337\337\336\336\336\335\335\335\334\334\334\333\333\333\332\332\332\331\331\331\330\330\330\327\327\327\326\326\326\325\325\325\324\324\324\323\323\323\322\322\322\321\321\321\320\320\320\317\317\317\316\316\316\315\315\315\314\314\314\313\313\313\312\312\312\311\311\311\310\310\310\307\307\307\306\306\306\305\305\305\304\304\304\303\303\303\302\302\302\301\301\301\300\300\300\277\277\277\276\276\276\275\275\275\274\274\274\273\273\273\272\272\272\271\271\271\270\270\270\267\267\267\266\266\266\265\265\265\264\264\264\263\263\263\262\262\262\261\261\261\260\260\260\257\257\257\256\256\256\255\255\255\254\254\254\253\253\253\252\252\252\251\251\251\250\250\250\247\247\247\246\246\246\245\245\245\244\244\244\243\243\243\242\242\242\241\241\241\240\240\240\237\237\237\236\236\236\235\235\235\234\234\234\233\233\233\232\232\232\231\231\231\230\230\230\227\227\227\226\226\226\225\225\225\224\224\224\223\223\223\222\222\222\221\221\221\220\220\220\217\217\217\216\216\216\215\215\215\214\214\214\213\213\213\212\212\212\211\211\211\210\210\210\207\207\207\206\206\206\205\205\205\204\204\204\203\203\203\202\202\202\201\201\201\200\200\200\177\177\177~~~}}}|||{{{zzzyyyxxxwwwvvvuuutttsssrrrqqqpppooonnnmmmlllkkkjjjiiihhhgggfffeeedddcccbbbaaa```___^^^]]]\\\\\\[[[ZZZYYYXXXWWWVVVUUUTTTSSSRRRQQQPPPOOONNNMMMLLLKKKJJJIIIHHHGGGFFFEEEDDDCCCBBBAAA@@@???>>>===<<<;;;:::999888777666555444333222111000///...---,,,+++***)))(((\'\'\'&&&%%%$$$###\"\"\"!!! \037\037\037\036\036\036\035\035\035\034\034\034\033\033\033\032\032\032\031\031\031\030\030\030\027\027\027\026\026\026\025\025\025\024\024\024\023\023\023\022\022\022\021\021\021\020\020\020\017\017\017\016\016\016\r\r\r\014\014\014\013\013\013\n\n\n\t\t\t\010\010\010\007\007\007\006\006\006\005\005\005\004\004\004\003\003\003\002\002\002\001\001\001\000\000\000!\377\013NETSCAPE2.0\003\001\377\377\000!\371\004\010\031\000\000\000,\000\000\000\000\020\000\020\000\000\010\377\000\377\001\010 `\000\201\002\006~\001\013&l\030\261b\306\016 H\240`\001\203\006\016\216!K\246l\031\263f\316\036@\210 a\002\205\n\026\236A\213&m\032\265j\326.`\310\240a\003\207\016\036\256a\313\246m\033\267n\336>\200\010!b\004\211\022&\276\201\013\'n\034\271r\346N\240H\241b\005\213\026.\316\241K\247n\035\273v\356^\300\210!c\006\215\0326\336\301\213\'o\036\275z\366n\340\310\241c\007\217\036>\356\341\313\247o\037\277~\376\376\000\n$h\020\241B\206~\000\t\"d\010\221\"F\016!J\244h\021\243F\216\216 I\242d\t\223&N\036A\212$i\022\245J\226\236@\211\"e\n\225*V.a\312\244i\023\247N\236\256`\311\242e\013\227.^>\201\n%j\024\251R\246\276\200\t#f\014\2312fN\241J\245j\025\253V\256\316\240I\243f\r\2336n^\301%\212%k\026\255Z\266\336\300\211#g\016\235:vn\341\312\245k\027\257^\276\356\340\311\243g\017\037\200}\374\004\004\000!\371\004\010\031\000\000\000,\000\000\000\000\020\000\020\000\000\010\377\000\177\000\t\"d\010\221\"F\376\001\010 `\000\201\002\006\216 I\242d\t\223&N\016 H\240`\001\203\006\016\236@\211\"e\n\225*V\036@\210 a\002\205\n\026\256`\311\242e\013\227.^.`\310\240a\003\207\016\036\276\200\t#f\014\2312f>\200\010!b\004\211\022&\316\240I\243f\r\2336nN\240H\241b\005\213\026.\336\300\211#g\016\235:v^\300\210!c\006\215\0326\356\340\311\243g\017\237>~n\340\310\241c\007\217\036>~\001\013&l\030\261b\306\376\000\n$h\020\241B\206\216!K\246l\031\263f\316\016!J\244h\021\243F\216\236A\213&m\032\265j\326\036A\212$i\022\245J\226\256a\313\246m\033\267n\336.a\312\244i\023\247N\236\276\201\013\'n\034\271r\346>\201\n%j\024\251R\246\316\241K\247n\035\273v\356N\241J\245j\025\253V\256\336\301%\213\'o\036\275z\366^\301\212%k\026\255Z\266\356\341\313\247o\037\277~\376n\341\312\245k\027/\200\275|\005\004\000!\371\004\010\031\000\000\000,\000\000\000\000\020\000\020\000\000\010\377\000\377\000\n$h\020\241B\206~\000\t\"d\010\221\"F\016!J\244h\021\243F\216\216 I\242d\t\223&N\036A\212$i\022\245J\226\236@\211\"e\n\225*V.a\312\244i\023\247N\236\256`\311\242e\013\227.^>\201\n%j\024\251R\246\276\200\t#f\014\2312fN\241J\245j\025\253V\256\316\240I\243f\r\2336n^\301\212%k\026\255Z\266\336\300\211#g\016\235:vn\341\312\245k\027\257^\276\356\340\311\243g\017\237>~\376\001\010 `\000\201\002\006~\001\013&l\030\261b\306\016 H\240`\001\203\006\016\216!K\246l\031\263f\316\036@\210 a\002\205\n\026\236A\213&m\032\265j\326.`\310\240a\003\207\016\036\256a\313\246m\033\267n\336>\200\010!b\004\211\022&\276\201\013\'n\034\271r\346N\240H\241b\005\213\026.\316\241K\247n\035\273v\356^\300%\210!c\006\215\0326\336\301\213\'o\036\275z\366n\340\310\241c\007\217\036>\356\341\313\247o\037?\200\375\374\005\004\000;"
8+
}
9+
}

test/test_tensorboard.py

+33-28
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@
4242
import torch
4343
from common_utils import TestCase, run_tests
4444

45+
def tensor_N(shape, dtype=float):
46+
numel = np.prod(shape)
47+
x = (np.arange(numel, dtype=dtype)).reshape(shape)
48+
return x
4549

4650
class BaseTestCase(TestCase):
4751
""" Base class used for all TensorBoard tests """
@@ -315,31 +319,31 @@ def test_empty_input(self):
315319

316320
def test_image_with_boxes(self):
317321
self.assertTrue(compare_proto(summary.image_boxes('dummy',
318-
np.random.rand(3, 32, 32).astype(np.float32),
322+
tensor_N(shape=(3, 32, 32)),
319323
np.array([[10, 10, 40, 40]])),
320324
self))
321325

322326
def test_image_with_one_channel(self):
323327
self.assertTrue(compare_proto(summary.image('dummy',
324-
np.random.rand(1, 8, 8).astype(np.float32),
328+
tensor_N(shape=(1, 8, 8)),
325329
dataformats='CHW'),
326330
self)) # noqa E127
327331

328332
def test_image_with_one_channel_batched(self):
329333
self.assertTrue(compare_proto(summary.image('dummy',
330-
np.random.rand(2, 1, 8, 8).astype(np.float32),
334+
tensor_N(shape=(2, 1, 8, 8)),
331335
dataformats='NCHW'),
332336
self)) # noqa E127
333337

334338
def test_image_with_3_channel_batched(self):
335339
self.assertTrue(compare_proto(summary.image('dummy',
336-
np.random.rand(2, 3, 8, 8).astype(np.float32),
340+
tensor_N(shape=(2, 3, 8, 8)),
337341
dataformats='NCHW'),
338342
self)) # noqa E127
339343

340344
def test_image_without_channel(self):
341345
self.assertTrue(compare_proto(summary.image('dummy',
342-
np.random.rand(8, 8).astype(np.float32),
346+
tensor_N(shape=(8, 8)),
343347
dataformats='HW'),
344348
self)) # noqa E127
345349

@@ -348,56 +352,57 @@ def test_video(self):
348352
import moviepy # noqa F401
349353
except ImportError:
350354
return
351-
self.assertTrue(compare_proto(summary.video('dummy', np.random.rand(4, 3, 1, 8, 8).astype(np.float32)), self))
352-
summary.video('dummy', np.random.rand(16, 48, 1, 28, 28).astype(np.float32))
353-
summary.video('dummy', np.random.rand(20, 7, 1, 8, 8).astype(np.float32))
355+
self.assertTrue(compare_proto(summary.video('dummy', tensor_N(shape=(4, 3, 1, 8, 8))), self))
356+
summary.video('dummy', np.random.rand(16, 48, 1, 28, 28))
357+
summary.video('dummy', np.random.rand(20, 7, 1, 8, 8))
354358

355359
def test_audio(self):
356-
self.assertTrue(compare_proto(summary.audio('dummy', np.random.rand(42)), self))
360+
self.assertTrue(compare_proto(summary.audio('dummy', tensor_N(shape=(42,))), self))
357361

358362
def test_text(self):
359363
self.assertTrue(compare_proto(summary.text('dummy', 'text 123'), self))
360364

361365
def test_histogram_auto(self):
362-
self.assertTrue(compare_proto(summary.histogram('dummy', np.random.rand(1024), bins='auto', max_bins=5), self))
366+
self.assertTrue(compare_proto(summary.histogram('dummy', tensor_N(shape=(1024,)), bins='auto', max_bins=5), self))
363367

364368
def test_histogram_fd(self):
365-
self.assertTrue(compare_proto(summary.histogram('dummy', np.random.rand(1024), bins='fd', max_bins=5), self))
369+
self.assertTrue(compare_proto(summary.histogram('dummy', tensor_N(shape=(1024,)), bins='fd', max_bins=5), self))
366370

367371
def test_histogram_doane(self):
368-
self.assertTrue(compare_proto(summary.histogram('dummy', np.random.rand(1024), bins='doane', max_bins=5), self))
372+
self.assertTrue(compare_proto(summary.histogram('dummy', tensor_N(shape=(1024,)), bins='doane', max_bins=5), self))
373+
374+
def test_custom_scalars(self):
375+
layout = {'Taiwan': {'twse': ['Multiline', ['twse/0050', 'twse/2330']]},
376+
'USA': {'dow': ['Margin', ['dow/aaa', 'dow/bbb', 'dow/ccc']],
377+
'nasdaq': ['Margin', ['nasdaq/aaa', 'nasdaq/bbb', 'nasdaq/ccc']]}}
378+
summary.custom_scalars(layout) # only smoke test. Because protobuf in python2/3 serialize dictionary differently.
369379

370380
def remove_whitespace(string):
371381
return string.replace(' ', '').replace('\t', '').replace('\n', '')
372382

373383
def compare_proto(str_to_compare, function_ptr):
374-
# TODO: enable test after tensorboard is ready.
375-
return True
376-
if 'histogram' in function_ptr.id():
377-
return # numpy.histogram has slight difference between versions
378-
379-
if 'pr_curve' in function_ptr.id():
380-
return # pr_curve depends on numpy.histogram
381384

382385
module_id = function_ptr.__class__.__module__
386+
test_dir = os.path.dirname(sys.modules[module_id].__file__)
383387
functionName = function_ptr.id().split('.')[-1]
384-
test_file = os.path.realpath(sys.modules[module_id].__file__)
385-
expected_file = os.path.join(os.path.dirname(test_file),
388+
expected_file = os.path.join(test_dir,
386389
"expect",
387-
module_id.split('.')[-1] + '.' + functionName + ".expect")
390+
'TestTensorBoard.' + functionName + ".expect")
391+
388392
assert os.path.exists(expected_file)
389393
with open(expected_file) as f:
390394
expected = f.read()
391395
str_to_compare = str(str_to_compare)
396+
# if not remove_whitespace(str_to_compare) == remove_whitespace(expected):
392397
return remove_whitespace(str_to_compare) == remove_whitespace(expected)
393398

394399
def write_proto(str_to_compare, function_ptr):
395400
module_id = function_ptr.__class__.__module__
401+
test_dir = os.path.dirname(sys.modules[module_id].__file__)
396402
functionName = function_ptr.id().split('.')[-1]
397-
test_file = os.path.realpath(sys.modules[module_id].__file__)
398-
expected_file = os.path.join(os.path.dirname(test_file),
403+
expected_file = os.path.join(test_dir,
399404
"expect",
400-
module_id.split('.')[-1] + '.' + functionName + ".expect")
405+
'TestTensorBoard.' + functionName + ".expect")
401406
with open(expected_file, 'w') as f:
402407
f.write(str(str_to_compare))
403408

@@ -414,7 +419,7 @@ def forward(self, x):
414419
return self.l(x)
415420

416421
with SummaryWriter(comment='LinearModel') as w:
417-
w.add_graph(myLinear(), dummy_input, True)
422+
w.add_graph(myLinear(), dummy_input)
418423

419424
def test_mlp_graph(self):
420425
dummy_input = (torch.zeros(2, 1, 28, 28),)
@@ -442,7 +447,7 @@ def forward(self, x, update_batch_stats=True):
442447
return h
443448

444449
with SummaryWriter(comment='MLPModel') as w:
445-
w.add_graph(myMLP(), dummy_input, True)
450+
w.add_graph(myMLP(), dummy_input)
446451

447452
def test_wrong_input_size(self):
448453
with self.assertRaises(RuntimeError) as e_info:
@@ -527,7 +532,7 @@ def test_scalar(self):
527532

528533
@skipIfNoCaffe2
529534
def test_caffe2_np(self):
530-
workspace.FeedBlob("testBlob", np.random.randn(1, 3, 64, 64).astype(np.float32))
535+
workspace.FeedBlob("testBlob", tensor_N(shape=(1, 3, 64, 64)))
531536
self.assertIsInstance(make_np('testBlob'), np.ndarray)
532537

533538
@skipIfNoCaffe2

0 commit comments

Comments
 (0)