def create_cnn_general(embedded_x, mycnf, max_len, embedding_size, inp_conv=False): fv_len = 0 filter_sizes = mycnf['cnn_config']['filter_sizes'] num_filters = mycnf['cnn_config']['num_filters'] for i, fw in enumerate(filter_sizes): conv = ConvolutionalActivation( activation=Rectifier().apply, filter_size=(fw, embedding_size), num_filters=num_filters, num_channels=1, image_size=(max_len, embedding_size), name="conv"+str(fw)+embedded_x.name) pooling = MaxPooling((max_len-fw+1, 1), name="pool"+str(fw)+embedded_x.name) initialize([conv]) if inp_conv: convinp = embedded_x else: convinp = embedded_x.flatten().reshape((embedded_x.shape[0], 1, max_len, embedding_size)) onepool = pooling.apply(conv.apply(convinp)).flatten(2) if i == 0: outpools = onepool else: outpools = T.concatenate([outpools, onepool], axis=1) fv_len += conv.num_filters return outpools, fv_len
def test_convolutional_sequence(): x = tensor.tensor4('x') num_channels = 4 pooling_size = 3 batch_size = 5 activation = Rectifier().apply conv = ConvolutionalActivation(activation, (3, 3), 5, weights_init=Constant(1.), biases_init=Constant(5.)) pooling = MaxPooling(pooling_size=(pooling_size, pooling_size)) conv2 = ConvolutionalActivation(activation, (2, 2), 4, weights_init=Constant(1.)) seq = ConvolutionalSequence([conv, pooling, conv2], num_channels, image_size=(17, 13)) seq.push_allocation_config() assert conv.num_channels == 4 assert conv2.num_channels == 5 conv2.convolution.use_bias = False y = seq.apply(x) seq.initialize() func = function([x], y) x_val = numpy.ones((batch_size, 4, 17, 13), dtype=theano.config.floatX) y_val = (numpy.ones((batch_size, 4, 4, 2)) * (9 * 4 + 5) * 4 * 5) assert_allclose(func(x_val), y_val)
def test_convolutional_activation_use_bias(): act = ConvolutionalActivation(Rectifier().apply, (3, 3), 5, 4, image_size=(9, 9), use_bias=False) act.allocate() assert not act.convolution.use_bias assert len(ComputationGraph([act.apply(tensor.tensor4())]).parameters) == 1
def __init__(self, n_layers, n_hidden, spatial_width, n_colors, filter_size=3): """ A brick implementing a multi-layer convolutional network. TODO make this multi-scale multi-layer convolution """ super(MultiLayerConvolution, self).__init__() self.filter_size = filter_size self.children = [] num_channels = n_colors for ii in xrange(n_layers): conv_layer = ConvolutionalActivation( activation=conv_nonlinearity.apply, filter_size=(filter_size, filter_size), num_filters=n_hidden, num_channels=num_channels, image_size=(spatial_width, spatial_width), # assume images are spatially smooth -- in which case output magnitude scales with # # filter pixels rather than square root of # filter pixels, so initialize # accordingly. weights_init=IsotropicGaussian(std=np.sqrt(1. / (n_hidden)) / filter_size**2), biases_init=Constant(0), border_mode='full', name="conv%d" % ii) self.children.append(conv_layer) num_channels = n_hidden
def test_border_mode_not_pushed(): layers = [ Convolutional(border_mode='full'), ConvolutionalActivation(Rectifier().apply), ConvolutionalActivation(Rectifier().apply, border_mode='valid'), ConvolutionalActivation(Rectifier().apply, border_mode='full') ] stack = ConvolutionalSequence(layers) stack.push_allocation_config() assert stack.children[0].border_mode == 'full' assert stack.children[1].border_mode == 'valid' assert stack.children[2].border_mode == 'valid' assert stack.children[3].border_mode == 'full' stack2 = ConvolutionalSequence(layers, border_mode='full') stack2.push_allocation_config() assert stack2.children[0].border_mode == 'full' assert stack2.children[1].border_mode == 'full' assert stack2.children[2].border_mode == 'full' assert stack2.children[3].border_mode == 'full'
def __init__(self, conv_activations, num_channels, image_shape, filter_sizes, feature_maps, pooling_sizes, top_mlp_activations, top_mlp_dims, conv_step=None, border_mode='valid', **kwargs): if conv_step is None: self.conv_step = (1, 1) else: self.conv_step = conv_step self.num_channels = num_channels self.image_shape = image_shape self.top_mlp_activations = top_mlp_activations self.top_mlp_dims = top_mlp_dims self.border_mode = border_mode conv_parameters = zip(conv_activations, filter_sizes, feature_maps) # Construct convolutional layers with corresponding parameters self.layers = list( interleave([(ConvolutionalActivation(filter_size=filter_size, num_filters=num_filter, activation=activation.apply, step=self.conv_step, border_mode=self.border_mode, name='conv_{}'.format(i)) for i, (activation, filter_size, num_filter) in enumerate(conv_parameters)), (MaxPooling(size, name='pool_{}'.format(i)) for i, size in enumerate(pooling_sizes))])) self.conv_sequence = ConvolutionalSequence(self.layers, num_channels, image_size=image_shape) # Construct a top MLP self.top_mlp = MLP(top_mlp_activations, top_mlp_dims) # We need to flatten the output of the last convolutional layer. # This brick accepts a tensor of dimension (batch_size, ...) and # returns a matrix (batch_size, features) self.flattener = Flattener() application_methods = [ self.conv_sequence.apply, self.flattener.apply, self.top_mlp.apply ] super(LeNet, self).__init__(application_methods, **kwargs)
def test_convolutional_sequence_use_bias(): cnn = ConvolutionalSequence([ ConvolutionalActivation( activation=Rectifier().apply, filter_size=(1, 1), num_filters=1) for _ in range(3) ], num_channels=1, image_size=(1, 1), use_bias=False) cnn.allocate() x = tensor.tensor4() y = cnn.apply(x) params = ComputationGraph(y).parameters assert len(params) == 3 and all(param.name == 'W' for param in params)
def apply_cnn(self, l_emb1, l_size1, l_emb2, l_size2, r_emb1, r_size1, r_emb2, r_size2, embedding_size, mycnf): assert l_size1 == r_size1 assert l_size2 == r_size2 assert l_size1 == l_size1 max_len = l_size1 fv_len = 0 filter_sizes = mycnf['cnn_config']['filter_sizes'] num_filters = mycnf['cnn_config']['num_filters'] for i, fw in enumerate(filter_sizes): conv_left = ConvolutionalActivation( activation=Rectifier().apply, filter_size=(fw, embedding_size), num_filters=num_filters, num_channels=1, image_size=(max_len, embedding_size), name="conv" + str(fw) + l_emb1.name, seed=self.curSeed) conv_right = ConvolutionalActivation( activation=Rectifier().apply, filter_size=(fw, embedding_size), num_filters=num_filters, num_channels=1, image_size=(max_len, embedding_size), name="conv" + str(fw) + r_emb1.name, seed=self.curSeed) pooling = MaxPooling((max_len - fw + 1, 1), name="pool" + str(fw)) initialize([conv_left, conv_right]) l_convinp1 = l_emb1.flatten().reshape( (l_emb1.shape[0], 1, max_len, embedding_size)) l_convinp2 = l_emb2.flatten().reshape( (l_emb2.shape[0], 1, max_len, embedding_size)) l_pool1 = pooling.apply(conv_left.apply(l_convinp1)).flatten(2) l_pool2 = pooling.apply(conv_left.apply(l_convinp2)).flatten(2) r_convinp1 = r_emb1.flatten().reshape( (r_emb1.shape[0], 1, max_len, embedding_size)) r_convinp2 = r_emb2.flatten().reshape( (r_emb2.shape[0], 1, max_len, embedding_size)) r_pool1 = pooling.apply(conv_right.apply(r_convinp1)).flatten(2) r_pool2 = pooling.apply(conv_right.apply(r_convinp2)).flatten(2) onepools1 = T.concatenate([l_pool1, r_pool1], axis=1) onepools2 = T.concatenate([l_pool2, r_pool2], axis=1) fv_len += conv_left.num_filters * 2 if i == 0: outpools1 = onepools1 outpools2 = onepools2 else: outpools1 = T.concatenate([outpools1, onepools1], axis=1) outpools2 = T.concatenate([outpools2, onepools2], axis=1) return outpools1, outpools2, fv_len
def __init__(self, num_channels, num_filters, spatial_width, num_scales, filter_size, downsample_method='meanout', name=""): """ A brick implementing a single layer in a multi-scale convolutional network. """ super(MultiScaleConvolution, self).__init__() self.num_scales = num_scales self.filter_size = filter_size self.num_filters = num_filters self.spatial_width = spatial_width self.downsample_method = downsample_method self.children = [] print "adding MultiScaleConvolution layer" # for scale in range(self.num_scales-1, -1, -1): for scale in range(self.num_scales): print "scale %d" % scale conv_layer = ConvolutionalActivation( activation=conv_nonlinearity.apply, filter_size=(filter_size, filter_size), num_filters=num_filters, num_channels=num_channels, image_size=(spatial_width / 2**scale, spatial_width / 2**scale), # assume images are spatially smooth -- in which case output magnitude scales with # # filter pixels rather than square root of # filter pixels, so initialize # accordingly. weights_init=IsotropicGaussian( std=np.sqrt(1. / (num_filters)) / filter_size**2), biases_init=Constant(0), border_mode='full', name=name + "scale%d" % scale) self.children.append(conv_layer)
mlp_hiddens = [1000] output_size = 2 activation = [Rectifier().apply for _ in num_filter] mlp_activation = [Rectifier().apply for _ in mlp_hiddens] + [Softmax().apply] #Create the symbolics variable x = tensor.tensor4('image_features') y = tensor.lmatrix('targets') #Get the parameters conv_parameters = zip(activation, filter_size, num_filter) #Create the convolutions layers conv_layers = list( interleave([(ConvolutionalActivation(filter_size=filter_size, num_filters=num_filter, activation=activation, name='conv_{}'.format(i)) for i, (activation, filter_size, num_filter) in enumerate(conv_parameters)), (MaxPooling(size, name='pool_{}'.format(i)) for i, size in enumerate(pooling_sizes))])) #Create the sequence conv_sequence = ConvolutionalSequence(conv_layers, num_channels, image_size=image_shape, weights_init=Uniform(width=0.2), biases_init=Constant(0.)) #Initialize the convnet conv_sequence.initialize() #Add the MLP