Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
pytensor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
testgroup
pytensor
Commits
61280f0a
提交
61280f0a
authored
8月 06, 2015
作者:
Iban Harlouchet
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
numpydoc for theano/tensor/nnet/conv.py
上级
e29c2b19
显示空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
149 行增加
和
127 行删除
+149
-127
conv.py
theano/tensor/nnet/conv.py
+149
-127
没有找到文件。
theano/tensor/nnet/conv.py
浏览文件 @
61280f0a
...
@@ -36,46 +36,41 @@ _logger = logging.getLogger("theano.tensor.nnet.conv")
...
@@ -36,46 +36,41 @@ _logger = logging.getLogger("theano.tensor.nnet.conv")
def
conv2d
(
input
,
filters
,
image_shape
=
None
,
filter_shape
=
None
,
def
conv2d
(
input
,
filters
,
image_shape
=
None
,
filter_shape
=
None
,
border_mode
=
'valid'
,
subsample
=
(
1
,
1
),
**
kargs
):
border_mode
=
'valid'
,
subsample
=
(
1
,
1
),
**
kargs
):
"""This function will build the symbolic graph for convolving a stack of
"""
This function will build the symbolic graph for convolving a stack of
input images with a set of filters. The implementation is modelled after
input images with a set of filters. The implementation is modelled after
Convolutional Neural Networks (CNN). It is simply a wrapper to the ConvOp
Convolutional Neural Networks (CNN). It is simply a wrapper to the ConvOp
but provides a much cleaner interface.
but provides a much cleaner interface.
:type input: symbolic 4D tensor
Parameters
:param input: mini-batch of feature map stacks, of shape
----------
input : symbolic 4D tensor
Mini-batch of feature map stacks, of shape
(batch size, stack size, nb row, nb col)
(batch size, stack size, nb row, nb col)
see the optional parameter image_shape
see the optional parameter image_shape
filters: symbolic 4D tensor
:type filters: symbolic 4D tensor
Set of filters used in CNN layer of shape
:param filters: set of filters used in CNN layer of shape
(nb filters, stack size, nb row, nb col)
(nb filters, stack size, nb row, nb col)
see the optional parameter filter_shape
see the optional parameter filter_shape
border_mode : {'valid', 'full'}
:param border_mode:
'valid'only apply filter to complete patches of the image. Generates
'valid'-- only apply filter to complete patches of the image. Generates
output of shape: image_shape - filter_shape + 1.
output of shape: image_shape - filter_shape + 1
'full' zero-pads image to multiple of filter shape to generate output
'full' -- zero-pads image to multiple of filter shape to generate output
of shape: image_shape + filter_shape - 1.
of shape: image_shape + filter_shape - 1
subsample: tuple of len 2
Factor by which to subsample the output. Also called strides elsewhere.
:type subsample: tuple of len 2
image_shape: None, tuple/list of len 4 of int, None or Constant variable
:param subsample: factor by which to subsample the output.
The shape of the input parameter.
Also called strides elsewhere.
Optional, used for optimization like loop unrolling
You can put None for any element of the list to tell that this element
:type image_shape: None, tuple/list of len 4 of int, None or
is not constant.
Constant variable
filter_shape : None, tuple/list of len 4 of int, None or Constant variable
:param image_shape: The shape of the input parameter.
Optional, used for optimization like loop unrolling
Optional, used for optimization like loop unrolling
You can put None for any element of the list
You can put None for any element of the list
to tell that this element is not constant.
to tell that this element is not constant.
:type filter_shape: None, tuple/list of len 4 of int, None or
kwargs
Constant variable
Kwargs are passed onto ConvOp. Can be used to set the following:
:param filter_shape: Optional, used for optimization like loop unrolling
unroll_batch, unroll_kern, unroll_patch, openmp (see ConvOp doc).
You can put None for any element of the list
to tell that this element is not constant.
:param kwargs: kwargs are passed onto ConvOp.
Can be used to set the following:
unroll_batch, unroll_kern, unroll_patch,
openmp (see ConvOp doc)
openmp: By default have the same value as
openmp: By default have the same value as
config.openmp. For small image, filter,
config.openmp. For small image, filter,
...
@@ -88,9 +83,11 @@ def conv2d(input, filters, image_shape=None, filter_shape=None,
...
@@ -88,9 +83,11 @@ def conv2d(input, filters, image_shape=None, filter_shape=None,
grow the batch size to 10, it is faster
grow the batch size to 10, it is faster
with openmp on a core 2 duo.
with openmp on a core 2 duo.
:rtype: symbolic 4D tensor
Returns
:return: set of feature maps generated by convolutional layer. Tensor is
-------
of shape (batch size, nb filters, output row, output col)
symbolic 4D tensor
Set of feature maps generated by convolutional layer. Tensor is
of shape (batch size, nb filters, output row, output col).
"""
"""
...
@@ -171,6 +168,97 @@ class ConvOp(OpenMPOp):
...
@@ -171,6 +168,97 @@ class ConvOp(OpenMPOp):
output[b,k,:,:] =
\
sum_i input[b,i,:,:] * filter[k,i,:,:]
\f
orall b,k
output[b,k,:,:] =
\
sum_i input[b,i,:,:] * filter[k,i,:,:]
\f
orall b,k
where b is the mini-batch index, k the filter index and * is the
where b is the mini-batch index, k the filter index and * is the
convolution operator.
convolution operator.
The constructor initializes a ConvOp with given output_mode (full/valid).
All other parameters are optional and are only used to generate more
optimized c code, or to enable graph optimizers to optimally replace the
ConvOp.
NOTES ON OPTIMIZATION:
There are two types of optimization. The first is the selection of the
fastest algo when bsize and nkern are provided with imshp and kshp.
By default we try to select the fastest version. You can specify it
with the unroll_batch, unroll_kern, and unroll_patch parameter.
The second type of optimization is hardcoding some dimensions into the
code when all shape are know.
This make a significant difference for the 'full' output_mode.
Sometimes, the fastest implementation on x86-64 uses
{unroll_batch=4, unroll_kern=4, unroll_patch=False}
with all other shape parameters being provided.
For optimizing other architectures, see:
Kazushige Goto and Robert A. Van De Geijn, Anatomy of High-Performance
Matrix Multiplication, (mr x nr). ACM Transactions on Mathematical
Software, May 2008.
Figure 12: (mr x nr). For x86 use 2x4, itanium 8x8, etc.
Parameters
----------
output_mode : {'valid', 'full'}
'valid' gives an output smaller then the image.
'full' gives an output bigger then the image.
See 'border_mode' in conv2d's doc.
Optional parameters: (will generate more optimal c code)
imshp : tuple of len 2 or 3: 2 for 2d image, 3 for a stack of 2d images.
Stacksize, nb image row, nb image col.
kshp : tuple of len 2
Nb kernel row, nb kernel col.
nkern : int
The number of kernel.
bsize : int
The size of the minibatch.
dx : int
Patch stride rows.
dy : int
Patch stride cols
Params which select the version of code used:
unroll_patch : bool
Use a version of c_code that unroll the patch loop that don't
request all shape information to work, but if all shape information
are present, will use it to hardcode the value in the code for
faster code.
unroll_batch : int
Use a version of c_code that unroll the batch (by unroll_batch)
and the nkern (by unroll_kern) loop. The size must by a multiple
of bsize or nkern respectively.
unroll_kern : int
Use a version of c_code that unroll the batch
(by unroll_batch) and the nkern(by unroll_kern) loop. The size
must by a multiple of bsize or nkern respectively.
verbose : int
Passed to GpuConv.
version: int or str
Passed to GpuConv, if version='no_fft', fft
optimization will be desactivated at the op level.
direction_hint: {'forward', 'bprop weights', 'bprop inputs'}
Passed to GpuConv, used by graph optimizers to aid algorithm choice.
The 3 following parameters are used internally when we generate
the gradient when dx!=1 or dy!=1.
imshp_logical
Default None. None value is equivalent to imshp value.
When imshp_logical != imshp, it tell we need to insert 0 in
the image before we do the convolution. For example, when dx==dy==2
and the image is [[1, 2], [3, 4]], we should make as if the image
was [[1, 0, 2, 0], [0, 0, 0, 0], [3, 0, 4, 0], [0, 0, 0, 0]].
Our python code insert the zero, but the c code optimize it.
imshp_logical != imshp when taking the grad again the weights or
the image when the output_mode is full and `dx != 1` or `dy != 1`.
kshp_logical
Idem but for kshp and used for the grad again the
weights when the output_mode is valid and `dx != 1` or `dy != 1`.
kshp_logical_top_aligned
Used in the same case. Default to True.
Set to False in the grad again the weight when the
output_mode is full.
"""
"""
__attrnames
=
[
'imshp'
,
'kshp'
,
'nkern'
,
'bsize'
,
'dx'
,
'dy'
,
'out_mode'
,
__attrnames
=
[
'imshp'
,
'kshp'
,
'nkern'
,
'bsize'
,
'dx'
,
'dy'
,
'out_mode'
,
...
@@ -257,10 +345,19 @@ class ConvOp(OpenMPOp):
...
@@ -257,10 +345,19 @@ class ConvOp(OpenMPOp):
with kernels of shape "kshp". Accepts symbolic or integer shapes.
with kernels of shape "kshp". Accepts symbolic or integer shapes.
Propagates `None`s (for unknown shapes).
Propagates `None`s (for unknown shapes).
:param inshp: (rows,cols) of input image
Parameters
:param kshp: (rows,cols) of filters
----------
:param mode: 'valid' or 'full' (see 'border_mode' in conv2d's doc)
inshp
:return: (rows,cols) of output image
(rows,cols) of input image.
kshp
(rows,cols) of filters.
mode: {'valid', 'full'}
See 'border_mode' in conv2d's doc.
Returns
-------
(rows,cols) of output image.
"""
"""
# The formula would be ceil((i + s * k - s * 1) / float(d)),
# The formula would be ceil((i + s * k - s * 1) / float(d)),
# with s=1 for mode=='full' and s=-1 for mode=='valid'.
# with s=1 for mode=='full' and s=-1 for mode=='valid'.
...
@@ -284,92 +381,6 @@ class ConvOp(OpenMPOp):
...
@@ -284,92 +381,6 @@ class ConvOp(OpenMPOp):
version
=-
1
,
version
=-
1
,
direction_hint
=
'forward'
,
direction_hint
=
'forward'
,
openmp
=
None
):
openmp
=
None
):
"""
Initializes a ConvOp with given output_mode (full/valid). All other
parameters are optional and are only used to generate more optimized c
code, or to enable graph optimizers to optimally replace the ConvOp.
NOTES ON OPTIMIZATION:
Their is two type of optimization. The first is the selection of the
fastest algo when bsize and nkern are probided with imshp and kshp.
By default we try to select the fastest version. You can specify it
with the unroll_batch, unroll_kern, and unroll_patch parameter.
The second type of optimization is hardcoding some dimensions into the
code when all shape are know.
This make a significant difference for the 'full' output_mode.
Some times, the fastest implementation on x86-64 uses
{unroll_batch=4, unroll_kern=4, unroll_patch=False}
with all other shape parameters being provided.
For optimizing other architectures, see:
Kazushige Goto and Robert A. Van De Geijn, Anatomy of High-Performance
Matrix Multiplication, (mr x nr). ACM Transactions on Mathematical
Software, May 2008.
Figure 12: (mr x nr). For x86 use 2x4, itanium 8x8, etc.
:type output_mode: string
:param output_mode: 'valid' -- gives an output smaller then the image
'full' -- gives an output bigger then the image
Optional parameters: (will generate more optimal c code)
:type imshp: tuple of len 2 or 3: 2 for 2d image,
3 for a stack of 2d images.
:param imshp: (stacksize, nb image row, nb image col)
:type kshp: tuple of len 2
:param kshp: (nb kernel row, nb kernel col)
:type nkern: int
:param nkern: the number of kernel
:type bsize: int
:param bsize: the size of the minibatch
:type dx: int
:param dx: patch stride rows
:type dy: int
:param dy: patch stride cols
Params which select the version of code used:
:type unroll_patch: bool
:param unroll_patch: use a version of c_code that unroll the patch loop
that don't request all shape information to work, but if all shape
information are present, will
use it to hardcode the value in the code for faster code.
:type unroll_batch:int
:param unroll_batch: use a version of c_code that unroll the batch
(by unroll_batch) and the nkern(by unroll_kern) loop. The size
must by a multiple of bsize or nkern respectively.
:type unroll_kern:int
:param unroll_kern: use a version of c_code that unroll the batch
(by unroll_batch) and the nkern(by unroll_kern) loop. The size
must by a multiple of bsize or nkern
respectively.
:type verbose: int
:param verbose: passed to GpuConv
:type version: int or str
:param version: passed to GpuConv, if version='no_fft', fft
optimization will be desactivated at the op level.
:param direction_hint: 'forward', 'bprop weights' or 'bprop inputs'.
Passed to GpuConv, used by graph optimizers to aid algorithm choice
The 3 following parameters are used internally when we generate
the gradient when dx!=1 or dy!=1.
:param imshp_logical: Default None. None value is equivalent to imshp
value. When imshp_logical != imshp, it tell we need to insert 0 in
the image before we do the convolution. For example, when dx==dy==2
and the image is [[1, 2], [3, 4]], we should make as if the image
was [[1, 0, 2, 0], [0, 0, 0, 0], [3, 0, 4, 0], [0, 0, 0, 0]].
Our python code insert the zero, but the c code optimize it.
imshp_logical != imshp when taking the grad again the weights or
the image when the output_mode is full and `dx != 1` or `dy != 1`.
:param kshp_logical: idem but for kshp and used for the grad again the
weights when the output_mode is valid and `dx != 1` or `dy != 1`.
:param kshp_logical_top_aligned: Used in the same case.Default to True.
Set to False in the grad again the weight when the
output_mode is full.
"""
# Deactivate fft_optimization at the op level if specified
# Deactivate fft_optimization at the op level if specified
if
version
==
"no_fft"
:
if
version
==
"no_fft"
:
self
.
fft_opt
=
False
self
.
fft_opt
=
False
...
@@ -587,7 +598,10 @@ class ConvOp(OpenMPOp):
...
@@ -587,7 +598,10 @@ class ConvOp(OpenMPOp):
for
a
in
self
.
__attrnames
)
+
"}"
for
a
in
self
.
__attrnames
)
+
"}"
def
flops
(
self
,
inputs
,
outputs
):
def
flops
(
self
,
inputs
,
outputs
):
""" Useful with the hack in profilemode to print the MFlops"""
"""
Useful with the hack in profilemode to print the MFlops.
"""
images
,
kerns
=
inputs
images
,
kerns
=
inputs
out
,
=
outputs
out
,
=
outputs
assert
images
[
1
]
==
kerns
[
1
]
assert
images
[
1
]
==
kerns
[
1
]
...
@@ -608,8 +622,13 @@ class ConvOp(OpenMPOp):
...
@@ -608,8 +622,13 @@ class ConvOp(OpenMPOp):
def
make_node
(
self
,
inputs
,
kerns
):
def
make_node
(
self
,
inputs
,
kerns
):
# TODO: find a way to make ConvOp work for N-D (after NIPS09)
# TODO: find a way to make ConvOp work for N-D (after NIPS09)
"""
"""
inputs - 4 dim: batches x stacksize x rows x cols
Parameters
kerns - 4 dim: nkern x stackidx x rows x cols
----------
inputs
4 dim: batches x stacksize x rows x cols.
kerns
4 dim: nkern x stackidx x rows x cols.
"""
"""
_inputs
=
as_tensor_variable
(
inputs
)
_inputs
=
as_tensor_variable
(
inputs
)
_kerns
=
as_tensor_variable
(
kerns
)
_kerns
=
as_tensor_variable
(
kerns
)
...
@@ -655,7 +674,8 @@ class ConvOp(OpenMPOp):
...
@@ -655,7 +674,8 @@ class ConvOp(OpenMPOp):
def
perform
(
self
,
node
,
inp
,
out
):
def
perform
(
self
,
node
,
inp
,
out
):
"""
"""
By default if len(img2d.shape)==3, we
By default if len(img2d.shape)==3, we TODO
"""
"""
img2d
,
filtersflipped
=
inp
img2d
,
filtersflipped
=
inp
z
,
=
out
z
,
=
out
...
@@ -1818,7 +1838,9 @@ Py_XDECREF(img2d);
...
@@ -1818,7 +1838,9 @@ Py_XDECREF(img2d);
def
gen_conv_code_unroll_batch_kern
(
d
,
unroll_bsize
=
1
,
unroll_ksize
=
1
):
def
gen_conv_code_unroll_batch_kern
(
d
,
unroll_bsize
=
1
,
unroll_ksize
=
1
):
""" c_code for ConvOp that unroll the batch size loop
"""
c_code for ConvOp that unroll the batch size loop.
"""
"""
assert
unroll_bsize
>
0
and
unroll_ksize
>
0
assert
unroll_bsize
>
0
and
unroll_ksize
>
0
if
"unroll_bsize"
in
d
or
"unroll_ksize"
in
d
or
"unroll_iter"
in
d
or
"unroll_biter"
in
d
or
"unroll_kiter"
in
d
:
if
"unroll_bsize"
in
d
or
"unroll_ksize"
in
d
or
"unroll_iter"
in
d
or
"unroll_biter"
in
d
or
"unroll_kiter"
in
d
:
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论