def conv2d_residual_block(network, lastlayer, model_layer):

    name = model_layer['name']
    filter_size = model_layer['filter_size']
    is_training = model_layer['batch_norm']
    if 'function' in model_layer:
        activation = model_layer['function']
    else:
        activation = 'relu'

    # original residual unit
    shape = network[lastlayer].get_output_shape()
    num_filters = shape[-1].value

    if not isinstance(filter_size, (list, tuple)):
        filter_size = (filter_size, 1)

    network[name + '_1resid'] = layers.Conv2DLayer(network[lastlayer],
                                                   num_filters=num_filters,
                                                   filter_size=filter_size,
                                                   padding='SAME')
    network[name + '_1resid_norm'] = layers.BatchNormLayer(
        network[name + '_1resid'], is_training)
    network[name + '_1resid_active'] = layers.ActivationLayer(
        network[name + '_1resid_norm'], function=activation)

    if 'dropout_block' in model_layer:
        network[name + '_dropout1'] = layers.DropoutLayer(
            network[name + '_1resid_active'],
            keep_prob=model_layer['dropout_block'])
        lastname = name + '_dropout1'
    else:
        lastname = name + '_1resid_active'

    network[name + '_2resid'] = layers.Conv2DLayer(network[lastname],
                                                   num_filters=num_filters,
                                                   filter_size=filter_size,
                                                   padding='SAME')
    network[name + '_2resid_norm'] = layers.BatchNormLayer(
        network[name + '_2resid'], is_training)
    network[name + '_resid_sum'] = layers.ElementwiseSumLayer(
        [network[lastlayer], network[name + '_2resid_norm']])
    network[name + '_resid'] = layers.ActivationLayer(network[name +
                                                              '_resid_sum'],
                                                      function=activation)
    return network
	def conv1d_residual_block(self, model_layer):

		lastlayer = self.lastlayer

		name = model_layer['name']
		filter_size = model_layer['filter_size']
		is_training = model_layer['batch_norm']
		if 'function' in model_layer:
			activation = model_layer['function']
		else:
			activation = 'relu'

		# original residual unit
		shape = self.network[lastlayer].get_output_shape()
		num_filters = shape[-1].value

		if not isinstance(filter_size, (list, tuple)):
			filter_size = (filter_size, 1)

		self.network[name+'_1resid'] = layers.Conv2DLayer(self.network[lastlayer], num_filters=num_filters, filter_size=filter_size, padding='SAME')
		self.network[name+'_1resid_norm'] = layers.BatchNormLayer(self.network[name+'_1resid'], is_training)
		self.network[name+'_1resid_active'] = layers.ActivationLayer(self.network[name+'_1resid_norm'], function=activation)

		if 'dropout_block' in model_layer:
			dropout = model_layer['dropout_block']
			placeholder_name = 'keep_prob'+str(len(self.num_dropout))
			exec(placeholder_name+" = tf.placeholder(tf.float32, name='"+placeholder_name+"')")
			#exec("self.placeholders["+placeholder_name+"] = " + placeholder_name)			
			exec("self.network["+name+"+'_dropout1'] = layers.DropoutLayer(self.network["+name+"+'_1resid_active'], keep_prob="+placeholder_name+")")				
			exec("self.hidden_feed_dict["+placeholder_name+"] ="+str(dropout))
			self.num_dropout += 1
			lastname = name+'_dropout1'
		else:
			lastname = name+'_1resid_active'

		self.network[name+'_2resid'] = layers.Conv2DLayer(self.network[lastname], num_filters=num_filters, filter_size=filter_size, padding='SAME')
		self.network[name+'_2resid_norm'] = layers.BatchNormLayer(self.network[name+'_2resid'], is_training)
		self.network[name+'_resid_sum'] = layers.ElementwiseSumLayer([self.network[lastlayer], self.network[name+'_2resid_norm']])
		self.network[name+'_resid'] = layers.ActivationLayer(self.network[name+'_resid_sum'], function=activation)

		self.lastlayer = name+'_resid'

		return network
def single_layer(model_layer, network_last):
    """ build a single layer"""

    # input layer
    if model_layer['layer'] == 'input':
        network = layers.InputLayer(model_layer['inputs'])

    # dense layer
    elif model_layer['layer'] == 'dense':
        if 'W' not in model_layer.keys():
            model_layer['W'] = init.HeNormal()
        if 'b' not in model_layer.keys():
            model_layer['b'] = init.Constant(0.05)
        network = layers.DenseLayer(network_last,
                                    num_units=model_layer['num_units'],
                                    W=model_layer['W'],
                                    b=model_layer['b'])

    # convolution layer
    elif (model_layer['layer'] == 'conv2d'):
        if 'W' not in model_layer.keys():
            W = init.HeUniform()
        else:
            W = model_layer['W']
        if 'padding' not in model_layer.keys():
            padding = 'VALID'
        else:
            padding = model_layer['padding']
        if 'strides' not in model_layer.keys():
            strides = (1, 1)
        else:
            strides = model_layer['strides']

        network = layers.Conv2DLayer(network_last,
                                     num_filters=model_layer['num_filters'],
                                     filter_size=model_layer['filter_size'],
                                     W=W,
                                     padding=padding,
                                     strides=strides)
    elif model_layer['layer'] == 'conv1d':
        if 'W' not in model_layer.keys():
            W = init.HeNormal()
        else:
            W = model_layer['W']
        if 'padding' not in model_layer.keys():
            padding = 'VALID'
        else:
            padding = model_layer['padding']
        if 'strides' not in model_layer.keys():
            strides = 1
        else:
            strides = model_layer['strides']

        network = layers.Conv1DLayer(network_last,
                                     num_filters=model_layer['num_filters'],
                                     filter_size=model_layer['filter_size'],
                                     W=W,
                                     padding=padding,
                                     strides=strides)

    return network
	def single_layer(self, model_layer):
		""" build a single layer"""

		name = model_layer['name']

		# input layer
		if model_layer['layer'] == 'input':

			input_shape = str(model_layer['input_shape'])
			exec(name+"=utils.placeholder(shape="+input_shape+", name='"+name+"')")	
			exec("self.network['"+model_layer['name']+"'] = layers.InputLayer("+name+")")
			exec("self.placeholders['inputs'].append(" + name + ")")


		# dense layer
		elif model_layer['layer'] == 'dense':
			if 'W' not in model_layer.keys():
				model_layer['W'] = init.HeNormal()
			if 'b' not in model_layer.keys():
				model_layer['b'] = init.Constant(0.05)
			self.network[name] = layers.DenseLayer(self.network[self.lastlayer], num_units=model_layer['num_units'],
												 W=model_layer['W'],
												 b=model_layer['b'])

		# convolution layer
		elif (model_layer['layer'] == 'conv2d'):

			if 'W' not in model_layer.keys():
				W = init.HeUniform()
			else:
				W = model_layer['W']
			if 'padding' not in model_layer.keys():
				padding = 'VALID'
			else:
				padding = model_layer['padding']
			if 'strides' not in model_layer.keys():
				strides = (1, 1)
			else:
				strides = model_layer['strides']

			self.network[name] = layers.Conv2DLayer(self.network[self.lastlayer], num_filters=model_layer['num_filters'],
												  filter_size=model_layer['filter_size'],
												  W=W,
												  padding=padding,
												  strides=strides)
			
		elif model_layer['layer'] == 'conv1d':
			if 'W' not in model_layer.keys():
				W = init.HeNormal()
			else:
				W = model_layer['W']
			if 'padding' not in model_layer.keys():
				padding = 'VALID'
			else:
				padding = model_layer['padding']
			if 'strides' not in model_layer.keys():
				strides = 1
			else:
				strides = model_layer['strides']


			self.network[name] = layers.Conv1DLayer(self.network[self.lastlayer], num_filters=model_layer['num_filters'],
												  filter_size=model_layer['filter_size'],
												  W=W,
												  padding=padding,
												  strides=strides)
		self.lastlayer = model_layer['name']