Exemplo n.º 1
0
def downstage_resBlock(x, stage_id, keep_prob, stage_num=5):
    """
    Vnet左侧的压缩路径的一个stage层
    :param x: 该stage的输入
    :param stage_id: int,表示第几个stage,原论文中从上到下依次是1-5
    :param keep_prob: dropout保留元素的概率,如果不需要则设置为1
    :param stage_num: stage_num是Vnet设置的stage总数
    :return: stage下采样后的输出和stage下采样前的输出,下采样前的输出需要与Vnet右侧的扩展路径连接,所以需要输出保存。
    """
    x0 = x  # x0是stage的原始输入
    # Vnet每个stage的输入会进行特定次数的卷积操作,1~3个stage分别执行1~3次卷积,3以后的stage均执行3次卷积
    # 每个stage的通道数(卷积核个数或叫做feature map数量)依次增加两倍,从16,32,64,128到256
    for _ in range(3 if stage_id > 3 else stage_id):
        x = PReLU()(BatchNormalization()(Conv2D(
            16 * (2**(stage_id - 1)),
            5,
            activation=None,
            padding='same',
            kernel_initializer='he_normal')(x)))
        print('conv_down_stage_%d:' % stage_id,
              x.get_shape().as_list())  #输出收缩路径中每个stage内的卷积
    x_add = PReLU()(add([x0, x]))
    x_add = Dropout(keep_prob)(x_add)

    if stage_id < stage_num:
        x_downsample = PReLU()(BatchNormalization()(Conv2D(
            16 * (2**stage_id),
            2,
            strides=(2, 2),
            activation=None,
            padding='same',
            kernel_initializer='he_normal')(x_add)))
        return x_downsample, x_add  # 返回每个stage下采样后的结果,以及在相加之后的结果
    else:
        return x_add, x_add  # 返回相加之后的结果,为了和上面输出保持一致,所以重复输出
Exemplo n.º 2
0
def up_resBlock(forward_conv,input_conv,stage):#扩展路径
    
    conv=concatenate([forward_conv,input_conv],axis = -1)
    print('conv_concatenate:',conv.get_shape().as_list())
    for _ in range(3 if stage>3 else stage):
        conv=PReLU()(BatchNormalization()(Conv2D(16*(2**(stage-1)), 5, activation = None, padding = 'same', kernel_initializer = 'he_normal')(conv)))
        print('conv_up_stage_%d:' %stage,conv.get_shape().as_list())#输出扩展路径中每个stage内的卷积
    conv_add=PReLU()(add([input_conv,conv]))
    if stage>1:
        conv_upsample=PReLU()(BatchNormalization()(Conv2DTranspose(16*(2**(stage-2)),2,strides=(2, 2),padding='valid',activation = None,kernel_initializer = 'he_normal')(conv_add)))
        return conv_upsample
    else:
        return conv_add
Exemplo n.º 3
0
    def generator2(self):
        def make_z(shape, mean=0., std=1., name='z'):
            z = tf.random_normal(shape, mean=mean, stddev=std,name=name, dtype=tf.float32)
            return z
          
        def WaveNetResidualConv1D(num_filters, kernel_size, dilation_rate):
            def build_residual_block(input):

                sigm_conv1d = AtrousConvolution1D(num_filters, kernel_size, dilation_rate=dilation_rate,padding="same", activation="sigmoid")(input)
                tanh_conv1d = AtrousConvolution1D(num_filters, kernel_size, dilation_rate=dilation_rate,padding="same", activation="tanh")(input)

                multiplyLayers = Multiply()([sigm_conv1d, tanh_conv1d])

                skip_connection = Conv1D(1, 1)(multiplyLayers)
                residual = Add()([input, skip_connection])

                return residual, skip_connection

            return build_residual_block

        def UpConv1DModule(input, filters, filters_size=5, dropout = 0.0):
            def Conv1DTranspose(input, filters, filters_size, strides=2, padding='same'):
                x = Lambda(lambda x: K.expand_dims(x, axis=2))(input)
                x = Conv2DTranspose(filters=filters, kernel_size=(filters_size, 1), strides=(strides, 1), padding=padding)(x)
                x = Lambda(lambda x: K.squeeze(x, axis=2))(x)
                return x

            x = Conv1DTranspose(input, filters, filters_size)
            x = UpSampling1D(size=2)(x)

            x = BatchNormalization(momentum=0.8)(x)

            return x
        
        input_sound = Input(shape=(1,self.sound_length))    
        kwidth = 31
        enc_layers = 7
        
        h_i = input_sound
        skip_out = True
        skips = []
        g_enc_depths = [16, 32, 32, 64, 64, 128, 128, 256, 256, 512, 1024]
        
        for layer_idx, layer_depth in enumerate(g_enc_depths):
          
            h_i_dwn = Conv1D(layer_depth, kwidth, data_format='channels_first')(h_i)
            h_i = h_i_dwn
            
            if layer_idx < len(g_enc_depths) - 1:
                skips.append(h_i)
                
            h_i = PReLU()(h_i)

#         z = make_z((input_sound.get_shape().as_list()[0], 1, 16384))
#         h_i = concatenate([z, h_i])


        g_dec_depths = g_enc_depths[:-1][::-1] + [1]
        
        for layer_idx, layer_depth in enumerate(g_dec_depths):
            h_i_dim = h_i.get_shape().as_list()
          
            h_i_dcv = UpConv1DModule(h_i, layer_depth, kwidth)
            
            h_i = h_i_dcv
            if layer_idx < len(g_dec_depths) - 1:
              
                h_i = PReLU()(h_i)
                skip_ = skips[-(layer_idx + 1)]
                h_i = concatenate([Permute((2,1))(h_i), skip_],axis=2)

            else:
                h_i = Activation('tanh')(h_i)

        return Model(input_sound,h_i)