Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
pytensor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
testgroup
pytensor
Commits
86d21acd
提交
86d21acd
authored
11月 07, 2016
作者:
kvmanohar22
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
modified numpy imports to one common form
上级
f06f537a
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
70 行增加
和
73 行删除
+70
-73
sp.py
theano/sparse/sandbox/sp.py
+34
-37
sp2.py
theano/sparse/sandbox/sp2.py
+5
-5
test_sp.py
theano/sparse/sandbox/test_sp.py
+30
-30
truedot.py
theano/sparse/sandbox/truedot.py
+1
-1
没有找到文件。
theano/sparse/sandbox/sp.py
浏览文件 @
86d21acd
...
@@ -8,7 +8,7 @@ U{http://www-users.cs.umn.edu/~saad/software/SPARSKIT/paper.ps}.
...
@@ -8,7 +8,7 @@ U{http://www-users.cs.umn.edu/~saad/software/SPARSKIT/paper.ps}.
"""
"""
# COPIED FROM hpu/icml09/sp.py
# COPIED FROM hpu/icml09/sp.py
from
__future__
import
absolute_import
,
print_function
,
division
from
__future__
import
absolute_import
,
print_function
,
division
import
numpy
import
numpy
as
np
import
scipy
import
scipy
from
scipy
import
sparse
as
scipy_sparse
from
scipy
import
sparse
as
scipy_sparse
from
six.moves
import
xrange
from
six.moves
import
xrange
...
@@ -81,18 +81,17 @@ class ConvolutionIndices(Op):
...
@@ -81,18 +81,17 @@ class ConvolutionIndices(Op):
raise
Exception
(
"ws is obsolete and it must be always True"
)
raise
Exception
(
"ws is obsolete and it must be always True"
)
(
dx
,
dy
)
=
strides
(
dx
,
dy
)
=
strides
N
=
numpy
# inshp contains either 2 entries (height,width) or 3 (nfeatures,h,w)
# inshp contains either 2 entries (height,width) or 3 (nfeatures,h,w)
# in the first case, default nfeatures to 1
# in the first case, default nfeatures to 1
if
N
.
size
(
inshp
)
==
2
:
if
np
.
size
(
inshp
)
==
2
:
inshp
=
(
1
,)
+
inshp
inshp
=
(
1
,)
+
inshp
inshp
=
N
.
array
(
inshp
)
inshp
=
np
.
array
(
inshp
)
kshp
=
N
.
array
(
kshp
)
kshp
=
np
.
array
(
kshp
)
ksize
=
N
.
prod
(
kshp
)
ksize
=
np
.
prod
(
kshp
)
kern
=
ksize
-
1
-
N
.
arange
(
ksize
)
kern
=
ksize
-
1
-
np
.
arange
(
ksize
)
# size of output image if doing proper convolution
# size of output image if doing proper convolution
# (mode='full',dx=dy=0) outshp is the actual output shape
# (mode='full',dx=dy=0) outshp is the actual output shape
...
@@ -102,32 +101,32 @@ class ConvolutionIndices(Op):
...
@@ -102,32 +101,32 @@ class ConvolutionIndices(Op):
s
=
-
1
s
=
-
1
else
:
else
:
s
=
1
s
=
1
outshp
=
N
.
int64
(
N
.
ceil
((
inshp
[
1
:]
+
s
*
kshp
-
s
*
1
)
\
outshp
=
np
.
int64
(
np
.
ceil
((
inshp
[
1
:]
+
s
*
kshp
-
s
*
1
)
\
/
N
.
array
([
dy
,
dx
],
dtype
=
'float'
)))
/
np
.
array
([
dy
,
dx
],
dtype
=
'float'
)))
if
any
(
outshp
<=
0
):
if
any
(
outshp
<=
0
):
err
=
'Invalid kernel'
,
kshp
,
'and/or step size'
,
(
dx
,
dy
),
\
err
=
'Invalid kernel'
,
kshp
,
'and/or step size'
,
(
dx
,
dy
),
\
'for given input shape'
,
inshp
'for given input shape'
,
inshp
raise
ValueError
(
err
)
raise
ValueError
(
err
)
outsize
=
N
.
prod
(
outshp
)
outsize
=
np
.
prod
(
outshp
)
insize
=
N
.
prod
(
inshp
)
insize
=
np
.
prod
(
inshp
)
# range of output units over which to iterate
# range of output units over which to iterate
if
mode
==
'valid'
:
if
mode
==
'valid'
:
lbound
=
N
.
array
([
kshp
[
0
]
-
1
,
kshp
[
1
]
-
1
])
lbound
=
np
.
array
([
kshp
[
0
]
-
1
,
kshp
[
1
]
-
1
])
ubound
=
lbound
+
(
inshp
[
1
:]
-
kshp
+
1
)
ubound
=
lbound
+
(
inshp
[
1
:]
-
kshp
+
1
)
else
:
else
:
lbound
=
N
.
zeros
(
2
)
lbound
=
np
.
zeros
(
2
)
ubound
=
fulloutshp
ubound
=
fulloutshp
# coordinates of image in "fulloutshp" coordinates
# coordinates of image in "fulloutshp" coordinates
topleft
=
N
.
array
([
kshp
[
0
]
-
1
,
kshp
[
1
]
-
1
])
topleft
=
np
.
array
([
kshp
[
0
]
-
1
,
kshp
[
1
]
-
1
])
# bound when counting the receptive field
# bound when counting the receptive field
botright
=
topleft
+
inshp
[
1
:]
botright
=
topleft
+
inshp
[
1
:]
# sparse matrix specifics...
# sparse matrix specifics...
if
ws
:
if
ws
:
spmatshp
=
(
outsize
*
N
.
prod
(
kshp
)
*
inshp
[
0
],
insize
)
spmatshp
=
(
outsize
*
np
.
prod
(
kshp
)
*
inshp
[
0
],
insize
)
else
:
else
:
spmatshp
=
(
nkern
*
outsize
,
insize
)
spmatshp
=
(
nkern
*
outsize
,
insize
)
spmat
=
scipy_sparse
.
lil_matrix
(
spmatshp
)
spmat
=
scipy_sparse
.
lil_matrix
(
spmatshp
)
...
@@ -152,17 +151,17 @@ class ConvolutionIndices(Op):
...
@@ -152,17 +151,17 @@ class ConvolutionIndices(Op):
# FOR EACH OUTPUT PIXEL...
# FOR EACH OUTPUT PIXEL...
# loop over output image height
# loop over output image height
for
oy
in
N
.
arange
(
lbound
[
0
],
ubound
[
0
],
dy
):
for
oy
in
np
.
arange
(
lbound
[
0
],
ubound
[
0
],
dy
):
# loop over output image width
# loop over output image width
for
ox
in
N
.
arange
(
lbound
[
1
],
ubound
[
1
],
dx
):
for
ox
in
np
.
arange
(
lbound
[
1
],
ubound
[
1
],
dx
):
# kern[l] is filter value to apply at (oj,oi)
# kern[l] is filter value to apply at (oj,oi)
# for (iy,ix)
# for (iy,ix)
l
=
0
l
=
0
# ... ITERATE OVER INPUT UNITS IN RECEPTIVE FIELD
# ... ITERATE OVER INPUT UNITS IN RECEPTIVE FIELD
for
ky
in
oy
+
N
.
arange
(
kshp
[
0
]):
for
ky
in
oy
+
np
.
arange
(
kshp
[
0
]):
for
kx
in
ox
+
N
.
arange
(
kshp
[
1
]):
for
kx
in
ox
+
np
.
arange
(
kshp
[
1
]):
# verify if we are still within image
# verify if we are still within image
# boundaries. Equivalent to
# boundaries. Equivalent to
...
@@ -173,13 +172,13 @@ class ConvolutionIndices(Op):
...
@@ -173,13 +172,13 @@ class ConvolutionIndices(Op):
# convert to "valid" input space
# convert to "valid" input space
# coords used to determine column
# coords used to determine column
# index to write to in sparse mat
# index to write to in sparse mat
iy
,
ix
=
N
.
array
((
ky
,
kx
))
-
topleft
iy
,
ix
=
np
.
array
((
ky
,
kx
))
-
topleft
# determine raster-index of input pixel...
# determine raster-index of input pixel...
# taking into account multiple
# taking into account multiple
# input features
# input features
col
=
iy
*
inshp
[
2
]
+
ix
+
\
col
=
iy
*
inshp
[
2
]
+
ix
+
\
fmapi
*
N
.
prod
(
inshp
[
1
:])
fmapi
*
np
.
prod
(
inshp
[
1
:])
# convert oy,ox values to output
# convert oy,ox values to output
# space coordinates
# space coordinates
...
@@ -188,7 +187,7 @@ class ConvolutionIndices(Op):
...
@@ -188,7 +187,7 @@ class ConvolutionIndices(Op):
else
:
else
:
(
y
,
x
)
=
(
oy
,
ox
)
-
topleft
(
y
,
x
)
=
(
oy
,
ox
)
-
topleft
# taking into account step size
# taking into account step size
(
y
,
x
)
=
N
.
array
([
y
,
x
])
/
(
dy
,
dx
)
(
y
,
x
)
=
np
.
array
([
y
,
x
])
/
(
dy
,
dx
)
# convert to row index of sparse matrix
# convert to row index of sparse matrix
if
ws
:
if
ws
:
...
@@ -228,7 +227,7 @@ class ConvolutionIndices(Op):
...
@@ -228,7 +227,7 @@ class ConvolutionIndices(Op):
if
ws
:
if
ws
:
kmap
=
None
kmap
=
None
else
:
else
:
kmap
=
N
.
zeros
(
ntaps
,
dtype
=
'int'
)
kmap
=
np
.
zeros
(
ntaps
,
dtype
=
'int'
)
k
=
0
k
=
0
# print 'TEMPORARY BUGFIX: REMOVE !!!'
# print 'TEMPORARY BUGFIX: REMOVE !!!'
for
j
in
xrange
(
spmat
.
shape
[
1
]):
for
j
in
xrange
(
spmat
.
shape
[
1
]):
...
@@ -259,7 +258,7 @@ class ConvolutionIndices(Op):
...
@@ -259,7 +258,7 @@ class ConvolutionIndices(Op):
indices
,
indptr
,
spmatshp
,
outshp
=
self
.
evaluate
(
inshp
,
kshp
)
indices
,
indptr
,
spmatshp
,
outshp
=
self
.
evaluate
(
inshp
,
kshp
)
out_indices
[
0
]
=
indices
out_indices
[
0
]
=
indices
out_indptr
[
0
]
=
indptr
out_indptr
[
0
]
=
indptr
spmat_shape
[
0
]
=
n
umpy
.
asarray
(
spmatshp
)
spmat_shape
[
0
]
=
n
p
.
asarray
(
spmatshp
)
convolution_indices
=
ConvolutionIndices
()
convolution_indices
=
ConvolutionIndices
()
...
@@ -318,13 +317,12 @@ def convolve(kerns, kshp, nkern, images, imgshp, step=(1, 1), bias=None,
...
@@ -318,13 +317,12 @@ def convolve(kerns, kshp, nkern, images, imgshp, step=(1, 1), bias=None,
:TODO: test for 1D and think of how to do n-d convolutions
:TODO: test for 1D and think of how to do n-d convolutions
"""
"""
N
=
numpy
# start by computing output dimensions, size, etc
# start by computing output dimensions, size, etc
kern_size
=
N
.
int64
(
N
.
prod
(
kshp
))
kern_size
=
np
.
int64
(
np
.
prod
(
kshp
))
# inshp contains either 2 entries (height,width) or 3 (nfeatures,h,w)
# inshp contains either 2 entries (height,width) or 3 (nfeatures,h,w)
# in the first case, default nfeatures to 1
# in the first case, default nfeatures to 1
if
N
.
size
(
imgshp
)
==
2
:
if
np
.
size
(
imgshp
)
==
2
:
imgshp
=
(
1
,)
+
imgshp
imgshp
=
(
1
,)
+
imgshp
# construct indices and index pointers for sparse matrix, which,
# construct indices and index pointers for sparse matrix, which,
...
@@ -334,12 +332,12 @@ def convolve(kerns, kshp, nkern, images, imgshp, step=(1, 1), bias=None,
...
@@ -334,12 +332,12 @@ def convolve(kerns, kshp, nkern, images, imgshp, step=(1, 1), bias=None,
convolution_indices
.
conv_eval
(
imgshp
,
kshp
,
step
,
mode
)
convolution_indices
.
conv_eval
(
imgshp
,
kshp
,
step
,
mode
)
# build sparse matrix, then generate stack of image patches
# build sparse matrix, then generate stack of image patches
csc
=
theano
.
sparse
.
CSM
(
sptype
)(
N
.
ones
(
indices
.
size
),
indices
,
csc
=
theano
.
sparse
.
CSM
(
sptype
)(
np
.
ones
(
indices
.
size
),
indices
,
indptr
,
spmat_shape
)
indptr
,
spmat_shape
)
patches
=
(
sparse
.
structured_dot
(
csc
,
images
.
T
))
.
T
patches
=
(
sparse
.
structured_dot
(
csc
,
images
.
T
))
.
T
# compute output of linear classifier
# compute output of linear classifier
pshape
=
tensor
.
stack
([
images
.
shape
[
0
]
*
tensor
.
as_tensor
(
N
.
prod
(
outshp
)),
\
pshape
=
tensor
.
stack
([
images
.
shape
[
0
]
*
tensor
.
as_tensor
(
np
.
prod
(
outshp
)),
\
tensor
.
as_tensor
(
imgshp
[
0
]
*
kern_size
)])
tensor
.
as_tensor
(
imgshp
[
0
]
*
kern_size
)])
patch_stack
=
tensor
.
reshape
(
patches
,
pshape
,
ndim
=
2
)
patch_stack
=
tensor
.
reshape
(
patches
,
pshape
,
ndim
=
2
)
...
@@ -354,14 +352,14 @@ def convolve(kerns, kshp, nkern, images, imgshp, step=(1, 1), bias=None,
...
@@ -354,14 +352,14 @@ def convolve(kerns, kshp, nkern, images, imgshp, step=(1, 1), bias=None,
# now to have feature maps in raster order ...
# now to have feature maps in raster order ...
# go from bsize*outshp x nkern to bsize x nkern*outshp
# go from bsize*outshp x nkern to bsize x nkern*outshp
newshp
=
tensor
.
stack
([
images
.
shape
[
0
],
\
newshp
=
tensor
.
stack
([
images
.
shape
[
0
],
\
tensor
.
as_tensor
(
N
.
prod
(
outshp
)),
\
tensor
.
as_tensor
(
np
.
prod
(
outshp
)),
\
tensor
.
as_tensor
(
nkern
)])
tensor
.
as_tensor
(
nkern
)])
tensout
=
tensor
.
reshape
(
output
,
newshp
,
ndim
=
3
)
tensout
=
tensor
.
reshape
(
output
,
newshp
,
ndim
=
3
)
output
=
tensor
.
DimShuffle
((
False
,)
*
tensout
.
ndim
,
(
0
,
2
,
1
))(
tensout
)
output
=
tensor
.
DimShuffle
((
False
,)
*
tensout
.
ndim
,
(
0
,
2
,
1
))(
tensout
)
if
flatten
:
if
flatten
:
output
=
tensor
.
flatten
(
output
,
2
)
output
=
tensor
.
flatten
(
output
,
2
)
return
output
,
N
.
hstack
((
nkern
,
outshp
))
return
output
,
np
.
hstack
((
nkern
,
outshp
))
def
max_pool
(
images
,
imgshp
,
maxpoolshp
):
def
max_pool
(
images
,
imgshp
,
maxpoolshp
):
...
@@ -380,12 +378,11 @@ def max_pool(images, imgshp, maxpoolshp):
...
@@ -380,12 +378,11 @@ def max_pool(images, imgshp, maxpoolshp):
:return: out1, symbolic result (2D tensor)
:return: out1, symbolic result (2D tensor)
:return: out2, logical shape of the output
:return: out2, logical shape of the output
"""
"""
N
=
numpy
poolsize
=
np
.
int64
(
np
.
prod
(
maxpoolshp
))
poolsize
=
N
.
int64
(
N
.
prod
(
maxpoolshp
))
# imgshp contains either 2 entries (height,width) or 3 (nfeatures,h,w)
# imgshp contains either 2 entries (height,width) or 3 (nfeatures,h,w)
# in the first case, default nfeatures to 1
# in the first case, default nfeatures to 1
if
N
.
size
(
imgshp
)
==
2
:
if
np
.
size
(
imgshp
)
==
2
:
imgshp
=
(
1
,)
+
imgshp
imgshp
=
(
1
,)
+
imgshp
# construct indices and index pointers for sparse matrix, which,
# construct indices and index pointers for sparse matrix, which,
...
@@ -401,12 +398,12 @@ def max_pool(images, imgshp, maxpoolshp):
...
@@ -401,12 +398,12 @@ def max_pool(images, imgshp, maxpoolshp):
# print 'outshp = ', outshp
# print 'outshp = ', outshp
# build sparse matrix, then generate stack of image patches
# build sparse matrix, then generate stack of image patches
csc
=
theano
.
sparse
.
CSM
(
sptype
)(
N
.
ones
(
indices
.
size
),
indices
,
csc
=
theano
.
sparse
.
CSM
(
sptype
)(
np
.
ones
(
indices
.
size
),
indices
,
indptr
,
spmat_shape
)
indptr
,
spmat_shape
)
patches
=
sparse
.
structured_dot
(
csc
,
images
.
T
)
.
T
patches
=
sparse
.
structured_dot
(
csc
,
images
.
T
)
.
T
pshape
=
tensor
.
stack
([
images
.
shape
[
0
]
*
\
pshape
=
tensor
.
stack
([
images
.
shape
[
0
]
*
\
tensor
.
as_tensor
(
N
.
prod
(
outshp
)),
tensor
.
as_tensor
(
np
.
prod
(
outshp
)),
tensor
.
as_tensor
(
imgshp
[
0
]),
tensor
.
as_tensor
(
imgshp
[
0
]),
tensor
.
as_tensor
(
poolsize
)])
tensor
.
as_tensor
(
poolsize
)])
patch_stack
=
tensor
.
reshape
(
patches
,
pshape
,
ndim
=
3
)
patch_stack
=
tensor
.
reshape
(
patches
,
pshape
,
ndim
=
3
)
...
@@ -414,7 +411,7 @@ def max_pool(images, imgshp, maxpoolshp):
...
@@ -414,7 +411,7 @@ def max_pool(images, imgshp, maxpoolshp):
out1
=
tensor
.
max
(
patch_stack
,
axis
=
2
)
out1
=
tensor
.
max
(
patch_stack
,
axis
=
2
)
pshape
=
tensor
.
stack
([
images
.
shape
[
0
],
pshape
=
tensor
.
stack
([
images
.
shape
[
0
],
tensor
.
as_tensor
(
N
.
prod
(
outshp
)),
tensor
.
as_tensor
(
np
.
prod
(
outshp
)),
tensor
.
as_tensor
(
imgshp
[
0
])])
tensor
.
as_tensor
(
imgshp
[
0
])])
out2
=
tensor
.
reshape
(
out1
,
pshape
,
ndim
=
3
)
out2
=
tensor
.
reshape
(
out1
,
pshape
,
ndim
=
3
)
...
...
theano/sparse/sandbox/sp2.py
浏览文件 @
86d21acd
from
__future__
import
absolute_import
,
print_function
,
division
from
__future__
import
absolute_import
,
print_function
,
division
import
numpy
import
numpy
as
np
from
six.moves
import
xrange
from
six.moves
import
xrange
import
theano
import
theano
import
scipy.sparse
import
scipy.sparse
...
@@ -74,7 +74,7 @@ class Poisson(gof.op.Op):
...
@@ -74,7 +74,7 @@ class Poisson(gof.op.Op):
assert
_is_sparse
(
x
)
assert
_is_sparse
(
x
)
assert
x
.
format
in
[
"csr"
,
"csc"
]
assert
x
.
format
in
[
"csr"
,
"csc"
]
out
[
0
]
=
x
.
copy
()
out
[
0
]
=
x
.
copy
()
out
[
0
]
.
data
=
n
umpy
.
asarray
(
numpy
.
random
.
poisson
(
out
[
0
]
.
data
),
out
[
0
]
.
data
=
n
p
.
asarray
(
np
.
random
.
poisson
(
out
[
0
]
.
data
),
dtype
=
x
.
dtype
)
dtype
=
x
.
dtype
)
out
[
0
]
.
eliminate_zeros
()
out
[
0
]
.
eliminate_zeros
()
...
@@ -123,7 +123,7 @@ class Binomial(gof.op.Op):
...
@@ -123,7 +123,7 @@ class Binomial(gof.op.Op):
def
perform
(
self
,
node
,
inputs
,
outputs
):
def
perform
(
self
,
node
,
inputs
,
outputs
):
(
n
,
p
,
shape
)
=
inputs
(
n
,
p
,
shape
)
=
inputs
(
out
,)
=
outputs
(
out
,)
=
outputs
binomial
=
n
umpy
.
random
.
binomial
(
n
,
p
,
size
=
shape
)
binomial
=
n
p
.
random
.
binomial
(
n
,
p
,
size
=
shape
)
csx_matrix
=
getattr
(
scipy
.
sparse
,
self
.
format
+
'_matrix'
)
csx_matrix
=
getattr
(
scipy
.
sparse
,
self
.
format
+
'_matrix'
)
out
[
0
]
=
csx_matrix
(
binomial
,
dtype
=
self
.
dtype
)
out
[
0
]
=
csx_matrix
(
binomial
,
dtype
=
self
.
dtype
)
...
@@ -195,14 +195,14 @@ class Multinomial(gof.op.Op):
...
@@ -195,14 +195,14 @@ class Multinomial(gof.op.Op):
if
n
.
ndim
==
0
:
if
n
.
ndim
==
0
:
for
i
in
xrange
(
p
.
shape
[
0
]):
for
i
in
xrange
(
p
.
shape
[
0
]):
k
,
l
=
p
.
indptr
[
i
],
p
.
indptr
[
i
+
1
]
k
,
l
=
p
.
indptr
[
i
],
p
.
indptr
[
i
+
1
]
out
[
0
]
.
data
[
k
:
l
]
=
n
umpy
.
random
.
multinomial
(
n
,
p
.
data
[
k
:
l
])
out
[
0
]
.
data
[
k
:
l
]
=
n
p
.
random
.
multinomial
(
n
,
p
.
data
[
k
:
l
])
elif
n
.
ndim
==
1
:
elif
n
.
ndim
==
1
:
if
n
.
shape
[
0
]
!=
p
.
shape
[
0
]:
if
n
.
shape
[
0
]
!=
p
.
shape
[
0
]:
raise
ValueError
(
'The number of element of n must be '
raise
ValueError
(
'The number of element of n must be '
'the same as the number of row of p.'
)
'the same as the number of row of p.'
)
for
i
in
xrange
(
p
.
shape
[
0
]):
for
i
in
xrange
(
p
.
shape
[
0
]):
k
,
l
=
p
.
indptr
[
i
],
p
.
indptr
[
i
+
1
]
k
,
l
=
p
.
indptr
[
i
],
p
.
indptr
[
i
+
1
]
out
[
0
]
.
data
[
k
:
l
]
=
n
umpy
.
random
.
multinomial
(
n
[
i
],
p
.
data
[
k
:
l
])
out
[
0
]
.
data
[
k
:
l
]
=
n
p
.
random
.
multinomial
(
n
[
i
],
p
.
data
[
k
:
l
])
def
grad
(
self
,
inputs
,
outputs_gradients
):
def
grad
(
self
,
inputs
,
outputs_gradients
):
comment_n
=
"No gradient exists for the number of samples in class
\
comment_n
=
"No gradient exists for the number of samples in class
\
...
...
theano/sparse/sandbox/test_sp.py
浏览文件 @
86d21acd
...
@@ -11,7 +11,7 @@ if not theano.sparse.enable_sparse:
...
@@ -11,7 +11,7 @@ if not theano.sparse.enable_sparse:
import
scipy.sparse
import
scipy.sparse
from
scipy.signal
import
convolve2d
from
scipy.signal
import
convolve2d
import
scipy.sparse
as
sparse
import
scipy.sparse
as
sparse
import
numpy
import
numpy
as
np
from
six.moves
import
xrange
from
six.moves
import
xrange
from
theano
import
function
,
tensor
from
theano
import
function
,
tensor
...
@@ -43,8 +43,8 @@ class TestSP(unittest.TestCase):
...
@@ -43,8 +43,8 @@ class TestSP(unittest.TestCase):
bias
=
tensor
.
dvector
()
bias
=
tensor
.
dvector
()
kerns
=
tensor
.
dmatrix
()
kerns
=
tensor
.
dmatrix
()
input
=
tensor
.
dmatrix
()
input
=
tensor
.
dmatrix
()
rng
=
n
umpy
.
random
.
RandomState
(
3423489
)
rng
=
n
p
.
random
.
RandomState
(
3423489
)
filters
=
rng
.
randn
(
nkern
,
n
umpy
.
prod
(
kshp
))
filters
=
rng
.
randn
(
nkern
,
n
p
.
prod
(
kshp
))
biasvals
=
rng
.
randn
(
nkern
)
biasvals
=
rng
.
randn
(
nkern
)
for
mode
in
(
'FAST_COMPILE'
,
'FAST_RUN'
):
for
mode
in
(
'FAST_COMPILE'
,
'FAST_RUN'
):
...
@@ -57,12 +57,12 @@ class TestSP(unittest.TestCase):
...
@@ -57,12 +57,12 @@ class TestSP(unittest.TestCase):
f
=
function
([
kerns
,
bias
,
input
],
output
,
mode
=
mode
)
f
=
function
([
kerns
,
bias
,
input
],
output
,
mode
=
mode
)
# now test with real values
# now test with real values
img2d
=
n
umpy
.
arange
(
bsize
*
numpy
.
prod
(
imshp
))
.
reshape
((
\
img2d
=
n
p
.
arange
(
bsize
*
np
.
prod
(
imshp
))
.
reshape
((
\
bsize
,)
+
imshp
)
bsize
,)
+
imshp
)
img1d
=
img2d
.
reshape
(
bsize
,
-
1
)
img1d
=
img2d
.
reshape
(
bsize
,
-
1
)
# create filters (need to be flipped to use convolve2d)
# create filters (need to be flipped to use convolve2d)
filtersflipped
=
n
umpy
.
zeros
((
nkern
,)
+
kshp
)
filtersflipped
=
n
p
.
zeros
((
nkern
,)
+
kshp
)
for
k
in
range
(
nkern
):
for
k
in
range
(
nkern
):
it
=
reversed
(
filters
[
k
,
:])
it
=
reversed
(
filters
[
k
,
:])
for
i
in
range
(
kshp
[
0
]):
for
i
in
range
(
kshp
[
0
]):
...
@@ -71,11 +71,11 @@ class TestSP(unittest.TestCase):
...
@@ -71,11 +71,11 @@ class TestSP(unittest.TestCase):
# compute output with convolve2d
# compute output with convolve2d
if
conv_mode
==
'valid'
:
if
conv_mode
==
'valid'
:
fulloutshp
=
n
umpy
.
array
(
imshp
)
-
numpy
.
array
(
kshp
)
+
1
fulloutshp
=
n
p
.
array
(
imshp
)
-
np
.
array
(
kshp
)
+
1
else
:
else
:
fulloutshp
=
n
umpy
.
array
(
imshp
)
+
numpy
.
array
(
kshp
)
-
1
fulloutshp
=
n
p
.
array
(
imshp
)
+
np
.
array
(
kshp
)
-
1
ntime1
=
time
.
time
()
ntime1
=
time
.
time
()
refout
=
n
umpy
.
zeros
((
bsize
,)
+
tuple
(
fulloutshp
)
+
(
nkern
,))
refout
=
n
p
.
zeros
((
bsize
,)
+
tuple
(
fulloutshp
)
+
(
nkern
,))
for
b
in
range
(
bsize
):
for
b
in
range
(
bsize
):
for
n
in
range
(
nkern
):
for
n
in
range
(
nkern
):
refout
[
b
,
...
,
n
]
=
convolve2d
(
img2d
[
b
,
:,
:],
refout
[
b
,
...
,
n
]
=
convolve2d
(
img2d
[
b
,
:,
:],
...
@@ -88,7 +88,7 @@ class TestSP(unittest.TestCase):
...
@@ -88,7 +88,7 @@ class TestSP(unittest.TestCase):
bench1
+=
biasvals
.
reshape
(
1
,
1
,
nkern
)
bench1
+=
biasvals
.
reshape
(
1
,
1
,
nkern
)
# swap the last two dimensions (output needs to be nkern x outshp)
# swap the last two dimensions (output needs to be nkern x outshp)
bench1
=
n
umpy
.
swapaxes
(
bench1
,
1
,
2
)
bench1
=
n
p
.
swapaxes
(
bench1
,
1
,
2
)
ttime1
=
time
.
time
()
ttime1
=
time
.
time
()
out1
=
f
(
filters
,
biasvals
,
img1d
)
out1
=
f
(
filters
,
biasvals
,
img1d
)
ttot
+=
time
.
time
()
-
ttime1
ttot
+=
time
.
time
()
-
ttime1
...
@@ -101,13 +101,13 @@ class TestSP(unittest.TestCase):
...
@@ -101,13 +101,13 @@ class TestSP(unittest.TestCase):
#downprop = function([kerns,input], vis, mode=mode)
#downprop = function([kerns,input], vis, mode=mode)
#visval = downprop(filters,img1d)
#visval = downprop(filters,img1d)
# test downward propagation -- reference implementation
# test downward propagation -- reference implementation
#pshape = (img1d.shape[0],n
umpy.prod(outshp[1:]),numpy
.prod(kshp))
#pshape = (img1d.shape[0],n
p.prod(outshp[1:]),np
.prod(kshp))
#patchstack = n
umpy
.zeros(pshape)
#patchstack = n
p
.zeros(pshape)
# for bi in n
umpy
.arange(pshape[0]): # batch index
# for bi in n
p
.arange(pshape[0]): # batch index
#abspos = 0
#abspos = 0
# for outy in n
umpy
.arange(outshp[1]):
# for outy in n
p
.arange(outshp[1]):
# for outx in n
umpy
.arange(outshp[2]):
# for outx in n
p
.arange(outshp[2]):
# for ni in n
umpy
.arange(nkern):
# for ni in n
p
.arange(nkern):
# print 'filters[n,:].shape = ', filters[n,:].shape
# print 'filters[n,:].shape = ', filters[n,:].shape
# print 'out1[bi,abspos].shape =',out1[bi,abspos].shape
# print 'out1[bi,abspos].shape =',out1[bi,abspos].shape
#patchstack[bi,abspos,:] = filters[n,:]*out1[bi,abspos]
#patchstack[bi,abspos,:] = filters[n,:]*out1[bi,abspos]
...
@@ -115,13 +115,13 @@ class TestSP(unittest.TestCase):
...
@@ -115,13 +115,13 @@ class TestSP(unittest.TestCase):
#patchstack = patchstack.reshape(1,-1)
#patchstack = patchstack.reshape(1,-1)
# indices, indptr, spmat_shape, sptype, outshp = \
# indices, indptr, spmat_shape, sptype, outshp = \
# sp.convolution_indices.conv_eval(imshp,kshp,ss,conv_mode)
# sp.convolution_indices.conv_eval(imshp,kshp,ss,conv_mode)
#spmat = sparse.csc_matrix((n
umpy
.ones_like(indices),indices,indptr),spmat_shape)
#spmat = sparse.csc_matrix((n
p
.ones_like(indices),indices,indptr),spmat_shape)
#visref = n
umpy
.dot(patchstack, spmat.todense())
#visref = n
p
.dot(patchstack, spmat.todense())
# print 'visval = ', visval
# print 'visval = ', visval
# print 'visref = ', visref
# print 'visref = ', visref
#assert n
umpy
.all(visref==visval)
#assert n
p
.all(visref==visval)
# print '**** Convolution Profiling Results (',mode,') ****'
# print '**** Convolution Profiling Results (',mode,') ****'
...
@@ -143,10 +143,10 @@ class TestSP(unittest.TestCase):
...
@@ -143,10 +143,10 @@ class TestSP(unittest.TestCase):
# symbolic stuff
# symbolic stuff
kerns
=
[
tensor
.
dmatrix
(),
tensor
.
dmatrix
()]
kerns
=
[
tensor
.
dmatrix
(),
tensor
.
dmatrix
()]
input
=
tensor
.
dmatrix
()
input
=
tensor
.
dmatrix
()
rng
=
n
umpy
.
random
.
RandomState
(
3423489
)
rng
=
n
p
.
random
.
RandomState
(
3423489
)
# build actual input images
# build actual input images
img2d
=
n
umpy
.
arange
(
bsize
*
numpy
.
prod
(
imshp
))
.
reshape
((
bsize
,)
+
imshp
)
img2d
=
n
p
.
arange
(
bsize
*
np
.
prod
(
imshp
))
.
reshape
((
bsize
,)
+
imshp
)
img1d
=
img2d
.
reshape
(
bsize
,
-
1
)
img1d
=
img2d
.
reshape
(
bsize
,
-
1
)
for
mode
in
(
'FAST_COMPILE'
,
'FAST_RUN'
):
for
mode
in
(
'FAST_COMPILE'
,
'FAST_RUN'
):
...
@@ -157,8 +157,8 @@ class TestSP(unittest.TestCase):
...
@@ -157,8 +157,8 @@ class TestSP(unittest.TestCase):
nkerns
[
0
],
input
,
imshp
,
ss
[
0
],
mode
=
conv_mode
)
nkerns
[
0
],
input
,
imshp
,
ss
[
0
],
mode
=
conv_mode
)
l1propup
=
function
([
kerns
[
0
],
input
],
l1hid
,
mode
=
mode
)
l1propup
=
function
([
kerns
[
0
],
input
],
l1hid
,
mode
=
mode
)
#l1kernvals = n
umpy.random.rand(nkerns[0],numpy
.prod(kshp[0]))
#l1kernvals = n
p.random.rand(nkerns[0],np
.prod(kshp[0]))
l1kernvals
=
n
umpy
.
arange
(
nkerns
[
0
]
*
numpy
.
prod
(
kshp
[
0
]))
.
reshape
(
nkerns
[
0
],
numpy
.
prod
(
kshp
[
0
]))
l1kernvals
=
n
p
.
arange
(
nkerns
[
0
]
*
np
.
prod
(
kshp
[
0
]))
.
reshape
(
nkerns
[
0
],
np
.
prod
(
kshp
[
0
]))
l1hidval
=
l1propup
(
l1kernvals
,
img1d
)
l1hidval
=
l1propup
(
l1kernvals
,
img1d
)
# actual values
# actual values
...
@@ -166,17 +166,17 @@ class TestSP(unittest.TestCase):
...
@@ -166,17 +166,17 @@ class TestSP(unittest.TestCase):
nkerns
[
1
],
l1hid
,
l1shp
,
ss
[
1
],
mode
=
conv_mode
)
nkerns
[
1
],
l1hid
,
l1shp
,
ss
[
1
],
mode
=
conv_mode
)
l2propup
=
function
([
kerns
[
1
],
l1hid
],
l2hid
,
mode
=
mode
)
l2propup
=
function
([
kerns
[
1
],
l1hid
],
l2hid
,
mode
=
mode
)
#l2kernvals = n
umpy.random.rand(nkerns[1],numpy
.prod(kshp[1])*nkerns[0])
#l2kernvals = n
p.random.rand(nkerns[1],np
.prod(kshp[1])*nkerns[0])
l2kernvals
=
n
umpy
.
arange
(
nkerns
[
1
]
*
numpy
.
prod
(
kshp
[
1
])
*
nkerns
[
0
])
.
reshape
(
nkerns
[
1
],
numpy
.
prod
(
kshp
[
1
])
*
nkerns
[
0
])
l2kernvals
=
n
p
.
arange
(
nkerns
[
1
]
*
np
.
prod
(
kshp
[
1
])
*
nkerns
[
0
])
.
reshape
(
nkerns
[
1
],
np
.
prod
(
kshp
[
1
])
*
nkerns
[
0
])
# for debugging, we bring things back to integers
# for debugging, we bring things back to integers
l1hidval
=
n
umpy
.
arange
(
numpy
.
size
(
l1hidval
))
.
reshape
(
l1hidval
.
shape
)
l1hidval
=
n
p
.
arange
(
np
.
size
(
l1hidval
))
.
reshape
(
l1hidval
.
shape
)
l2hidval
=
l2propup
(
l2kernvals
,
l1hidval
)
l2hidval
=
l2propup
(
l2kernvals
,
l1hidval
)
def
test_maxpool
(
self
):
def
test_maxpool
(
self
):
# generate flatted images
# generate flatted images
maxpoolshps
=
((
2
,
2
),
(
3
,
3
),
(
4
,
4
),
(
5
,
5
),
(
6
,
6
))
maxpoolshps
=
((
2
,
2
),
(
3
,
3
),
(
4
,
4
),
(
5
,
5
),
(
6
,
6
))
imval
=
n
umpy
.
random
.
rand
(
4
,
5
,
10
,
10
)
imval
=
n
p
.
random
.
rand
(
4
,
5
,
10
,
10
)
images
=
tensor
.
dmatrix
()
images
=
tensor
.
dmatrix
()
for
maxpoolshp
in
maxpoolshps
:
for
maxpoolshp
in
maxpoolshps
:
...
@@ -187,10 +187,10 @@ class TestSP(unittest.TestCase):
...
@@ -187,10 +187,10 @@ class TestSP(unittest.TestCase):
output_val
=
f
(
imval
.
reshape
(
imval
.
shape
[
0
],
-
1
))
output_val
=
f
(
imval
.
reshape
(
imval
.
shape
[
0
],
-
1
))
# numeric verification
# numeric verification
my_output_val
=
n
umpy
.
zeros
((
imval
.
shape
[
0
],
imval
.
shape
[
1
],
my_output_val
=
n
p
.
zeros
((
imval
.
shape
[
0
],
imval
.
shape
[
1
],
imval
.
shape
[
2
]
//
maxpoolshp
[
0
],
imval
.
shape
[
2
]
//
maxpoolshp
[
0
],
imval
.
shape
[
3
]
//
maxpoolshp
[
1
]))
imval
.
shape
[
3
]
//
maxpoolshp
[
1
]))
assert
n
umpy
.
prod
(
my_output_val
.
shape
[
1
:])
==
numpy
.
prod
(
numpy
.
r_
[
imval
.
shape
[
1
],
outshp
])
assert
n
p
.
prod
(
my_output_val
.
shape
[
1
:])
==
np
.
prod
(
np
.
r_
[
imval
.
shape
[
1
],
outshp
])
for
n
in
range
(
imval
.
shape
[
0
]):
for
n
in
range
(
imval
.
shape
[
0
]):
for
k
in
range
(
imval
.
shape
[
1
]):
for
k
in
range
(
imval
.
shape
[
1
]):
...
@@ -198,9 +198,9 @@ class TestSP(unittest.TestCase):
...
@@ -198,9 +198,9 @@ class TestSP(unittest.TestCase):
for
j
in
range
(
imval
.
shape
[
3
]
//
maxpoolshp
[
1
]):
for
j
in
range
(
imval
.
shape
[
3
]
//
maxpoolshp
[
1
]):
ii
,
jj
=
i
*
maxpoolshp
[
0
],
j
*
maxpoolshp
[
1
]
ii
,
jj
=
i
*
maxpoolshp
[
0
],
j
*
maxpoolshp
[
1
]
patch
=
imval
[
n
,
k
,
ii
:
ii
+
maxpoolshp
[
0
],
jj
:
jj
+
maxpoolshp
[
1
]]
patch
=
imval
[
n
,
k
,
ii
:
ii
+
maxpoolshp
[
0
],
jj
:
jj
+
maxpoolshp
[
1
]]
my_output_val
[
n
,
k
,
i
,
j
]
=
n
umpy
.
max
(
patch
)
my_output_val
[
n
,
k
,
i
,
j
]
=
n
p
.
max
(
patch
)
my_output_val
=
my_output_val
.
reshape
(
imval
.
shape
[
0
],
-
1
)
my_output_val
=
my_output_val
.
reshape
(
imval
.
shape
[
0
],
-
1
)
assert
n
umpy
.
all
(
output_val
==
my_output_val
)
assert
n
p
.
all
(
output_val
==
my_output_val
)
def
mp
(
input
):
def
mp
(
input
):
output
,
outshp
=
sp
.
max_pool
(
input
,
imval
.
shape
[
1
:],
maxpoolshp
)
output
,
outshp
=
sp
.
max_pool
(
input
,
imval
.
shape
[
1
:],
maxpoolshp
)
...
...
theano/sparse/sandbox/truedot.py
浏览文件 @
86d21acd
...
@@ -2,7 +2,7 @@ from __future__ import absolute_import, print_function, division
...
@@ -2,7 +2,7 @@ from __future__ import absolute_import, print_function, division
import
unittest
import
unittest
import
theano
import
theano
import
numpy
import
numpy
as
np
import
scipy.sparse
as
sp
import
scipy.sparse
as
sp
from
theano
import
sparse
from
theano
import
sparse
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论