Python theano.tensor.concatenate() Examples
The following are 30
code examples of theano.tensor.concatenate().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
theano.tensor
, or try the search function
.
Example #1
Source File: nn.py From opt-mmd with BSD 3-Clause "New" or "Revised" License | 6 votes |
def get_output_for(self, input, init=False, **kwargs): if input.ndim > 2: # if the input has more than two dimensions, flatten it into a # batch of feature vectors. input = input.flatten(2) activation = T.tensordot(input, self.W, [[1], [0]]) abs_dif = (T.sum(abs(activation.dimshuffle(0,1,2,'x') - activation.dimshuffle('x',1,2,0)),axis=2) + 1e6 * T.eye(input.shape[0]).dimshuffle(0,'x',1)) if init: mean_min_abs_dif = 0.5 * T.mean(T.min(abs_dif, axis=2),axis=0) abs_dif /= mean_min_abs_dif.dimshuffle('x',0,'x') self.init_updates = [(self.log_weight_scale, self.log_weight_scale-T.log(mean_min_abs_dif).dimshuffle(0,'x'))] f = T.sum(T.exp(-abs_dif),axis=2) if init: mf = T.mean(f,axis=0) f -= mf.dimshuffle('x',0) self.init_updates.append((self.b, -mf)) else: f += self.b.dimshuffle('x',0) return T.concatenate([input, f], axis=1)
Example #2
Source File: model.py From text_convnet with MIT License | 6 votes |
def load_embeddings(args): lst = [ ] vas = [ ] with gzip.open(args.embedding) as fin: for line in fin: parts = line.strip().split() w = parts[0] e = numpy.array( [[ float(x) for x in parts[1:] ]], dtype = theano.config.floatX ) lst.append(w) vas.append(e) lst.append("## UNK ##") vas.append( numpy.zeros(vas[0].shape, dtype = theano.config.floatX) ) vocabx = dict([ (y,x) for x,y in enumerate(lst) ]) embeddings = numpy.concatenate(vas) assert len(vocabx) == len(embeddings) print "{} embedding loaded, size {}".format(embeddings.shape[0], embeddings.shape[1]) return vocabx, embeddings
Example #3
Source File: utils.py From RaptorX-Contact with GNU General Public License v3.0 | 6 votes |
def MidpointFeature(input, n_in): seqLen = input.shape[1] x = T.mgrid[0:seqLen, 0:seqLen] y1 = x[0] y2 = (x[0] + x[1])/2 y3 = x[1] input2 = input.dimshuffle(1, 0, 2) out1 = input2[y1] out2 = input2[y2] out3 = input2[y3] out = T.concatenate([out1, out2, out3], axis=3) final_out = out.dimshuffle(2, 0, 1, 3) n_out = 3 * n_in return final_out, n_out
Example #4
Source File: graph_state.py From gated-graph-transformer-network with MIT License | 6 votes |
def with_additional_nodes(self, new_node_strengths, new_node_ids, new_node_states=None): """ Helper function to generate a new state with new nodes added. Params: new_node_strengths: Tensor of shape (n_batch, n_new_nodes) new_node_ids: Tensor of shape (n_batch, n_new_nodes, num_node_ids) new_node_states: (Optional) Tensor of shape (n_batch, n_new_nodes, node_state_size) If not provided, will be zero Returns: A new graph state with the changes """ if new_node_states is None: new_node_states = T.zeros([self.n_batch, new_node_strengths.shape[1], self.node_state_size]) next_node_strengths = T.concatenate([self.node_strengths, new_node_strengths], 1) next_node_ids = T.concatenate([self.node_ids, new_node_ids], 1) next_node_states = T.concatenate([self.node_states, new_node_states], 1) next_n_nodes = next_node_strengths.shape[1] next_edge_strengths = pad_to(self.edge_strengths, [self.n_batch, next_n_nodes, next_n_nodes, self.num_edge_types]) cls = type(self) return cls(next_node_strengths, next_node_ids, next_node_states, next_edge_strengths)
Example #5
Source File: theano_backend.py From Att-ChemdNER with Apache License 2.0 | 6 votes |
def ctc_update_log_p(skip_idxs, zeros, active, log_p_curr, log_p_prev): active_skip_idxs = skip_idxs[(skip_idxs < active).nonzero()] active_next = T.cast(T.minimum( T.maximum( active + 1, T.max(T.concatenate([active_skip_idxs, [-1]])) + 2 + 1 ), log_p_curr.shape[0]), 'int32') common_factor = T.max(log_p_prev[:active]) p_prev = T.exp(log_p_prev[:active] - common_factor) _p_prev = zeros[:active_next] # copy over _p_prev = T.set_subtensor(_p_prev[:active], p_prev) # previous transitions _p_prev = T.inc_subtensor(_p_prev[1:], _p_prev[:-1]) # skip transitions _p_prev = T.inc_subtensor(_p_prev[active_skip_idxs + 2], p_prev[active_skip_idxs]) updated_log_p_prev = T.log(_p_prev) + common_factor log_p_next = T.set_subtensor( zeros[:active_next], log_p_curr[:active_next] + updated_log_p_prev ) return active_next, log_p_next
Example #6
Source File: util.py From gated-graph-transformer-network with MIT License | 6 votes |
def broadcast_concat(tensors, axis): """ Broadcast tensors together, then concatenate along axis """ ndim = tensors[0].ndim assert all(t.ndim == ndim for t in tensors), "ndims don't match for broadcast_concat: {}".format(tensors) broadcast_shapes = [] for i in range(ndim): if i == axis: broadcast_shapes.append(1) else: dim_size = next((t.shape[i] for t in tensors if not t.broadcastable[i]), 1) broadcast_shapes.append(dim_size) broadcasted_tensors = [] for t in tensors: tile_reps = [bshape if t.broadcastable[i] else 1 for i,bshape in enumerate(broadcast_shapes)] if all(rep is 1 for rep in tile_reps): # Don't need to broadcast this tensor broadcasted_tensors.append(t) else: broadcasted_tensors.append(T.tile(t, tile_reps)) return T.concatenate(broadcasted_tensors, axis)
Example #7
Source File: pixel_rnn.py From pixel_rnn with MIT License | 6 votes |
def DiagonalBiLSTM(name, input_dim, inputs): """ inputs.shape: (batch size, height, width, input_dim) inputs.shape: (batch size, height, width, DIM) """ forward = DiagonalLSTM(name+'.Forward', input_dim, inputs) backward = DiagonalLSTM(name+'.Backward', input_dim, inputs[:,:,::-1,:])[:,:,::-1,:] batch_size = inputs.shape[0] backward = T.concatenate([ T.zeros([batch_size, 1, WIDTH, DIM], dtype=theano.config.floatX), backward[:, :-1, :, :] ], axis=1) return forward + backward # inputs.shape: (batch size, height, width, channels)
Example #8
Source File: thutil.py From Depth-Map-Prediction with GNU General Public License v3.0 | 6 votes |
def cross(x, y, axis=None): ndim = x.ndim assert x.ndim == y.ndim if axis is None: axis = ndim - 1 def _getindexslice(a, i): return a[tuple([slice(i,i+1) if d == axis else slice(None) for d in xrange(ndim)])] x0 = _getindexslice(x, 0) x1 = _getindexslice(x, 1) x2 = _getindexslice(x, 2) y0 = _getindexslice(y, 0) y1 = _getindexslice(y, 1) y2 = _getindexslice(y, 2) res = T.concatenate((x1*y2 - x2*y1, x2*y0 - x0*y2, x0*y1 - x1*y0), axis=axis) return res
Example #9
Source File: recurrences.py From spinn with MIT License | 6 votes |
def _context_sensitive_shift(self, inputs): """ Compute a buffer top representation by mixing buffer top and hidden state. NB: This hasn't been an especially effective tool so far. """ assert self.use_tracking_lstm buffer_top, tracking_hidden = inputs[2:4] # Exclude the cell value from the computation. tracking_hidden = tracking_hidden[:, :hidden_dim] inp = T.concatenate([tracking_hidden, buffer_top], axis=1) inp_dim = self._spec.word_embedding_dim + self.tracking_lstm_hidden_dim layer = util.ReLULayer if self.context_sensitive_use_relu else util.Linear return layer(inp, inp_dim, self._spec.model_dim, self._vs, name="context_comb_unit", use_bias=True, initializer=util.HeKaimingInitializer())
Example #10
Source File: test_plain_rnn.py From spinn with MIT License | 6 votes |
def _make_rnn(self, seq_length=4): self.embedding_dim = embedding_dim = 3 self.vocab_size = vocab_size = 10 self.seq_length = seq_length def compose_network(h_prev, inp, embedding_dim, model_dim, vs, name="compose"): # Just add the two embeddings! W = T.concatenate([T.eye(model_dim), T.eye(model_dim)], axis=0) i = T.concatenate([h_prev, inp], axis=1) return i.dot(W) X = T.imatrix("X") training_mode = T.scalar("training_mode") vs = VariableStore() embeddings = np.arange(vocab_size).reshape( (vocab_size, 1)).repeat(embedding_dim, axis=1) self.model = RNN( embedding_dim, embedding_dim, vocab_size, seq_length, compose_network, IdentityLayer, training_mode, None, vs, X=X, make_test_fn=True, initial_embeddings=embeddings)
Example #11
Source File: test_stack.py From spinn with MIT License | 6 votes |
def setUp(self): if 'gpu' not in theano.config.device: raise RuntimeError("Thin stack only defined for GPU usage") self.embedding_dim = self.model_dim = 2 self.vocab_size = 5 self.seq_length = 5 self.batch_size = 2 self.num_classes = 2 spec = util.ModelSpec(self.model_dim, self.embedding_dim, self.batch_size, self.vocab_size, self.seq_length) self.vs = vs = VariableStore() def compose_network((c1, c2), *args, **kwargs): W = vs.add_param("W", (self.model_dim * 2, self.model_dim)) b = vs.add_param("b", (self.model_dim,), initializer=util.ZeroInitializer()) return T.dot(T.concatenate([c1, c2], axis=1), W) + b
Example #12
Source File: test_stack.py From spinn with MIT License | 6 votes |
def setUp(self): if 'gpu' not in theano.config.device: raise RuntimeError("Thin stack only defined for GPU usage") self.embedding_dim = 10 self.model_dim = 20 self.vocab_size = 5 self.batch_size = 2 self.num_classes = 2 self.vs = VariableStore() def compose_network((c1, c2), hidden, *args, **kwargs): conc = T.concatenate([hidden, c1, c2], axis=1) W = self.vs.add_param("W", (self.model_dim / 2 + self.model_dim * 2, self.model_dim)) b = self.vs.add_param("b", (self.model_dim,), initializer=util.ZeroInitializer()) return T.dot(conc, W) + b
Example #13
Source File: nn.py From Att-ChemdNER with Apache License 2.0 | 6 votes |
def step(self, word,h_tm1,c_tm1,x): #{{{ H=x; input_length=x.shape[0]; C=T.repeat(c_tm1.reshape((1,-1)),input_length,axis=0); _HC=K.concatenate([H,C]); energy=T.dot(_HC,self.W_A.reshape((-1,1)))+self.b_A; energy=K.softmax(energy.reshape((1,-1))); x=(H*energy.reshape((-1,1))).sum(axis=0) #combine glimpsed with word; combine=K.concatenate([x,word]); combined=K.dot(combine,self.W_combine)+self.b_combine; #original LSTM step h_t,c_t=super(AttentionLSTM,self).step_noBatch(combined,h_tm1,c_tm1); return h_t,c_t #}}}
Example #14
Source File: skipthoughts.py From StackGAN with MIT License | 6 votes |
def build_encoder_bi(tparams, options): """ build bidirectional encoder, given pre-computed word embeddings """ # word embedding (source) embedding = tensor.tensor3('embedding', dtype='float32') embeddingr = embedding[::-1] x_mask = tensor.matrix('x_mask', dtype='float32') xr_mask = x_mask[::-1] # encoder proj = get_layer(options['encoder'])[1](tparams, embedding, options, prefix='encoder', mask=x_mask) projr = get_layer(options['encoder'])[1](tparams, embeddingr, options, prefix='encoder_r', mask=xr_mask) ctx = tensor.concatenate([proj[0][-1], projr[0][-1]], axis=1) return embedding, x_mask, ctx # some utilities
Example #15
Source File: skipthoughts.py From StackGAN with MIT License | 6 votes |
def param_init_gru(options, params, prefix='gru', nin=None, dim=None): """ parameter init for GRU """ if nin == None: nin = options['dim_proj'] if dim == None: dim = options['dim_proj'] W = numpy.concatenate([norm_weight(nin,dim), norm_weight(nin,dim)], axis=1) params[_p(prefix,'W')] = W params[_p(prefix,'b')] = numpy.zeros((2 * dim,)).astype('float32') U = numpy.concatenate([ortho_weight(dim), ortho_weight(dim)], axis=1) params[_p(prefix,'U')] = U Wx = norm_weight(nin, dim) params[_p(prefix,'Wx')] = Wx Ux = ortho_weight(dim) params[_p(prefix,'Ux')] = Ux params[_p(prefix,'bx')] = numpy.zeros((dim,)).astype('float32') return params
Example #16
Source File: layers.py From 3D-R2N2 with MIT License | 6 votes |
def __init__(self, prev_layers, axis=1): """ list of prev layers to concatenate axis to concatenate For tensor5, channel dimension is axis=2 (due to theano conv3d convention). For image, axis=1 """ assert (len(prev_layers) > 1) super().__init__(prev_layers[0]) self._axis = axis self._prev_layers = prev_layers self._output_shape = self._input_shape.copy() for prev_layer in prev_layers[1:]: self._output_shape[axis] += prev_layer._output_shape[axis] print('Concat the prev layer to [%s]' % ','.join(str(x) for x in self._output_shape))
Example #17
Source File: skipthoughts.py From text-to-image with MIT License | 6 votes |
def build_encoder_bi(tparams, options): """ build bidirectional encoder, given pre-computed word embeddings """ # word embedding (source) embedding = tensor.tensor3('embedding', dtype='float32') embeddingr = embedding[::-1] x_mask = tensor.matrix('x_mask', dtype='float32') xr_mask = x_mask[::-1] # encoder proj = get_layer(options['encoder'])[1](tparams, embedding, options, prefix='encoder', mask=x_mask) projr = get_layer(options['encoder'])[1](tparams, embeddingr, options, prefix='encoder_r', mask=xr_mask) ctx = tensor.concatenate([proj[0][-1], projr[0][-1]], axis=1) return embedding, x_mask, ctx # some utilities
Example #18
Source File: skipthoughts.py From text-to-image with MIT License | 6 votes |
def param_init_gru(options, params, prefix='gru', nin=None, dim=None): """ parameter init for GRU """ if nin == None: nin = options['dim_proj'] if dim == None: dim = options['dim_proj'] W = numpy.concatenate([norm_weight(nin,dim), norm_weight(nin,dim)], axis=1) params[_p(prefix,'W')] = W params[_p(prefix,'b')] = numpy.zeros((2 * dim,)).astype('float32') U = numpy.concatenate([ortho_weight(dim), ortho_weight(dim)], axis=1) params[_p(prefix,'U')] = U Wx = norm_weight(nin, dim) params[_p(prefix,'Wx')] = Wx Ux = ortho_weight(dim) params[_p(prefix,'Ux')] = Ux params[_p(prefix,'bx')] = numpy.zeros((dim,)).astype('float32') return params
Example #19
Source File: skipthoughts.py From text-to-image with MIT License | 6 votes |
def build_encoder_bi(tparams, options): """ build bidirectional encoder, given pre-computed word embeddings """ # word embedding (source) embedding = tensor.tensor3('embedding', dtype='float32') embeddingr = embedding[::-1] x_mask = tensor.matrix('x_mask', dtype='float32') xr_mask = x_mask[::-1] # encoder proj = get_layer(options['encoder'])[1](tparams, embedding, options, prefix='encoder', mask=x_mask) projr = get_layer(options['encoder'])[1](tparams, embeddingr, options, prefix='encoder_r', mask=xr_mask) ctx = tensor.concatenate([proj[0][-1], projr[0][-1]], axis=1) return embedding, x_mask, ctx # some utilities
Example #20
Source File: skipthoughts.py From text-to-image with MIT License | 6 votes |
def param_init_gru(options, params, prefix='gru', nin=None, dim=None): """ parameter init for GRU """ if nin == None: nin = options['dim_proj'] if dim == None: dim = options['dim_proj'] W = numpy.concatenate([norm_weight(nin,dim), norm_weight(nin,dim)], axis=1) params[_p(prefix,'W')] = W params[_p(prefix,'b')] = numpy.zeros((2 * dim,)).astype('float32') U = numpy.concatenate([ortho_weight(dim), ortho_weight(dim)], axis=1) params[_p(prefix,'U')] = U Wx = norm_weight(nin, dim) params[_p(prefix,'Wx')] = Wx Ux = ortho_weight(dim) params[_p(prefix,'Ux')] = Ux params[_p(prefix,'bx')] = numpy.zeros((dim,)).astype('float32') return params
Example #21
Source File: fourier.py From D-VAE with MIT License | 6 votes |
def infer_shape(self, node, in_shapes): shape_a = in_shapes[0] n = node.inputs[1] axis = node.inputs[2] if len(shape_a) == 1: return [(n,)] elif isinstance(axis, tensor.TensorConstant): out_shape = (list(shape_a[0: axis.data.item()]) + [n] + list(shape_a[axis.data + 1:])) else: l = len(shape_a) shape_a = tensor.stack(shape_a) out_shape = tensor.concatenate((shape_a[0: axis], [n], shape_a[axis + 1:])) n_splits = [1] * l out_shape = tensor.split(out_shape, n_splits, l) out_shape = [a[0] for a in out_shape] return [out_shape]
Example #22
Source File: test_stack.py From spinn with MIT License | 6 votes |
def setUp(self): if 'gpu' not in theano.config.device: raise RuntimeError("Thin stack only defined for GPU usage") self.embedding_dim = self.model_dim = 2 self.vocab_size = 5 self.batch_size = 2 self.num_classes = 2 self.vs = VariableStore() def compose_network((c1, c2), hidden, *args, **kwargs): conc = T.concatenate([hidden, c1, c2], axis=1) W = self.vs.add_param("W", (self.model_dim / 2 + self.model_dim * 2, self.model_dim)) b = self.vs.add_param("b", (self.model_dim,), initializer=util.ZeroInitializer()) return T.dot(conc, W) + b
Example #23
Source File: core.py From CAPTCHA-breaking with MIT License | 5 votes |
def get_output(self, train=False): if self.mode == 'sum': s = self.layers[0].get_output(train) for i in range(1, len(self.layers)): s += self.layers[i].get_output(train) return s elif self.mode == 'concat': inputs = [self.layers[i].get_output(train) for i in range(len(self.layers))] return T.concatenate(inputs, axis=-1) else: raise Exception('Unknown merge mode')
Example #24
Source File: nn.py From deligan with MIT License | 5 votes |
def get_output_for(self, input, init=False, **kwargs): if input.ndim > 2: # if the input has more than two dimensions, flatten it into a # batch of feature vectors. input = input.flatten(2) activation = T.tensordot(input, self.W, [[1], [0]]) abs_dif = (T.sum(abs(activation.dimshuffle(0,1,2,'x') - activation.dimshuffle('x',1,2,0)),axis=2) + 1e6 * T.eye(input.shape[0]).dimshuffle(0,'x',1)) if init: mean_min_abs_dif = 0.5 * T.mean(T.min(abs_dif, axis=2),axis=0) abs_dif /= mean_min_abs_dif.dimshuffle('x',0,'x') self.init_updates = [(self.log_weight_scale, self.log_weight_scale-T.log(mean_min_abs_dif).dimshuffle(0,'x'))] f = T.sum(T.exp(-abs_dif),axis=2) if init: mf = T.mean(f,axis=0) f -= mf.dimshuffle('x',0) self.init_updates.append((self.b, -mf)) else: f += self.b.dimshuffle('x',0) return T.concatenate([input, f], axis=1) # Input Mixture of Gaussian Layer
Example #25
Source File: recurrent.py From CAPTCHA-breaking with MIT License | 5 votes |
def get_padded_shuffled_mask(self, train, X, pad=0): mask = self.get_input_mask(train) if mask is None: mask = T.ones_like(X.sum(axis=-1)) # is there a better way to do this without a sum? # mask is (nb_samples, time) mask = T.shape_padright(mask) # (nb_samples, time, 1) mask = T.addbroadcast(mask, -1) # (time, nb_samples, 1) matrix. mask = mask.dimshuffle(1, 0, 2) # (time, nb_samples, 1) if pad > 0: # left-pad in time with 0 padding = alloc_zeros_matrix(pad, mask.shape[1], 1) mask = T.concatenate([padding, mask], axis=0) return mask.astype('int8')
Example #26
Source File: nn.py From deligan with MIT License | 5 votes |
def get_output_for(self, input, init=False, **kwargs): if input.ndim > 2: # if the input has more than two dimensions, flatten it into a # batch of feature vectors. input = input.flatten(2) activation = T.tensordot(input, self.W, [[1], [0]]) abs_dif = (T.sum(abs(activation.dimshuffle(0,1,2,'x') - activation.dimshuffle('x',1,2,0)),axis=2) + 1e6 * T.eye(input.shape[0]).dimshuffle(0,'x',1)) if init: mean_min_abs_dif = 0.5 * T.mean(T.min(abs_dif, axis=2),axis=0) abs_dif /= mean_min_abs_dif.dimshuffle('x',0,'x') self.init_updates = [(self.log_weight_scale, self.log_weight_scale-T.log(mean_min_abs_dif).dimshuffle(0,'x'))] f = T.sum(T.exp(-abs_dif),axis=2) if init: mf = T.mean(f,axis=0) f -= mf.dimshuffle('x',0) self.init_updates.append((self.b, -mf)) else: f += self.b.dimshuffle('x',0) return T.concatenate([input, f], axis=1) # Input Mixture of Gaussian Layer
Example #27
Source File: fft.py From deep_complex_networks with MIT License | 5 votes |
def ifft(z): B = z.shape[0]//2 L = z.shape[1] C = TT.as_tensor_variable(np.asarray([[[1,-1]]], dtype=T.config.floatX)) Zr, Zi = TTF.rfft(z[:B], norm="ortho"), TTF.rfft(z[B:]*-1, norm="ortho") isOdd = TT.eq(L%2, 1) Zr = TI.ifelse(isOdd, TT.concatenate([Zr, C*Zr[:,1: ][:,::-1]], axis=1), TT.concatenate([Zr, C*Zr[:,1:-1][:,::-1]], axis=1)) Zi = TI.ifelse(isOdd, TT.concatenate([Zi, C*Zi[:,1: ][:,::-1]], axis=1), TT.concatenate([Zi, C*Zi[:,1:-1][:,::-1]], axis=1)) Zi = (C*Zi)[:,:,::-1] # Zi * i Z = Zr+Zi return TT.concatenate([Z[:,:,0], Z[:,:,1]*-1], axis=0)
Example #28
Source File: ops.py From iGAN with MIT License | 5 votes |
def conv_cond_concat(x, y): """ concatenate conditioning vector on feature map axis """ return T.concatenate([x, y * T.ones((x.shape[0], y.shape[1], x.shape[2], x.shape[3]))], axis=1)
Example #29
Source File: nn.py From Att-ChemdNER with Apache License 2.0 | 5 votes |
def step(self, h_tm1,c_tm1,x): #{{{ assert x.ndim==2; H=x; input_length=x.shape[0]; C=T.repeat(c_tm1.reshape((1,-1)),input_length,axis=0); _HC=K.concatenate([H,C]); energy=T.dot(_HC,self.W_A.reshape((-1,1)))+self.b_A; energy=K.softmax(energy.reshape((1,-1))); x=(H*energy.reshape((-1,1))).sum(axis=0) h_t,c_t=super(AttentionLSTM,self).step_noBatch(x,h_tm1,c_tm1); return h_t,c_t #}}}
Example #30
Source File: mixer.py From dl4mt-c2c with BSD 3-Clause "New" or "Revised" License | 5 votes |
def multi_scale_conv_encoder(tparams, state_below, options, prefix='conv_enc', one_step=False, init_state=None, width=None, nkernels=None, pool_window=None, pool_stride=None, **kwargs): # state_below.shape = (maxlen_x_pad + 2*pool_stride, n_samples, dim_word_src) # mask.shape = (maxlen_x_pad/pool_stride, n_samples) assert len(width) == len(nkernels) data = state_below.dimshuffle(1,2,0,'x') # data.shape = (n_samples, dim_word_src, maxlen_x_pad + 2*pool_stride, 1) W = [tparams[_p(prefix, 'convW')+str(idx)] for idx in range(len(width))] b = [tparams[_p(prefix, 'convB')+str(idx)] for idx in range(len(width))] output = [] for idx in range(len(width)): curr_width = width[idx] output.append(dnn_conv(data, W[idx], border_mode='half', precision='float32')) # output[idx].shape = (n_samples, nkernels[idx], (maxlen_x_pad + 2*pool_stride), 1) if curr_width % 2 == 0: output[idx] = (output[idx])[:,:,:-1,:] # for filters with an even numbered width, half convolution yields an output whose length is 1 longer than the input, hence discarding the last one here. For more detail, consult http://deeplearning.net/software/theano/library/tensor/nnet/conv.html#theano.tensor.nnet.conv2d output[idx] = tensor.nnet.relu(output[idx] + b[idx].dimshuffle('x',0,'x','x')) result = tensor.concatenate(output, axis=1) # result.shape = (n_samples, sum(nkernels), (maxlen_x_pad + 2*pool_stride), 1) result = dnn_pool(result, (pool_window, 1), stride=(pool_stride, 1), mode='max', pad=(0, 0)) # result.shape = (n_samples, sum(nkernels), (maxlen_x_pad/pool_stride + 2), 1) result = result.dimshuffle(2,0,1,3)[1:-1,:,:,0] # We get rid of the first and the last result and shuffle. # result.shape = (maxlen_x_pad/pool_stride, n_samples, sum(nkernels)) return result