Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
pytensor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
testgroup
pytensor
Commits
5caafd99
提交
5caafd99
authored
12月 07, 2016
作者:
Gijs van Tulder
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Test if the promised input/filter shapes match the actual shapes.
上级
193c9979
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
76 行增加
和
1 行删除
+76
-1
abstract_conv.py
theano/tensor/nnet/abstract_conv.py
+57
-0
test_abstract_conv.py
theano/tensor/nnet/tests/test_abstract_conv.py
+19
-1
没有找到文件。
theano/tensor/nnet/abstract_conv.py
浏览文件 @
5caafd99
...
@@ -471,6 +471,41 @@ def assert_conv_shape(shape):
...
@@ -471,6 +471,41 @@ def assert_conv_shape(shape):
return
tuple
(
out_shape
)
return
tuple
(
out_shape
)
def
assert_shape
(
x
,
expected_shape
,
msg
=
'Unexpected shape.'
):
"""Wraps `x` in an `Assert` to check its shape.
Parameters
----------
x : Tensor
x will be wrapped in an `Assert`.
expected_shape : tuple or list
The expected shape of `x`. The size of a dimension can be None,
which means it will not be checked.
msg : str
The error message of the `Assert`.
Returns
-------
Tensor
`x` wrapped in an `Assert`. At execution time, this will throw an
AssertionError if the shape of `x` does not match `expected_shape`.
If `expected_shape` is None or contains only Nones, the function
will return `x` directly.
"""
if
expected_shape
is
None
:
return
x
shape
=
x
.
shape
tests
=
[]
for
i
in
range
(
x
.
ndim
):
if
expected_shape
[
i
]
is
not
None
:
tests
.
append
(
theano
.
tensor
.
eq
(
shape
[
i
],
expected_shape
[
i
]))
if
tests
:
return
Assert
(
msg
)(
x
,
theano
.
tensor
.
all
(
tests
))
else
:
return
x
def
conv2d
(
input
,
def
conv2d
(
input
,
filters
,
filters
,
input_shape
=
None
,
input_shape
=
None
,
...
@@ -488,6 +523,14 @@ def conv2d(input,
...
@@ -488,6 +523,14 @@ def conv2d(input,
input
=
as_tensor_variable
(
input
)
input
=
as_tensor_variable
(
input
)
filters
=
as_tensor_variable
(
filters
)
filters
=
as_tensor_variable
(
filters
)
if
input_shape
is
not
None
:
input
=
assert_shape
(
input
,
input_shape
,
'conv2d shape mismatch: shape of '
'input does not match given input_shape.'
)
if
filter_shape
is
not
None
:
filters
=
assert_shape
(
filters
,
filter_shape
,
'conv2d shape mismatch: shape of '
'filters does not match given filter_shape.'
)
conv_op
=
AbstractConv2d
(
imshp
=
input_shape
,
conv_op
=
AbstractConv2d
(
imshp
=
input_shape
,
kshp
=
filter_shape
,
kshp
=
filter_shape
,
border_mode
=
border_mode
,
border_mode
=
border_mode
,
...
@@ -587,6 +630,14 @@ def conv3d(input,
...
@@ -587,6 +630,14 @@ def conv3d(input,
input
=
as_tensor_variable
(
input
)
input
=
as_tensor_variable
(
input
)
filters
=
as_tensor_variable
(
filters
)
filters
=
as_tensor_variable
(
filters
)
if
input_shape
is
not
None
:
input
=
assert_shape
(
input
,
input_shape
,
'conv3d shape mismatch: shape of '
'input does not match given input_shape.'
)
if
filter_shape
is
not
None
:
filters
=
assert_shape
(
filters
,
filter_shape
,
'conv3d shape mismatch: shape of '
'filters does not match given filter_shape.'
)
conv_op
=
AbstractConv3d
(
imshp
=
input_shape
,
conv_op
=
AbstractConv3d
(
imshp
=
input_shape
,
kshp
=
filter_shape
,
kshp
=
filter_shape
,
border_mode
=
border_mode
,
border_mode
=
border_mode
,
...
@@ -713,6 +764,9 @@ def conv2d_grad_wrt_inputs(output_grad,
...
@@ -713,6 +764,9 @@ def conv2d_grad_wrt_inputs(output_grad,
for
dim
in
[
0
,
1
,
2
,
3
]:
for
dim
in
[
0
,
1
,
2
,
3
]:
assert
isinstance
(
filter_shape
[
dim
],
(
theano
.
tensor
.
TensorConstant
,
assert
isinstance
(
filter_shape
[
dim
],
(
theano
.
tensor
.
TensorConstant
,
integer_types
,
type
(
None
)))
integer_types
,
type
(
None
)))
filters
=
assert_shape
(
filters
,
filter_shape
,
'conv2d_grad_wrt_inputs shape mismatch: shape of '
'filters does not match given filter_shape.'
)
# setting the last two dimensions of input_shape to None, if
# setting the last two dimensions of input_shape to None, if
# the type of these dimensions is TensorVariable.
# the type of these dimensions is TensorVariable.
...
@@ -848,6 +902,9 @@ def conv3d_grad_wrt_inputs(output_grad,
...
@@ -848,6 +902,9 @@ def conv3d_grad_wrt_inputs(output_grad,
for
dim
in
[
0
,
1
,
2
,
3
,
4
]:
for
dim
in
[
0
,
1
,
2
,
3
,
4
]:
assert
isinstance
(
filter_shape
[
dim
],
(
theano
.
tensor
.
TensorConstant
,
assert
isinstance
(
filter_shape
[
dim
],
(
theano
.
tensor
.
TensorConstant
,
integer_types
,
type
(
None
)))
integer_types
,
type
(
None
)))
filters
=
assert_shape
(
filters
,
filter_shape
,
'conv3d_grad_wrt_inputs shape mismatch: shape of '
'filters does not match given filter_shape.'
)
# setting the last three dimensions of input_shape to None, if
# setting the last three dimensions of input_shape to None, if
# the type of these dimensions is TensorVariable.
# the type of these dimensions is TensorVariable.
...
...
theano/tensor/nnet/tests/test_abstract_conv.py
浏览文件 @
5caafd99
...
@@ -14,7 +14,8 @@ from theano.tensor.nnet.abstract_conv import (get_conv_output_shape,
...
@@ -14,7 +14,8 @@ from theano.tensor.nnet.abstract_conv import (get_conv_output_shape,
get_conv_gradweights_shape
,
get_conv_gradweights_shape
,
get_conv_gradinputs_shape
,
get_conv_gradinputs_shape
,
check_conv_gradinputs_shape
,
check_conv_gradinputs_shape
,
assert_conv_shape
)
assert_conv_shape
,
assert_shape
)
from
theano.tensor.nnet.abstract_conv
import
AbstractConv2d
from
theano.tensor.nnet.abstract_conv
import
AbstractConv2d
from
theano.tensor.nnet.abstract_conv
import
AbstractConv2d_gradInputs
from
theano.tensor.nnet.abstract_conv
import
AbstractConv2d_gradInputs
from
theano.tensor.nnet.abstract_conv
import
AbstractConv2d_gradWeights
from
theano.tensor.nnet.abstract_conv
import
AbstractConv2d_gradWeights
...
@@ -226,6 +227,23 @@ class TestAssertConvShape(unittest.TestCase):
...
@@ -226,6 +227,23 @@ class TestAssertConvShape(unittest.TestCase):
assert_raises
(
AssertionError
,
f
,
-
1
,
3
,
3
,
3
)
assert_raises
(
AssertionError
,
f
,
-
1
,
3
,
3
,
3
)
class
TestAssertShape
(
unittest
.
TestCase
):
def
test_basic
(
self
):
x
=
tensor
.
tensor4
()
s1
=
tensor
.
iscalar
()
s2
=
tensor
.
iscalar
()
expected_shape
=
[
None
,
s1
,
s2
,
None
]
f
=
theano
.
function
([
x
,
s1
,
s2
],
assert_shape
(
x
,
expected_shape
))
v
=
numpy
.
zeros
((
3
,
5
,
7
,
11
),
dtype
=
'float32'
)
self
.
assertEqual
(
0
,
numpy
.
sum
(
f
(
v
,
5
,
7
)))
assert_raises
(
AssertionError
,
f
,
v
,
5
,
0
)
assert_raises
(
AssertionError
,
f
,
v
,
5
,
9
)
assert_raises
(
AssertionError
,
f
,
v
,
0
,
7
)
assert_raises
(
AssertionError
,
f
,
v
,
7
,
7
)
class
BaseTestConv
(
object
):
class
BaseTestConv
(
object
):
def
get_output_shape
(
self
,
inputs_shape
,
filters_shape
,
def
get_output_shape
(
self
,
inputs_shape
,
filters_shape
,
subsample
,
border_mode
,
filter_dilation
):
subsample
,
border_mode
,
filter_dilation
):
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论