提交 e44ce417 authored 作者: affanv14's avatar affanv14 提交者: Mohammed Affan

Improve test for abstractconv

上级 95450282
...@@ -3,6 +3,7 @@ import unittest ...@@ -3,6 +3,7 @@ import unittest
import numpy as np import numpy as np
from nose.plugins.skip import SkipTest from nose.plugins.skip import SkipTest
from nose.tools import assert_raises, assert_true from nose.tools import assert_raises, assert_true
import theano import theano
from theano import tensor from theano import tensor
from theano.configparser import change_flags from theano.configparser import change_flags
...@@ -1701,41 +1702,49 @@ class TestConv2dGrads(unittest.TestCase): ...@@ -1701,41 +1702,49 @@ class TestConv2dGrads(unittest.TestCase):
class Grouped_conv_noOptim(unittest.TestCase): class Grouped_conv_noOptim(unittest.TestCase):
conv2d = staticmethod(theano.tensor.nnet.abstract_conv.AbstractConv2d)
conv2d_gradw = staticmethod(theano.tensor.nnet.abstract_conv.AbstractConv2d_gradWeights)
conv2d_gradi = staticmethod(theano.tensor.nnet.abstract_conv.AbstractConv2d_gradInputs)
mode = theano.Mode(optimizer=None)
flip_filter = False
def setUp(self): def setUp(self):
self.num_groups = 3 self.num_groups = [3, 2, 4, 4]
self.border_mode = 'valid' self.border_mode = 'valid'
self.subsample = (1, 1) self.subsample = (1, 1)
self.img_shape = (5, 6, 5, 5) self.img_shape = [(5, 6, 5, 5), (4, 4, 7, 5), (3, 8, 5, 3), (2, 4, 7, 7)]
self.kern_shape = (6, 2, 3, 3) self.kern_shape = [(6, 2, 3, 3), (6, 2, 5, 3), (4, 2, 3, 3), (4, 1, 3, 5)]
self.top_shape = (5, 6, 3, 3) self.top_shape = [(5, 6, 3, 3), (4, 6, 3, 3), (3, 4, 3, 1), (2, 4, 5, 3)]
self.filter_dilation = (1, 1) self.filter_dilation = (1, 1)
self.mode = theano.Mode(optimizer=None) self.ref_mode = 'FAST_RUN'
def test_fwd(self): def test_fwd(self):
img = np.random.random(self.img_shape).astype('float32') for imshp, kshp, groups in zip(self.img_shape, self.kern_shape, self.num_groups):
kern = np.random.random(self.kern_shape).astype('float32') img = np.random.random(imshp).astype('float32')
split_imgs = np.split(img, self.num_groups, axis=1) kern = np.random.random(kshp).astype('float32')
split_kern = np.split(kern, self.num_groups, axis=0) split_imgs = np.split(img, groups, axis=1)
img_var = theano.tensor.tensor4('img') split_kern = np.split(kern, groups, axis=0)
kern_var = theano.tensor.tensor4('kern') img_sym = theano.tensor.tensor4('img')
kern_sym = theano.tensor.tensor4('kern')
grouped_abstractconv_func = theano.tensor.nnet.abstract_conv.AbstractConv2d(imshp=None,
kshp=None, grouped_abstractconv_func = self.conv2d(border_mode=self.border_mode,
border_mode=self.border_mode,
subsample=self.subsample, subsample=self.subsample,
filter_dilation=self.filter_dilation, filter_dilation=self.filter_dilation,
num_groups=self.num_groups) num_groups=groups)
grouped_conv_output = grouped_abstractconv_func(img_var, kern_var) if self.flip_filter:
grouped_func = theano.function([img_var, kern_var], grouped_conv_output, mode=self.mode) grouped_conv_output = grouped_abstractconv_func(img_sym, kern_sym[:, :, ::-1, ::-1])
else:
grouped_conv_output = grouped_abstractconv_func(img_sym, kern_sym)
grouped_func = theano.function([img_sym, kern_sym], grouped_conv_output, mode=self.mode)
grouped_output = grouped_func(img, kern) grouped_output = grouped_func(img, kern)
normal_conv_output = conv2d_corr(img_var, normal_conv_output = conv2d_corr(img_sym,
kern_var, kern_sym,
border_mode=self.border_mode, border_mode=self.border_mode,
subsample=self.subsample, subsample=self.subsample,
filter_dilation=self.filter_dilation) filter_dilation=self.filter_dilation)
normal_func = theano.function([img_var, kern_var], normal_conv_output, normal_func = theano.function([img_sym, kern_sym], normal_conv_output,
mode='FAST_RUN') mode=self.ref_mode)
normal_concat_output = [normal_func(img_arr, kern_arr) normal_concat_output = [normal_func(img_arr, kern_arr)
for img_arr, kern_arr in zip(split_imgs, split_kern)] for img_arr, kern_arr in zip(split_imgs, split_kern)]
normal_concat_output = np.concatenate(normal_concat_output, axis=1) normal_concat_output = np.concatenate(normal_concat_output, axis=1)
...@@ -1747,31 +1756,32 @@ class Grouped_conv_noOptim(unittest.TestCase): ...@@ -1747,31 +1756,32 @@ class Grouped_conv_noOptim(unittest.TestCase):
mode=self.mode) mode=self.mode)
def test_gradweights(self): def test_gradweights(self):
img = np.random.random(self.img_shape).astype('float32') for imshp, kshp, tshp, groups in zip(self.img_shape, self.kern_shape, self.top_shape, self.num_groups):
top = np.random.random(self.top_shape).astype('float32') img = np.random.random(imshp).astype('float32')
split_imgs = np.split(img, self.num_groups, axis=1) top = np.random.random(tshp).astype('float32')
split_top = np.split(top, self.num_groups, axis=1) split_imgs = np.split(img, groups, axis=1)
img_var = theano.tensor.tensor4('img') split_top = np.split(top, groups, axis=1)
top_var = theano.tensor.tensor4('top') img_sym = theano.tensor.tensor4('img')
top_sym = theano.tensor.tensor4('top')
grouped_abstractconvgrad_func = theano.tensor.nnet.abstract_conv.AbstractConv2d_gradWeights(imshp=None,
kshp=None, grouped_abstractconvgrad_func = self.conv2d_gradw(border_mode=self.border_mode,
border_mode=self.border_mode,
subsample=self.subsample, subsample=self.subsample,
filter_dilation=self.filter_dilation, filter_dilation=self.filter_dilation,
num_groups=self.num_groups) num_groups=groups)
grouped_conv_output = grouped_abstractconvgrad_func(img_var, top_var, self.kern_shape[-2:]) grouped_conv_output = grouped_abstractconvgrad_func(img_sym, top_sym, kshp[-2:])
grouped_func = theano.function([img_var, top_var], grouped_conv_output, mode=self.mode) if self.flip_filter:
grouped_conv_output = grouped_conv_output[:, :, ::-1, ::-1]
grouped_func = theano.function([img_sym, top_sym], grouped_conv_output, mode=self.mode)
grouped_output = grouped_func(img, top) grouped_output = grouped_func(img, top)
normal_conv_output = conv2d_corr_gw(img_var, normal_conv_output = conv2d_corr_gw(img_sym,
top_var, top_sym,
self.kern_shape, kshp,
border_mode=self.border_mode, border_mode=self.border_mode,
subsample=self.subsample, subsample=self.subsample,
filter_dilation=self.filter_dilation) filter_dilation=self.filter_dilation)
normal_func = theano.function([img_var, top_var], normal_conv_output, normal_func = theano.function([img_sym, top_sym], normal_conv_output,
mode='FAST_RUN') mode=self.ref_mode)
normal_concat_output = [normal_func(img_arr, top_arr) normal_concat_output = [normal_func(img_arr, top_arr)
for img_arr, top_arr in zip(split_imgs, split_top)] for img_arr, top_arr in zip(split_imgs, split_top)]
normal_concat_output = np.concatenate(normal_concat_output, axis=0) normal_concat_output = np.concatenate(normal_concat_output, axis=0)
...@@ -1779,39 +1789,41 @@ class Grouped_conv_noOptim(unittest.TestCase): ...@@ -1779,39 +1789,41 @@ class Grouped_conv_noOptim(unittest.TestCase):
utt.assert_allclose(grouped_output, normal_concat_output) utt.assert_allclose(grouped_output, normal_concat_output)
def abstract_conv_gradweight(inputs_val, output_val): def abstract_conv_gradweight(inputs_val, output_val):
return grouped_abstractconvgrad_func(inputs_val, output_val, self.kern_shape[-2:]) return grouped_abstractconvgrad_func(inputs_val, output_val, kshp[-2:])
utt.verify_grad(abstract_conv_gradweight, utt.verify_grad(abstract_conv_gradweight,
[img, top], [img, top],
mode=self.mode, eps=1) mode=self.mode, eps=1)
def test_gradinputs(self): def test_gradinputs(self):
kern = np.random.random(self.kern_shape).astype('float32') for imshp, kshp, tshp, groups in zip(self.img_shape, self.kern_shape, self.top_shape, self.num_groups):
top = np.random.random(self.top_shape).astype('float32') kern = np.random.random(kshp).astype('float32')
split_kerns = np.split(kern, self.num_groups, axis=0) top = np.random.random(tshp).astype('float32')
split_top = np.split(top, self.num_groups, axis=1) split_kerns = np.split(kern, groups, axis=0)
split_top = np.split(top, groups, axis=1)
kern_var = theano.tensor.tensor4('kern') kern_sym = theano.tensor.tensor4('kern')
top_var = theano.tensor.tensor4('top') top_sym = theano.tensor.tensor4('top')
grouped_abstractconvgrad_func = theano.tensor.nnet.abstract_conv.AbstractConv2d_gradInputs(imshp=None, grouped_abstractconvgrad_func = self.conv2d_gradi(border_mode=self.border_mode,
kshp=None,
border_mode=self.border_mode,
subsample=self.subsample, subsample=self.subsample,
filter_dilation=self.filter_dilation, filter_dilation=self.filter_dilation,
num_groups=self.num_groups) num_groups=groups)
grouped_conv_output = grouped_abstractconvgrad_func(kern_var, top_var, self.img_shape[-2:]) if self.flip_filter:
grouped_func = theano.function([kern_var, top_var], grouped_conv_output, mode=self.mode) grouped_conv_output = grouped_abstractconvgrad_func(kern_sym[:, :, ::-1, ::-1], top_sym, imshp[-2:])
else:
grouped_conv_output = grouped_abstractconvgrad_func(kern_sym, top_sym, imshp[-2:])
grouped_func = theano.function([kern_sym, top_sym], grouped_conv_output, mode=self.mode)
grouped_output = grouped_func(kern, top) grouped_output = grouped_func(kern, top)
normal_conv_output = conv2d_corr_gi(kern_var, normal_conv_output = conv2d_corr_gi(kern_sym,
top_var, top_sym,
self.img_shape, imshp,
border_mode=self.border_mode, border_mode=self.border_mode,
subsample=self.subsample, subsample=self.subsample,
filter_dilation=self.filter_dilation) filter_dilation=self.filter_dilation)
normal_func = theano.function([kern_var, top_var], normal_conv_output, normal_func = theano.function([kern_sym, top_sym], normal_conv_output,
mode='FAST_RUN') mode=self.ref_mode)
normal_concat_output = [normal_func(kern_arr, top_arr) normal_concat_output = [normal_func(kern_arr, top_arr)
for kern_arr, top_arr in zip(split_kerns, split_top)] for kern_arr, top_arr in zip(split_kerns, split_top)]
normal_concat_output = np.concatenate(normal_concat_output, axis=1) normal_concat_output = np.concatenate(normal_concat_output, axis=1)
...@@ -1819,7 +1831,7 @@ class Grouped_conv_noOptim(unittest.TestCase): ...@@ -1819,7 +1831,7 @@ class Grouped_conv_noOptim(unittest.TestCase):
utt.assert_allclose(grouped_output, normal_concat_output) utt.assert_allclose(grouped_output, normal_concat_output)
def abstract_conv_gradinputs(filters_val, output_val): def abstract_conv_gradinputs(filters_val, output_val):
return grouped_abstractconvgrad_func(filters_val, output_val, self.img_shape[2:]) return grouped_abstractconvgrad_func(filters_val, output_val, imshp[2:])
utt.verify_grad(abstract_conv_gradinputs, utt.verify_grad(abstract_conv_gradinputs,
[kern, top], [kern, top],
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论