как максимально уменьшить загрузочную шею в автоэнкодере? - PullRequest
0 голосов
/ 16 апреля 2020

дорогие

у меня есть следующий код:

inpt = Input(shape=(160,1))

# Input is 160 samples, 20 ms for sampling rate of 8 kHz
# Of course speech can be wide-band. One should take care then

conv1 = Convolution1D(512,3,activation='relu',padding='same',strides=1)(inpt)
conv2 = Convolution1D(128,3,activation='relu',padding='same',strides=1)(conv1)
pool1 = MaxPooling1D(pool_size=2, strides=None, padding='valid')(conv2)


conv3 = Convolution1D(256,3,activation='relu',padding='same',strides=1)(pool1)
conv4 = Convolution1D(256,3,activation='relu',padding='same',strides=1)(conv3)
pool2 = MaxPooling1D(pool_size=2, strides=None, padding='valid')(conv4)


conv5 = Convolution1D(256,3,activation='relu',padding='same',strides=1)(pool2)
conv6 = Convolution1D(128,3,activation='relu',padding='same',strides=1)(conv5)
pool3 = MaxPooling1D(pool_size=2, strides=None, padding='valid')(conv6)


conv7 = Convolution1D(128,3,activation='relu',padding='same',strides=1)(pool3)
conv8 = Convolution1D(64,3,activation='relu',padding='same',strides=1)(conv7)
pool4 = MaxPooling1D(pool_size=2, strides=None, padding='valid')(conv8)


conv9 = Convolution1D(32,3,activation='relu',padding='same',strides=1)(pool4)
conv10 = Convolution1D(16,3,activation='relu',padding='same',strides=1)(conv9)
############################# EXTRA 
conv10 = Convolution1D( 8, kernel_size = (3), activation='relu', padding='same')(conv10)
pool4 = MaxPooling1D(pool_size = (2), padding='same')(conv10)
conv10 = Convolution1D( 8, 3, activation='relu', padding='same')(pool4)
encoded = Convolution1D( 8, 3, activation='relu', padding='same')(conv10)
#############

узкое место здесь имеет длину 6920, если входной сигнал 27000

Я хочу уменьшить узкое место в только 400, как это сделать, поправка должна начинаться с части extra Я пытался добавить дополнительный конв и пул, но длина не может быть меньше 6920.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Я создал для вас черновик следующим образом:

  1. кодер, принимающий входные данные формы (batch_size, 160, 1), выводящие векторы формы (batch_size, 1, 4)
  2. декодер, принимающий входные данные формы (batch_size, 1, 4), такие же, как на выходе кодера
  3. комбинированная модель encoder_decoder

кодер:

from tensorflow.keras.layers import Input, Convolution1D, MaxPooling1D, GlobalAveragePooling1D, UpSampling1D
import tensorflow as tf
inpt = Input(shape=(160,1))

# Input is 160 samples, 20 ms for sampling rate of 8 kHz
# Of course speech can be wide-band. One should take care then

conv1 = Convolution1D(512,3,activation='relu',padding='same',strides=1)(inpt)
conv2 = Convolution1D(128,3,activation='relu',padding='same',strides=1)(conv1)
pool1 = MaxPooling1D(pool_size=2, strides=None, padding='valid')(conv2)


conv3 = Convolution1D(256,3,activation='relu',padding='same',strides=1)(pool1)
conv4 = Convolution1D(256,3,activation='relu',padding='same',strides=1)(conv3)
pool2 = MaxPooling1D(pool_size=2, strides=None, padding='valid')(conv4)


conv5 = Convolution1D(256,3,activation='relu',padding='same',strides=1)(pool2)
conv6 = Convolution1D(128,3,activation='relu',padding='same',strides=1)(conv5)
pool3 = MaxPooling1D(pool_size=2, strides=None, padding='valid')(conv6)


conv7 = Convolution1D(128,3,activation='relu',padding='same',strides=1)(pool3)
conv8 = Convolution1D(64,3,activation='relu',padding='same',strides=1)(conv7)
pool4 = MaxPooling1D(pool_size=6, strides=None, padding='valid')(conv8)


conv9 = Convolution1D(32,3,activation='relu',padding='same',strides=1)(pool4)
conv10 = Convolution1D(4,3,activation='relu',padding='same',strides=1)(conv9)
encoded = MaxPooling1D(pool_size=3)(conv10)

encoder = tf.keras.Model(inputs=inpt, outputs=encoded)
encoder.summary()

Декодер:

input_decoder = Input(shape = (1, 4) ) ############# 
upsmp1 = UpSampling1D(size=2)(input_decoder) 
conv11 = Convolution1D( 4, 3, activation='relu', padding='same')(upsmp1) 
upsmp1 = UpSampling1D(size=8)(conv11) 
conv11 = Convolution1D( 8, 3, activation='relu', padding='same')(upsmp1) 
conv12 = Convolution1D( 8, 3, activation='relu', padding='same')(conv11) 
pool4 = UpSampling1D(size=10)(conv12) 
conv10 = Convolution1D( 1, kernel_size = (3), activation='relu', padding='same')(pool4) 
decoder = tf.keras.Model(inputs=input_decoder, outputs=conv10)
decoder.summary()

Комбинированный кодер-декодер:

encoder_decoder = tf.keras.Model(inputs=inpt, outputs=decoder(encoded))
encoder_decoder.summary()
0 голосов
/ 16 апреля 2020

Есть много разных способов получить желаемую длину:

  1. Увеличение размеров пула по пути:

    pool = MaxPooling1D (pool_size = (4 )) (prev) # или вы можете использовать более высокие числа

  2. Использовать VALID-заполнение в слоях Conv и Pool:

    pool = MaxPooling1D (pool_size = (4), padding = 'действительный') (предыдущий)

    conv10 = Convolution1D (8, 3, активация = 'relu', заполнение = 'действительный') (предыдущий)

  3. Вы может также использовать более высокие размеры шага в слое Pool и Conv

    pool = MaxPooling1D (pool_size = (4), strides = 4, padding = 'valid') (prev)

    conv10 = Convolution1D ( 8, 3, шаг = 4, активация = 'relu', заполнение = 'действительный') (предыдущая)

...