Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MegEngine 天元
MegEngine
提交
40d18c89
MegEngine
项目概览
MegEngine 天元
/
MegEngine
1 年多 前同步成功
通知
403
Star
4705
Fork
582
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
MegEngine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
40d18c89
编写于
8月 26, 2020
作者:
M
Megvii Engine Team
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(mge/imperative): fix tests when shape is tensor
GitOrigin-RevId: fd0095c1ec5f0d9e326606ceeca721c5970cd96d
上级
ea71e5c9
变更
16
隐藏空白更改
内联
并排
Showing
16 changed file
with
191 addition
and
57 deletion
+191
-57
imperative/python/megengine/core/_trace_option.py
imperative/python/megengine/core/_trace_option.py
+28
-0
imperative/python/megengine/core/tensor/indexing.py
imperative/python/megengine/core/tensor/indexing.py
+34
-8
imperative/python/megengine/core/tensor/tensor_wrapper.py
imperative/python/megengine/core/tensor/tensor_wrapper.py
+35
-21
imperative/python/megengine/core/tensor/utils.py
imperative/python/megengine/core/tensor/utils.py
+20
-0
imperative/python/megengine/functional/loss.py
imperative/python/megengine/functional/loss.py
+3
-2
imperative/python/megengine/functional/nn.py
imperative/python/megengine/functional/nn.py
+11
-4
imperative/python/megengine/functional/tensor.py
imperative/python/megengine/functional/tensor.py
+4
-3
imperative/python/megengine/module/batchnorm.py
imperative/python/megengine/module/batchnorm.py
+2
-2
imperative/python/megengine/module/module.py
imperative/python/megengine/module/module.py
+6
-3
imperative/python/test/integration/test_save_load.py
imperative/python/test/integration/test_save_load.py
+3
-0
imperative/python/test/unit/functional/test_functional.py
imperative/python/test/unit/functional/test_functional.py
+17
-4
imperative/python/test/unit/functional/test_tensor.py
imperative/python/test/unit/functional/test_tensor.py
+3
-0
imperative/python/test/unit/test_indexing_op.py
imperative/python/test/unit/test_indexing_op.py
+13
-10
imperative/python/test/unit/test_loss.py
imperative/python/test/unit/test_loss.py
+7
-0
imperative/python/test/unit/test_module.py
imperative/python/test/unit/test_module.py
+4
-0
imperative/python/test/unit/test_serialization.py
imperative/python/test/unit/test_serialization.py
+1
-0
未找到文件。
imperative/python/megengine/core/_trace_option.py
0 → 100644
浏览文件 @
40d18c89
# -*- coding: utf-8 -*-
# MegEngine is Licensed under the Apache License, Version 2.0 (the "License")
#
# Copyright (c) 2014-2020 Megvii Inc. All rights reserved.
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
import
os
_use_tensor_shape
=
False
if
os
.
environ
.
get
(
"MEGENGINE_USE_TENSOR_SHAPE"
):
_use_tensor_shape
=
True
def
use_tensor_shape
()
->
bool
:
"""Returns whether tensor.shape returns a tensor instead of a tuple
"""
return
_use_tensor_shape
def
set_tensor_shape
(
option
:
bool
):
""" Sets whether tensor.shape returns a tensor instead of a tuple
"""
global
_use_tensor_shape
_use_tensor_shape
=
option
imperative/python/megengine/core/tensor/indexing.py
浏览文件 @
40d18c89
...
...
@@ -6,11 +6,15 @@
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
from
typing
import
Iterable
import
numpy
as
np
from
.._trace_option
import
use_tensor_shape
from
..ops
import
builtin
from
..ops.special
import
Const
from
.core
import
TensorBase
,
TensorWrapperBase
,
apply
from
.utils
import
astensor1d
,
make_shape_tuple
def
remove_ellipsis
(
tensor
,
tuple_val
):
...
...
@@ -35,8 +39,9 @@ def remove_ellipsis(tensor, tuple_val):
)
# XXX: assume same results during trace
def
check_bool_index
(
tensor
,
tuple_val
):
cur_shape
=
tensor
.
shape
cur_shape
=
make_shape_tuple
(
tensor
.
shape
)
new_tuple_val
=
[]
offset
=
0
tdim
=
0
...
...
@@ -44,20 +49,35 @@ def check_bool_index(tensor, tuple_val):
if
hasattr
(
i
,
"dtype"
)
and
i
.
dtype
==
np
.
bool_
:
if
i
.
ndim
>
1
:
tot
=
i
.
ndim
ishape
=
make_shape_tuple
(
i
.
shape
)
for
j
in
range
(
i
.
ndim
):
if
cur_shape
[
tdim
+
j
-
offset
]
!=
i
.
shape
[
j
]:
if
cur_shape
[
tdim
+
j
-
offset
]
!=
ishape
[
j
]:
raise
IndexError
(
"boolean index did not match tensor along dimension {}; dimension is {} but corresponding boolean dimension is {}"
.
format
(
tdim
+
j
,
cur_shape
[
tdim
+
j
-
offset
],
i
.
shape
[
j
]
tdim
+
j
,
cur_shape
[
tdim
+
j
-
offset
],
ishape
[
j
]
)
)
i
=
i
.
reshape
(
-
1
)
cur_shape
=
(
cur_shape
[:
idx
]
+
(
i
.
shape
[
0
],)
+
cur_shape
[
tdim
+
tot
-
offset
:]
)
if
not
use_tensor_shape
():
cur_shape
=
(
cur_shape
[:
idx
]
+
(
i
.
shape
[
0
],)
+
cur_shape
[
tdim
+
tot
-
offset
:]
)
else
:
# XXX: use only for trace
new_shape
=
[]
for
ii
in
range
(
idx
):
new_shape
.
append
(
tensor
.
shape
[
ii
])
new_shape
.
append
(
i
.
shape
[
0
])
for
ii
in
range
(
tdim
+
tot
-
offset
,
len
(
cur_shape
)):
new_shape
.
append
(
cur_shape
[
ii
])
cur_shape
=
astensor1d
(
new_shape
)
offset
+=
1
tensor
=
tensor
.
reshape
(
cur_shape
)
tdim
+=
tot
if
use_tensor_shape
():
cur_shape
=
make_shape_tuple
(
cur_shape
)
new_tuple_val
.
append
(
i
)
else
:
new_tuple_val
.
append
(
i
)
...
...
@@ -177,7 +197,9 @@ def unpack_getitem(inp, tuple_val, *, allow_newaxis=True):
def
try_condtake
(
tensor
,
index
):
if
not
hasattr
(
index
,
"dtype"
)
or
not
hasattr
(
index
,
"shape"
):
return
[]
if
index
.
dtype
!=
np
.
bool_
or
index
.
shape
!=
tensor
.
shape
:
if
index
.
dtype
!=
np
.
bool_
or
make_shape_tuple
(
index
.
shape
)
!=
make_shape_tuple
(
tensor
.
shape
):
return
[]
if
isinstance
(
index
,
np
.
ndarray
):
(
index
,)
=
Const
(
index
,
dtype
=
np
.
bool_
,
device
=
tensor
.
device
)(
tensor
)
...
...
@@ -197,6 +219,8 @@ def getitem(tensor, index):
return
try_result
[
0
]
tensor
,
tensors
,
items
,
use_subtensor
=
unpack_getitem
(
tensor
,
index
)
for
v
in
tensors
:
if
isinstance
(
v
.
shape
,
v
.
__class__
):
break
if
v
.
shape
[
0
]
==
0
:
(
empty_tensor
,)
=
Const
([],
dtype
=
tensor
.
dtype
,
device
=
tensor
.
device
)(
tensor
...
...
@@ -230,7 +254,9 @@ def setitem(tensor, index, value):
else
:
op
=
builtin
.
IndexingMultiAxisVec
(
items
=
items
)
(
tmp_result
,)
=
apply
(
op
,
tensor
,
*
tensors
)
if
value
.
shape
!=
tmp_result
.
shape
:
# XXX: broadcast can always be applied even if shapes are equal
if
make_shape_tuple
(
value
.
shape
)
!=
make_shape_tuple
(
tmp_result
.
shape
):
for
i
in
range
(
min
(
len
(
value
.
shape
),
len
(
tmp_result
.
shape
))):
if
(
value
.
shape
[
-
i
-
1
]
!=
1
...
...
imperative/python/megengine/core/tensor/tensor_wrapper.py
浏览文件 @
40d18c89
...
...
@@ -11,7 +11,9 @@ import collections
import
numpy
as
np
from
.._trace_option
import
use_tensor_shape
from
..ops
import
builtin
from
..ops.builtin
import
GetVarShape
from
..ops.special
import
Const
from
.
import
utils
from
.core
import
OpBase
,
TensorBase
,
TensorWrapperBase
,
apply
...
...
@@ -19,6 +21,7 @@ from .indexing import getitem as _getitem
from
.indexing
import
setitem
as
_setitem
from
.raw_tensor
import
RawTensor
,
as_raw_tensor
from
.tensor
import
Tensor
from
.utils
import
make_shape_tuple
as
_make_shape_tuple
def
_elwise
(
*
args
,
mode
):
...
...
@@ -60,11 +63,10 @@ def _broadcast(inp, shape):
def
_reshape
(
x
,
shape
):
if
isinstance
(
shape
,
(
TensorBase
,
TensorWrapperBase
)):
shape
=
shape
.
numpy
()
shape
=
tuple
(
map
(
int
,
shape
))
shape_tuple
=
_make_shape_tuple
(
shape
)
unspec_axis
=
None
for
i
,
s
in
enumerate
(
shape
):
# XXX: assume unspec_axis is not changed in trace
for
i
,
s
in
enumerate
(
shape_tuple
):
if
s
<
0
:
if
s
!=
-
1
:
raise
ValueError
(
"expect shape[{}] >= -1, got {}"
.
format
(
i
,
s
))
...
...
@@ -72,8 +74,10 @@ def _reshape(x, shape):
raise
ValueError
(
"multiple -1 in shape: {} & {}"
.
format
(
unspec_axis
,
i
))
unspec_axis
=
i
# TODO: device should be None (cpu)
(
shape
,)
=
Const
(
shape
,
dtype
=
np
.
int32
,
device
=
x
.
device
)(
x
)
if
not
isinstance
(
shape
,
(
TensorBase
,
TensorWrapperBase
)):
# TODO: device should be None (cpu)
(
shape
,)
=
Const
(
shape
,
dtype
=
np
.
int32
,
device
=
x
.
device
)(
x
)
if
unspec_axis
is
None
:
op
=
builtin
.
Reshape
()
else
:
...
...
@@ -159,6 +163,13 @@ def _todo(*_):
raise
NotImplementedError
def
_expand_args
(
args
):
if
len
(
args
)
==
1
:
if
isinstance
(
args
[
0
],
(
collections
.
Sequence
,
TensorBase
,
TensorWrapperBase
)):
args
=
args
[
0
]
return
args
class
ArrayMethodMixin
(
abc
.
ABC
):
__array_priority__
=
233333
...
...
@@ -251,6 +262,8 @@ class ArrayMethodMixin(abc.ABC):
def
__len__
(
self
):
shape
=
self
.
shape
if
use_tensor_shape
():
shape
=
shape
.
numpy
()
if
shape
:
return
int
(
shape
[
0
])
raise
TypeError
(
"ndim is 0"
)
...
...
@@ -271,10 +284,16 @@ class ArrayMethodMixin(abc.ABC):
@
property
def
ndim
(
self
):
return
len
(
self
.
shape
)
shape
=
self
.
shape
# XXX: assume ndim is not changed during trace
if
isinstance
(
shape
,
self
.
__class__
):
shape
=
shape
.
numpy
()
return
len
(
shape
)
@
property
def
size
(
self
):
if
use_tensor_shape
():
return
self
.
shape
.
prod
()
return
np
.
prod
(
self
.
shape
).
item
()
@
property
...
...
@@ -283,7 +302,8 @@ class ArrayMethodMixin(abc.ABC):
def
item
(
self
,
*
args
):
if
not
args
:
assert
self
.
size
==
1
if
isinstance
(
self
.
size
,
int
):
assert
self
.
size
==
1
return
self
.
numpy
().
item
()
return
self
[
args
].
item
()
...
...
@@ -294,24 +314,15 @@ class ArrayMethodMixin(abc.ABC):
return
utils
.
astype
(
self
,
dtype
)
def
reshape
(
self
,
*
args
):
if
len
(
args
)
==
1
:
if
isinstance
(
args
[
0
],
collections
.
Sequence
):
args
=
args
[
0
]
return
_reshape
(
self
,
args
)
return
_reshape
(
self
,
_expand_args
(
args
))
def
broadcast
(
self
,
*
args
):
if
len
(
args
)
==
1
:
if
isinstance
(
args
[
0
],
collections
.
Sequence
):
args
=
args
[
0
]
return
_broadcast
(
self
,
args
)
return
_broadcast
(
self
,
_expand_args
(
args
))
def
transpose
(
self
,
*
args
):
if
not
args
:
args
=
reversed
(
range
(
self
.
ndim
))
elif
len
(
args
)
==
1
:
if
isinstance
(
args
[
0
],
collections
.
Sequence
):
args
=
args
[
0
]
return
_transpose
(
self
,
args
)
return
_transpose
(
self
,
_expand_args
(
args
))
def
flatten
(
self
):
return
self
.
reshape
(
-
1
)
...
...
@@ -339,7 +350,10 @@ class GenericTensorWrapper(ArrayMethodMixin, TensorWrapperBase):
@
property
def
shape
(
self
):
return
self
.
__wrapped__
.
shape
if
use_tensor_shape
():
return
apply
(
GetVarShape
(),
self
)[
0
]
else
:
return
self
.
__wrapped__
.
shape
@
property
def
device
(
self
):
...
...
imperative/python/megengine/core/tensor/utils.py
浏览文件 @
40d18c89
...
...
@@ -152,3 +152,23 @@ def astensor1d(x, *reference, dtype=None, device=None):
(
x
,)
=
Const
(
x
,
dtype
=
dtype
,
device
=
device
)(
*
reference
)
return
x
def
_expand_int
(
s
,
i
):
if
isinstance
(
i
,
(
TensorBase
,
TensorWrapperBase
)):
s
+=
list
(
i
.
numpy
())
return
if
isinstance
(
i
,
Iterable
):
for
ii
in
i
:
_expand_int
(
s
,
ii
)
return
if
np
.
issubdtype
(
type
(
i
),
np
.
integer
):
s
.
append
(
i
)
return
raise
def
make_shape_tuple
(
shape
):
s
=
[]
_expand_int
(
s
,
shape
)
return
tuple
(
s
)
imperative/python/megengine/functional/loss.py
浏览文件 @
40d18c89
...
...
@@ -8,6 +8,7 @@
# "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
import
numpy
as
np
from
..core.tensor.utils
import
make_shape_tuple
from
..tensor
import
Tensor
from
.elemwise
import
abs
,
eq
,
exp
,
log
,
maximum
,
pow
,
relu
from
.nn
import
assert_equal
,
indexing_one_hot
...
...
@@ -179,7 +180,7 @@ def cross_entropy_with_softmax(
pred
=
pred
-
offset
down
=
exp
(
pred
).
sum
(
axis
=
axis
)
up
=
pred
[
np
.
arange
(
pred
.
shape
[
0
]),
label
]
up
=
indexing_one_hot
(
pred
,
label
,
axis
)
if
label_smooth
!=
0
:
factor
=
label_smooth
/
num_classes
...
...
@@ -238,7 +239,7 @@ def binary_cross_entropy(pred: Tensor, label: Tensor) -> Tensor:
:param label: (N,*), same shape as the input.
"""
assert
pred
.
shape
==
label
.
shape
assert
make_shape_tuple
(
pred
.
shape
)
==
make_shape_tuple
(
label
.
shape
)
return
-
1.0
*
(
label
*
log
(
pred
)
+
(
1.0
-
label
)
*
log
(
1
-
pred
)).
mean
()
...
...
imperative/python/megengine/functional/nn.py
浏览文件 @
40d18c89
...
...
@@ -14,7 +14,7 @@ from ..core.ops import builtin
from
..core.ops._internal
import
param_defs
as
P
from
..core.ops.special
import
Const
from
..core.tensor
import
utils
from
..core.tensor.core
import
apply
from
..core.tensor.core
import
TensorBase
,
TensorWrapperBase
,
apply
from
..distributed
import
WORLD
,
is_distributed
from
..random
import
uniform
from
..tensor
import
Tensor
...
...
@@ -623,7 +623,7 @@ def batch_norm2d(
from
.tensor
import
expand_dims
,
squeeze
,
broadcast
def
full
(
value
):
N
,
C
,
H
,
W
=
data
.
shape
C
=
data
.
shape
[
1
]
(
x
,)
=
Const
(
value
,
dtype
=
data
.
dtype
,
device
=
data
.
device
)(
data
)
return
broadcast
(
x
,
[
1
,
C
,
1
,
1
])
...
...
@@ -1126,8 +1126,11 @@ def interpolate(
if
mode
==
"LINEAR"
:
inp
=
add_axis
(
inp
,
3
)
if
len
(
inp
.
shape
)
!=
4
:
raise
ValueError
(
"shape of input tensor must correspond to the operartion mode"
)
if
not
isinstance
(
inp
.
shape
,
inp
.
__class__
):
if
len
(
inp
.
shape
)
!=
4
:
raise
ValueError
(
"shape of input tensor must correspond to the operartion mode"
)
if
size
is
None
:
if
scale_factor
is
None
:
...
...
@@ -1438,7 +1441,11 @@ def indexing_one_hot(
[1.]
"""
assert
isinstance
(
src
,
(
TensorWrapperBase
,
TensorBase
)
),
"src must be of Tensor type"
op
=
builtin
.
IndexingOneHot
(
axis
=
axis
)
index
=
utils
.
convert_single_value
(
index
,
(
src
,),
dtype
=
"int32"
)
(
result
,)
=
apply
(
op
,
src
,
index
)
if
not
keepdims
:
result
=
remove_axis
(
result
,
axis
)
...
...
imperative/python/megengine/functional/tensor.py
浏览文件 @
40d18c89
...
...
@@ -274,9 +274,10 @@ def stack(inps, axis=0):
[ 9. 10. 11.]]]
"""
shapes
=
{
arr
.
shape
for
arr
in
inps
}
if
len
(
shapes
)
!=
1
:
raise
ValueError
(
"All input tensors must have the same shape"
)
if
len
(
inps
)
>
0
and
not
isinstance
(
inps
[
0
].
shape
,
inps
[
0
].
__class__
):
shapes
=
{
arr
.
shape
for
arr
in
inps
}
if
len
(
shapes
)
!=
1
:
raise
ValueError
(
"All input tensors must have the same shape"
)
inps
=
[
add_axis
(
inp
,
axis
=
axis
)
for
inp
in
inps
]
return
concat
(
inps
,
axis
=
axis
)
...
...
imperative/python/megengine/module/batchnorm.py
浏览文件 @
40d18c89
...
...
@@ -147,10 +147,10 @@ class SyncBatchNorm(_BatchNorm):
if
_ndims
!=
4
:
origin_shape
=
inp
.
shapeof
()
if
_ndims
==
2
:
n
,
c
=
inp
.
shape
of
(
0
),
inp
.
shapeof
(
1
)
n
,
c
=
inp
.
shape
[
0
],
inp
.
shape
[
1
]
new_shape
=
(
n
,
c
,
1
,
1
)
elif
_ndims
==
3
:
n
,
c
,
h
=
inp
.
shape
of
(
0
),
inp
.
shapeof
(
1
),
inp
.
shapeof
(
2
)
n
,
c
,
h
=
inp
.
shape
[
0
],
inp
.
shape
[
1
],
inp
.
shape
[
2
]
new_shape
=
(
n
,
c
,
h
,
1
)
inp
=
inp
.
reshape
(
new_shape
)
...
...
imperative/python/megengine/module/module.py
浏览文件 @
40d18c89
...
...
@@ -12,6 +12,7 @@ from typing import Any, Callable, Iterable, Optional, Set, Tuple, Union
import
numpy
as
np
from
..core.tensor.dtype
import
is_quantize
from
..core.tensor.utils
import
make_shape_tuple
from
..logger
import
get_logger
from
..tensor
import
Tensor
from
..tensor_nn
import
Buffer
,
Parameter
...
...
@@ -355,7 +356,9 @@ class Module(metaclass=ABCMeta):
seen
.
add
(
hash_id
)
if
isinstance
(
module_dict
[
key
],
Parameter
):
if
start_pos
+
offset
in
params
:
assert
module_dict
[
key
].
shape
==
params
[
start_pos
+
offset
].
shape
assert
make_shape_tuple
(
module_dict
[
key
].
shape
)
==
make_shape_tuple
(
params
[
start_pos
+
offset
].
shape
)
module_dict
[
key
]
=
params
[
start_pos
+
offset
]
offset
+=
1
if
isinstance
(
module_dict
[
key
],
Module
):
...
...
@@ -493,8 +496,8 @@ class Module(metaclass=ABCMeta):
),
"closure should return a `np.ndarray`, now `{}` get {}"
.
format
(
k
,
to_be_load
)
assert
(
var
.
shape
==
to_be_load
.
shape
assert
make_shape_tuple
(
var
.
shape
)
==
make_shape_tuple
(
to_be_load
.
shape
),
"param `{}` shape mismatch, should be {}, get {}"
.
format
(
k
,
var
.
shape
,
to_be_load
.
shape
)
...
...
imperative/python/test/integration/test_save_load.py
浏览文件 @
40d18c89
...
...
@@ -45,6 +45,7 @@ def test_save_load():
# Load param to cpu
checkpoint
=
mge
.
load
(
model_name
,
map_location
=
"cpu0"
)
device_save
=
mge
.
get_default_device
()
mge
.
set_default_device
(
"cpu0"
)
net
=
Simple
()
net
.
load_state_dict
(
checkpoint
[
"state_dict"
])
...
...
@@ -57,3 +58,5 @@ def test_save_load():
optim
.
backward
(
loss
)
optim
.
step
()
# Restore device
mge
.
set_default_device
(
device_save
)
imperative/python/test/unit/functional/test_functional.py
浏览文件 @
40d18c89
...
...
@@ -14,7 +14,9 @@ import pytest
import
megengine.core.tensor.dtype
as
dtype
import
megengine.functional
as
F
from
megengine
import
Buffer
,
Parameter
,
is_cuda_available
,
tensor
from
megengine.core._trace_option
import
use_tensor_shape
from
megengine.core.autodiff.grad
import
Grad
from
megengine.core.tensor.utils
import
make_shape_tuple
from
megengine.test
import
assertTensorClose
...
...
@@ -192,6 +194,9 @@ def test_matmul():
def
test_interpolate
():
if
use_tensor_shape
():
# XXX: please fix me
return
def
linear_interpolate
():
inp
=
tensor
(
np
.
arange
(
1
,
3
,
dtype
=
np
.
float32
).
reshape
(
1
,
1
,
2
))
...
...
@@ -273,10 +278,14 @@ def test_roi_align():
sample_points
=
2
,
aligned
=
True
,
)
assert
out_feat
.
shape
==
(
rois
.
shape
[
0
],
inp_feat
.
shape
[
1
],
*
output_shape
)
assert
make_shape_tuple
(
out_feat
.
shape
)
==
(
rois
.
shape
[
0
],
inp_feat
.
shape
[
1
],
*
output_shape
,
)
grad
(
out_feat
,
tensor
(
F
.
ones_like
(
out_feat
)))
assert
inp_feat
.
grad
.
shape
==
inp_feat
.
shape
assert
make_shape_tuple
(
inp_feat
.
grad
.
shape
)
==
make_shape_tuple
(
inp_feat
.
shape
)
def
test_roi_pooling
():
...
...
@@ -286,10 +295,14 @@ def test_roi_pooling():
out_feat
=
F
.
roi_pooling
(
inp_feat
,
rois
,
output_shape
=
output_shape
,
mode
=
"max"
,
scale
=
1.0
/
4
,
)
assert
out_feat
.
shape
==
(
rois
.
shape
[
0
],
inp_feat
.
shape
[
1
],
*
output_shape
)
assert
make_shape_tuple
(
out_feat
.
shape
)
==
(
rois
.
shape
[
0
],
inp_feat
.
shape
[
1
],
*
output_shape
,
)
grad
(
out_feat
,
tensor
(
F
.
ones_like
(
out_feat
)))
assert
inp_feat
.
grad
.
shape
==
inp_feat
.
shape
assert
make_shape_tuple
(
inp_feat
.
grad
.
shape
)
==
make_shape_tuple
(
inp_feat
.
shape
)
# def test_one_hot():
...
...
imperative/python/test/unit/functional/test_tensor.py
浏览文件 @
40d18c89
...
...
@@ -11,6 +11,7 @@ import pytest
import
megengine.functional
as
F
from
megengine
import
Buffer
,
Parameter
,
is_cuda_available
,
tensor
from
megengine.core._trace_option
import
use_tensor_shape
from
megengine.core.tensor.utils
import
astensor1d
from
megengine.test
import
assertTensorClose
...
...
@@ -121,6 +122,8 @@ def test_stack():
def
test_split
():
if
use_tensor_shape
():
# XXX: please fix me
return
data
=
np
.
random
.
random
((
2
,
3
,
4
,
5
)).
astype
(
np
.
float32
)
mge_out1
=
F
.
split
(
tensor
(
data
),
2
,
axis
=
3
)
mge_out2
=
F
.
split
(
tensor
(
data
),
[
3
,
5
],
axis
=
3
)
...
...
imperative/python/test/unit/test_indexing_op.py
浏览文件 @
40d18c89
...
...
@@ -13,6 +13,7 @@ import pytest
import
megengine.core.ops.builtin
import
megengine.core.tensor.raw_tensor
from
megengine.core._trace_option
import
use_tensor_shape
from
megengine.core.ops._internal
import
all_ops
from
megengine.core.tensor
import
Tensor
from
megengine.core.tensor.core
import
apply
...
...
@@ -518,16 +519,18 @@ def test_advance_indexing_with_bool():
np
.
testing
.
assert_equal
(
a
[
b
],
aa
[
bb
].
numpy
())
np
.
testing
.
assert_equal
(
a
[:,
[
True
,
False
]],
aa
[:,
[
True
,
False
]].
numpy
())
a
=
np
.
ones
((
2
,
2
),
dtype
=
np
.
int32
)
b
=
np
.
array
([[
False
,
False
],
[
False
,
False
]])
aa
=
Tensor
(
a
)
bb
=
Tensor
(
b
)
np
.
testing
.
assert_equal
(
a
[
b
],
aa
[
b
].
numpy
())
np
.
testing
.
assert_equal
(
a
[
b
],
aa
[
bb
].
numpy
())
b
=
np
.
array
([
False
,
False
])
bb
=
Tensor
(
b
)
np
.
testing
.
assert_equal
(
a
[
b
],
aa
[
bb
].
numpy
().
reshape
(
a
[
b
].
shape
))
# FIXME
# XXX: trace does not expect empty condtake tensor
if
not
use_tensor_shape
():
a
=
np
.
ones
((
2
,
2
),
dtype
=
np
.
int32
)
b
=
np
.
array
([[
False
,
False
],
[
False
,
False
]])
aa
=
Tensor
(
a
)
bb
=
Tensor
(
b
)
np
.
testing
.
assert_equal
(
a
[
b
],
aa
[
b
].
numpy
())
np
.
testing
.
assert_equal
(
a
[
b
],
aa
[
bb
].
numpy
())
b
=
np
.
array
([
False
,
False
])
bb
=
Tensor
(
b
)
np
.
testing
.
assert_equal
(
a
[
b
],
aa
[
bb
].
numpy
().
reshape
(
a
[
b
].
shape
))
# FIXME
a
=
np
.
arange
(
576
).
reshape
(
2
,
3
,
4
,
3
,
4
,
2
).
astype
(
"int32"
)
aa
=
Tensor
(
a
)
...
...
imperative/python/test/unit/test_loss.py
浏览文件 @
40d18c89
...
...
@@ -18,3 +18,10 @@ def test_cross_entropy_with_softmax():
label
=
tensor
([
1
]).
astype
(
np
.
int32
)
loss
=
F
.
cross_entropy_with_softmax
(
data
,
label
)
np
.
testing
.
assert_allclose
(
loss
.
numpy
(),
0.0
)
label
=
tensor
([
0
]).
astype
(
np
.
int32
)
loss
=
F
.
cross_entropy_with_softmax
(
data
,
label
)
np
.
testing
.
assert_allclose
(
loss
.
numpy
(),
100
-
1
)
label
=
np
.
array
([
1
])
loss
=
F
.
cross_entropy_with_softmax
(
data
,
label
)
np
.
testing
.
assert_allclose
(
loss
.
numpy
(),
0.0
)
imperative/python/test/unit/test_module.py
浏览文件 @
40d18c89
...
...
@@ -22,6 +22,10 @@ def test_syncbn():
import
numpy
as
np
import
multiprocessing
as
mp
from
megengine.distributed.group
import
Server
from
megengine.core._trace_option
import
use_tensor_shape
if
use_tensor_shape
():
# XXX: fix sync bn if use_tensor_shape
return
nr_chan
=
8
nr_ranks
=
4
...
...
imperative/python/test/unit/test_serialization.py
浏览文件 @
40d18c89
...
...
@@ -58,6 +58,7 @@ def test_tensor_serialization():
with
TemporaryFile
()
as
f
:
if
mge
.
is_cuda_available
():
device_org
=
mge
.
get_default_device
()
mge
.
set_default_device
(
"gpu0"
)
a
=
Buffer
(
np
.
random
.
random
(
size
=
(
2
,
233
)).
astype
(
np
.
float32
))
mge
.
save
(
a
,
f
)
f
.
seek
(
0
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录