提交 3e2ff0ed authored 作者: Pascal Lamblin's avatar Pascal Lamblin

Automatic whitespace.

上级 d675a73c
...@@ -93,41 +93,41 @@ class ConvTransp3D(theano.Op): ...@@ -93,41 +93,41 @@ class ConvTransp3D(theano.Op):
R = outputs[0] R = outputs[0]
codeSource = """ codeSource = """
///////////// < code generated by ConvTransp3D > ///////////// < code generated by ConvTransp3D >
//printf("\t\t\t\tConvTransp3D c code\\n"); //printf("\t\t\t\tConvTransp3D c code\\n");
//Check dimensionality of inputs //Check dimensionality of inputs
if (%(H)s->nd != 5) if (%(H)s->nd != 5)
{ {
PyErr_Format(PyExc_ValueError, "H must be a 5-D tensor but it is %%i-D",%(H)s->nd); PyErr_Format(PyExc_ValueError, "H must be a 5-D tensor but it is %%i-D",%(H)s->nd);
%(fail)s %(fail)s
} }
if (%(W)s->nd != 5) if (%(W)s->nd != 5)
{ {
PyErr_Format(PyExc_ValueError, "ConvTransp3D: W must be a 5-D tensor"); PyErr_Format(PyExc_ValueError, "ConvTransp3D: W must be a 5-D tensor");
%(fail)s %(fail)s
} }
if (%(b)s->nd != 1) if (%(b)s->nd != 1)
{ {
PyErr_Format(PyExc_ValueError, "ConvTransp3D: b must be a vector"); PyErr_Format(PyExc_ValueError, "ConvTransp3D: b must be a vector");
%(fail)s %(fail)s
} }
if (%(d)s->nd != 1) if (%(d)s->nd != 1)
{ {
PyErr_Format(PyExc_ValueError, "ConvTransp3D: d must be a vector"); PyErr_Format(PyExc_ValueError, "ConvTransp3D: d must be a vector");
%(fail)s %(fail)s
} }
//Read and check stride arguments //Read and check stride arguments
if (%(d)s->dimensions[0] != 3) if (%(d)s->dimensions[0] != 3)
{ {
PyErr_Format(PyExc_ValueError, "ConvTransp3D: 3 stride length arguments expected (for row, col, and time) but %%li were given", (long)%(d)s->dimensions[0] ); PyErr_Format(PyExc_ValueError, "ConvTransp3D: 3 stride length arguments expected (for row, col, and time) but %%li were given", (long)%(d)s->dimensions[0] );
%(fail)s %(fail)s
} }
{ // for fail 1 { // for fail 1
int dr = *(dtype_%(d)s*)PyArray_GETPTR1(%(d)s,0); int dr = *(dtype_%(d)s*)PyArray_GETPTR1(%(d)s,0);
...@@ -138,85 +138,85 @@ class ConvTransp3D(theano.Op): ...@@ -138,85 +138,85 @@ class ConvTransp3D(theano.Op):
{ {
PyErr_Format(PyExc_ValueError, "ConvTransp3D: Strides must all be positive but are %%i, %%i, %%i",dr,dc,dt); PyErr_Format(PyExc_ValueError, "ConvTransp3D: Strides must all be positive but are %%i, %%i, %%i",dr,dc,dt);
%(fail)s %(fail)s
} }
//Read and check sizes of inputs //Read and check sizes of inputs
{ // for fail 2 { // for fail 2
const int batchSize = %(H)s->dimensions[0]; const int batchSize = %(H)s->dimensions[0];
const int outputChannels = %(W)s->dimensions[0]; const int outputChannels = %(W)s->dimensions[0];
if (%(H)s->dimensions[4] != outputChannels) if (%(H)s->dimensions[4] != outputChannels)
{ {
PyErr_Format(PyExc_ValueError, "W produces a %%i channel image but the image has %%li channels. W.shape: (%%li, %%li, %%li, %%li, %%li) H.shape: (%%li, %%li, %%li, %%li, %%li)", outputChannels, (long)%(H)s->dimensions[4], (long)%(W)s->dimensions[0], (long)%(W)s->dimensions[1], (long)%(W)s->dimensions[2], (long)%(W)s->dimensions[3], (long)%(W)s->dimensions[4], (long)%(H)s->dimensions[0], (long)%(H)s->dimensions[1], (long)%(H)s->dimensions[2], (long)%(H)s->dimensions[3], (long)%(H)s->dimensions[4]); PyErr_Format(PyExc_ValueError, "W produces a %%i channel image but the image has %%li channels. W.shape: (%%li, %%li, %%li, %%li, %%li) H.shape: (%%li, %%li, %%li, %%li, %%li)", outputChannels, (long)%(H)s->dimensions[4], (long)%(W)s->dimensions[0], (long)%(W)s->dimensions[1], (long)%(W)s->dimensions[2], (long)%(W)s->dimensions[3], (long)%(W)s->dimensions[4], (long)%(H)s->dimensions[0], (long)%(H)s->dimensions[1], (long)%(H)s->dimensions[2], (long)%(H)s->dimensions[3], (long)%(H)s->dimensions[4]);
%(fail)s %(fail)s
} }
{ // for fail 3 { // for fail 3
const int inputChannels = %(W)s->dimensions[4]; const int inputChannels = %(W)s->dimensions[4];
if (%(b)s->dimensions[0] != inputChannels) if (%(b)s->dimensions[0] != inputChannels)
{ {
PyErr_Format(PyExc_ValueError, "ConvTransp3D: b operates on a %%li channel image but the image has %%i channels", (long)%(b)s->dimensions[0], inputChannels ); PyErr_Format(PyExc_ValueError, "ConvTransp3D: b operates on a %%li channel image but the image has %%i channels", (long)%(b)s->dimensions[0], inputChannels );
%(fail)s %(fail)s
} }
{ // for fail 4 { // for fail 4
const int filterHeight = %(W)s->dimensions[1]; const int filterHeight = %(W)s->dimensions[1];
const int filterWidth = %(W)s->dimensions[2]; const int filterWidth = %(W)s->dimensions[2];
const int filterDur = %(W)s->dimensions[3]; const int filterDur = %(W)s->dimensions[3];
const int outputHeight = %(H)s->dimensions[1]; const int outputHeight = %(H)s->dimensions[1];
const int outputWidth = %(H)s->dimensions[2]; const int outputWidth = %(H)s->dimensions[2];
const int outputDur = %(H)s->dimensions[3]; const int outputDur = %(H)s->dimensions[3];
int videoHeight = (outputHeight-1) * dr + filterHeight; int videoHeight = (outputHeight-1) * dr + filterHeight;
int videoWidth = (outputWidth-1) * dc + filterWidth; int videoWidth = (outputWidth-1) * dc + filterWidth;
int videoDur = (outputDur-1) * dt + filterDur; int videoDur = (outputDur-1) * dt + filterDur;
if (%(RShape)s) if (%(RShape)s)
{ {
if (%(RShape)s->nd != 1) if (%(RShape)s->nd != 1)
{ {
PyErr_Format(PyExc_ValueError, "ConvTransp3D: RShape must be a vector"); PyErr_Format(PyExc_ValueError, "ConvTransp3D: RShape must be a vector");
%(fail)s %(fail)s
} }
if (%(RShape)s->dimensions[0] != 3) if (%(RShape)s->dimensions[0] != 3)
{ {
PyErr_Format(PyExc_ValueError, "RShape must specify a 3D shape ( [height,width,duration] )"); PyErr_Format(PyExc_ValueError, "RShape must specify a 3D shape ( [height,width,duration] )");
%(fail)s %(fail)s
} }
dtype_%(RShape)s RShape0 = *(dtype_%(RShape)s*)PyArray_GETPTR1(%(RShape)s,0); dtype_%(RShape)s RShape0 = *(dtype_%(RShape)s*)PyArray_GETPTR1(%(RShape)s,0);
dtype_%(RShape)s RShape1 = *(dtype_%(RShape)s*)PyArray_GETPTR1(%(RShape)s,1); dtype_%(RShape)s RShape1 = *(dtype_%(RShape)s*)PyArray_GETPTR1(%(RShape)s,1);
dtype_%(RShape)s RShape2 = *(dtype_%(RShape)s*)PyArray_GETPTR1(%(RShape)s,2); dtype_%(RShape)s RShape2 = *(dtype_%(RShape)s*)PyArray_GETPTR1(%(RShape)s,2);
if (RShape0 != -1) if (RShape0 != -1)
{ {
if (RShape0 < videoHeight || RShape1 < videoWidth || RShape2 < videoDur) if (RShape0 < videoHeight || RShape1 < videoWidth || RShape2 < videoDur)
{ {
PyErr_Format(PyExc_ValueError, "Reconstruction must have physical shape of at least [%%i,%%i,%%i] but RShape argument requests that it be [%%i,%%i,%%i]\\n",videoHeight,videoWidth,videoDur,(int) RShape0,(int) RShape1,(int) RShape2); PyErr_Format(PyExc_ValueError, "Reconstruction must have physical shape of at least [%%i,%%i,%%i] but RShape argument requests that it be [%%i,%%i,%%i]\\n",videoHeight,videoWidth,videoDur,(int) RShape0,(int) RShape1,(int) RShape2);
%(fail)s %(fail)s
} }
videoHeight = RShape0; videoHeight = RShape0;
videoWidth = RShape1; videoWidth = RShape1;
videoDur = RShape2; videoDur = RShape2;
} }
} //closes if RShape } //closes if RShape
{ // for fail 5 { // for fail 5
//Allocate the reconstruction //Allocate the reconstruction
npy_intp dims[5]; npy_intp dims[5];
dims[0] = batchSize; dims[0] = batchSize;
dims[4] = inputChannels; dims[4] = inputChannels;
dims[1] = videoHeight; dims[1] = videoHeight;
dims[2] = videoWidth; dims[2] = videoWidth;
dims[3] = videoDur; dims[3] = videoDur;
if(!(%(R)s) || %(R)s->dimensions[0]!=dims[0] || if(!(%(R)s) || %(R)s->dimensions[0]!=dims[0] ||
%(R)s->dimensions[1]!=dims[1] || %(R)s->dimensions[1]!=dims[1] ||
...@@ -224,12 +224,12 @@ class ConvTransp3D(theano.Op): ...@@ -224,12 +224,12 @@ class ConvTransp3D(theano.Op):
%(R)s->dimensions[3]!=dims[3] || %(R)s->dimensions[3]!=dims[3] ||
%(R)s->dimensions[4]!=dims[4]) %(R)s->dimensions[4]!=dims[4])
{ {
Py_XDECREF(%(R)s); Py_XDECREF(%(R)s);
%(R)s = (PyArrayObject *) PyArray_SimpleNew(5, dims, %(H)s->descr->type_num); %(R)s = (PyArrayObject *) PyArray_SimpleNew(5, dims, %(H)s->descr->type_num);
if (!(%(R)s)) { if (!(%(R)s)) {
PyErr_Format(PyExc_MemoryError, "ConvTransp3D: could not allocate R"); PyErr_Format(PyExc_MemoryError, "ConvTransp3D: could not allocate R");
%(fail)s %(fail)s
} }
} }
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
...@@ -242,35 +242,35 @@ class ConvTransp3D(theano.Op): ...@@ -242,35 +242,35 @@ class ConvTransp3D(theano.Op):
{ // for fail 6 { // for fail 6
memset(%(R)s->data, 0, (batchSize-1) * %(R)s->strides[0]+ inputChannels * %(R)s->strides[4] + memset(%(R)s->data, 0, (batchSize-1) * %(R)s->strides[0]+ inputChannels * %(R)s->strides[4] +
(videoHeight-1) * %(R)s->strides[1] + (videoHeight-1) * %(R)s->strides[1] +
(videoWidth-1) * %(R)s->strides[2] + (videoWidth-1) * %(R)s->strides[2] +
(videoDur-1) * %(R)s->strides[3]); (videoDur-1) * %(R)s->strides[3]);
#define ELEM5(x, i,j,k,l,m) * ( dtype_ ## x *) ( x->data + (i)*x->strides[0]+(j)*x->strides[1]+(k)*x->strides[2]+(l)*x->strides[3]+(m)*x->strides[4] ) #define ELEM5(x, i,j,k,l,m) * ( dtype_ ## x *) ( x->data + (i)*x->strides[0]+(j)*x->strides[1]+(k)*x->strides[2]+(l)*x->strides[3]+(m)*x->strides[4] )
#define ELEM_AT(x, i) * ( dtype_ ## x *) ( x->data + (i) ) #define ELEM_AT(x, i) * ( dtype_ ## x *) ( x->data + (i) )
dtype_%(b)s * b = (dtype_%(b)s *) %(b)s->data; dtype_%(b)s * b = (dtype_%(b)s *) %(b)s->data;
int rs4 = %(R)s->strides[4]; int rs4 = %(R)s->strides[4];
int ws0 = %(W)s->strides[0]; int ws0 = %(W)s->strides[0];
int ws4 = %(W)s->strides[4]; int ws4 = %(W)s->strides[4];
int hs4 = %(H)s->strides[4]; int hs4 = %(H)s->strides[4];
// Compute R // Compute R
// R[i,r,c,t,j] = b_j + sum_{rc,rk | d \circ rc + rk = r} sum_{cc,ck | ...} sum_{tc,tk | ...} sum_k W[k, rk, ck, tk,j] * H[i,rc,cc,tc,k] // R[i,r,c,t,j] = b_j + sum_{rc,rk | d \circ rc + rk = r} sum_{cc,ck | ...} sum_{tc,tk | ...} sum_k W[k, rk, ck, tk,j] * H[i,rc,cc,tc,k]
for (int i = 0; i < batchSize; i++) { for (int i = 0; i < batchSize; i++) {
for (int r = 0; r < videoHeight; r++) { for (int r = 0; r < videoHeight; r++) {
const int frc = std::max(0.0, ceil(float(r-filterHeight+1)/float(dr))); const int frc = std::max(0.0, ceil(float(r-filterHeight+1)/float(dr)));
for (int c = 0; c < videoWidth; c++) { for (int c = 0; c < videoWidth; c++) {
const int fcc = std::max(0.0, ceil(float(c-filterWidth +1)/float(dc))); const int fcc = std::max(0.0, ceil(float(c-filterWidth +1)/float(dc)));
for (int t = 0; t < videoDur; t++) { for (int t = 0; t < videoDur; t++) {
const int ftc = std::max(0.0, ceil(float(t-filterDur +1) /float(dt))); const int ftc = std::max(0.0, ceil(float(t-filterDur +1) /float(dt)));
long long Rpost = i * %(R)s->strides[0] + r * %(R)s->strides[1] + c * %(R)s->strides[2] + t * %(R)s->strides[3]; long long Rpost = i * %(R)s->strides[0] + r * %(R)s->strides[1] + c * %(R)s->strides[2] + t * %(R)s->strides[3];
...@@ -283,21 +283,21 @@ class ConvTransp3D(theano.Op): ...@@ -283,21 +283,21 @@ class ConvTransp3D(theano.Op):
} }
for (int rc = frc; rc < outputHeight; rc++) { for (int rc = frc; rc < outputHeight; rc++) {
const int rk = r - rc * dr; const int rk = r - rc * dr;
if (rk < 0) break; if (rk < 0) break;
for (int cc = fcc; cc < outputWidth; cc++) { for (int cc = fcc; cc < outputWidth; cc++) {
const int ck = c - cc * dc; const int ck = c - cc * dc;
if (ck < 0) break; if (ck < 0) break;
for (int tc = ftc; tc < outputDur; tc++) for (int tc = ftc; tc < outputDur; tc++)
{ {
const int tk = t - tc * dt; const int tk = t - tc * dt;
if (tk < 0) break; if (tk < 0) break;
int Wpos = rk * %(W)s->strides[1] + ck * %(W)s->strides[2] + tk * %(W)s->strides[3]; int Wpos = rk * %(W)s->strides[1] + ck * %(W)s->strides[2] + tk * %(W)s->strides[3];
int Hpostc = i * %(H)s->strides[0] + rc * %(H)s->strides[1] + cc * %(H)s->strides[2] + tc * %(H)s->strides[3]; int Hpostc = i * %(H)s->strides[0] + rc * %(H)s->strides[1] + cc * %(H)s->strides[2] + tc * %(H)s->strides[3];
Rpos = Rpost; Rpos = Rpost;
for (int j = 0; j < inputChannels; j++) for (int j = 0; j < inputChannels; j++)
{ {
...@@ -307,33 +307,33 @@ class ConvTransp3D(theano.Op): ...@@ -307,33 +307,33 @@ class ConvTransp3D(theano.Op):
int Hpos = Hpostc; int Hpos = Hpostc;
for (int k = 0; k < outputChannels; k++) { for (int k = 0; k < outputChannels; k++) {
//TODO-- it's probably bad in terms of cache that our inner loop is over the largest stride of W.... maybe OK since it's the smallest stride of H //TODO-- it's probably bad in terms of cache that our inner loop is over the largest stride of W.... maybe OK since it's the smallest stride of H
//writePos += ELEM5(%(W)s,k,rk,ck,tk,j) * ELEM5(%(H)s,i,rc,cc,tc,k); //writePos += ELEM5(%(W)s,k,rk,ck,tk,j) * ELEM5(%(H)s,i,rc,cc,tc,k);
//writePos += ELEM_AT(%(W)s,Wpos) * ELEM_AT(%(H)s,Hpos); //writePos += ELEM_AT(%(W)s,Wpos) * ELEM_AT(%(H)s,Hpos);
writePos += ELEM_AT(%(W)s,Wpos) * ELEM_AT(%(H)s,Hpos); writePos += ELEM_AT(%(W)s,Wpos) * ELEM_AT(%(H)s,Hpos);
Wpos += ws0; Wpos += ws0;
Hpos += hs4; Hpos += hs4;
} //close the k loop } //close the k loop
Rpos += rs4; Rpos += rs4;
Wpos = Wposj + ws4; Wpos = Wposj + ws4;
} //close the j loop } //close the j loop
} // close the tc loop } // close the tc loop
} //cc } //cc
} //rc } //rc
} //t } //t
} //c } //c
} //r } //r
} //i } //i
} //for fail 6 } //for fail 6
} //for fail 5 } //for fail 5
} //for fail 4 } //for fail 4
} //for fail 3 } //for fail 3
} //for fail 2 } //for fail 2
} // for fail 1 } // for fail 1
///////////// < /code generated by ConvTransp3D > ///////////// < /code generated by ConvTransp3D >
""" """
return strutil.renderString(codeSource,locals()) return strutil.renderString(codeSource,locals())
...@@ -343,95 +343,94 @@ convTransp3D = ConvTransp3D() ...@@ -343,95 +343,94 @@ convTransp3D = ConvTransp3D()
#If the input size wasn't a multiple of D we may need to cause some automatic padding to get the right size of reconstruction #If the input size wasn't a multiple of D we may need to cause some automatic padding to get the right size of reconstruction
def computeR(W,b,d,H,Rshape = None): def computeR(W,b,d,H,Rshape = None):
assert len(W.shape) == 5 assert len(W.shape) == 5
assert len(H.shape) == 5 assert len(H.shape) == 5
assert len(b.shape) == 1 assert len(b.shape) == 1
assert len(d) == 3 assert len(d) == 3
outputChannels, filterHeight, filterWidth, filterDur, inputChannels = W.shape outputChannels, filterHeight, filterWidth, filterDur, inputChannels = W.shape
batchSize, outputHeight, outputWidth, outputDur, outputChannelsAgain = H.shape batchSize, outputHeight, outputWidth, outputDur, outputChannelsAgain = H.shape
assert outputChannelsAgain == outputChannels assert outputChannelsAgain == outputChannels
assert b.shape[0] == inputChannels assert b.shape[0] == inputChannels
dr,dc,dt = d dr,dc,dt = d
assert dr > 0 assert dr > 0
assert dc > 0 assert dc > 0
assert dt > 0 assert dt > 0
videoHeight = (outputHeight-1) * dr + filterHeight videoHeight = (outputHeight-1) * dr + filterHeight
videoWidth = (outputWidth-1) * dc + filterWidth videoWidth = (outputWidth-1) * dc + filterWidth
videoDur = (outputDur-1) * dt + filterDur videoDur = (outputDur-1) * dt + filterDur
if Rshape is not None and Rshape[0] != -1: if Rshape is not None and Rshape[0] != -1:
if Rshape[0] < videoHeight: if Rshape[0] < videoHeight:
print (Rshape[0], videoHeight) print (Rshape[0], videoHeight)
assert False assert False
assert Rshape[1] >= videoWidth assert Rshape[1] >= videoWidth
assert Rshape[2] >= videoDur assert Rshape[2] >= videoDur
#print "setting video size to Rshape = "+str(Rshape) #print "setting video size to Rshape = "+str(Rshape)
videoHeight, videoWidth, videoDur = Rshape videoHeight, videoWidth, videoDur = Rshape
#else: #else:
# print "No Rshape passed in" # print "No Rshape passed in"
#print "video size: "+str((videoHeight, videoWidth, videoDur)) #print "video size: "+str((videoHeight, videoWidth, videoDur))
R = N.zeros( (batchSize, videoHeight, R = N.zeros( (batchSize, videoHeight,
videoWidth, videoDur, inputChannels ) , dtype=H.dtype) videoWidth, videoDur, inputChannels ) , dtype=H.dtype)
#R[i,j,r,c,t] = b_j + sum_{rc,rk | d \circ rc + rk = r} sum_{cc,ck | ...} sum_{tc,tk | ...} sum_k W[k, j, rk, ck, tk] * H[i,k,rc,cc,tc] #R[i,j,r,c,t] = b_j + sum_{rc,rk | d \circ rc + rk = r} sum_{cc,ck | ...} sum_{tc,tk | ...} sum_k W[k, j, rk, ck, tk] * H[i,k,rc,cc,tc]
for i in xrange(0,batchSize): for i in xrange(0,batchSize):
#print '\texample '+str(i+1)+'/'+str(batchSize) #print '\texample '+str(i+1)+'/'+str(batchSize)
for j in xrange(0,inputChannels): for j in xrange(0,inputChannels):
#print '\t\tfeature map '+str(j+1)+'/'+str(inputChannels) #print '\t\tfeature map '+str(j+1)+'/'+str(inputChannels)
for r in xrange(0,videoHeight): for r in xrange(0,videoHeight):
#print '\t\t\trow '+str(r+1)+'/'+str(videoHeight) #print '\t\t\trow '+str(r+1)+'/'+str(videoHeight)
for c in xrange(0,videoWidth): for c in xrange(0,videoWidth):
for t in xrange(0,videoDur): for t in xrange(0,videoDur):
R[i,r,c,t,j] = b[j] R[i,r,c,t,j] = b[j]
ftc = max([0, int(N.ceil(float(t-filterDur +1 )/float(dt))) ]) ftc = max([0, int(N.ceil(float(t-filterDur +1 )/float(dt))) ])
fcc = max([0, int(N.ceil(float(c-filterWidth +1)/float(dc))) ]) fcc = max([0, int(N.ceil(float(c-filterWidth +1)/float(dc))) ])
rc = max([0, int(N.ceil(float(r-filterHeight+1)/float(dr))) ]) rc = max([0, int(N.ceil(float(r-filterHeight+1)/float(dr))) ])
while rc < outputHeight: while rc < outputHeight:
rk = r - rc * dr rk = r - rc * dr
if rk < 0: if rk < 0:
break break
cc = fcc cc = fcc
while cc < outputWidth: while cc < outputWidth:
ck = c - cc * dc ck = c - cc * dc
if ck < 0: if ck < 0:
break break
tc = ftc tc = ftc
while tc < outputDur: while tc < outputDur:
tk = t - tc * dt tk = t - tc * dt
if tk < 0: if tk < 0:
break break
R[i,r,c,t,j] += N.dot(W[:,rk,ck,tk,j], H[i,rc,cc,tc,:] ) R[i,r,c,t,j] += N.dot(W[:,rk,ck,tk,j], H[i,rc,cc,tc,:] )
tc += 1 tc += 1
"" #close loop over tc "" #close loop over tc
cc += 1 cc += 1
"" #close loop over cc "" #close loop over cc
rc += 1 rc += 1
"" #close loop over rc "" #close loop over rc
"" #close loop over t "" #close loop over t
"" #close loop over c "" #close loop over c
"" #close loop over r "" #close loop over r
"" #close loop over j "" #close loop over j
"" #close loop over i "" #close loop over i
return R return R
from Conv3D import conv3D from Conv3D import conv3D
from ConvGrad3D import convGrad3D from ConvGrad3D import convGrad3D
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论