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 # 返回相加之后的结果,为了和上面输出保持一致,所以重复输出
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
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)