Сверточный автоэнкодер для анализа длинных одномерных последовательностей

У меня есть набор данных 1-D векторов, каждый длиной 3001 цифра. Я использовал простую сверточную сеть для выполнения двоичной классификации этих последовательностей:

shape=train_X.shape[1:]
model = Sequential()
model.add(Conv1D(75,3,strides=1, input_shape=shape, activation='relu'))
model.add(MaxPooling1D(3))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

Сеть достигает ~60% точности. Теперь я хотел бы создать автоэнкодер для обнаружения регулярного паттерна, различающего образцы, где метка "1", по сравнению с теми, где "0". то есть, чтобы генерировать примерную последовательность, которая представляет "1" помеченные образцы.

Основываясь на предыдущих блогах и постах, я попытался собрать авто-кодер, который может достичь этого:

input_sig = Input(batch_shape=(None,3001,1))
x = Conv1D(64,3, activation='relu', padding='same')(input_sig)
x1 = MaxPooling1D(2)(x)
x2 = Conv1D(32,3, activation='relu', padding='same')(x1)
x3 = MaxPooling1D(2)(x2)
flat = Flatten()(x3)
encoded = Dense(1,activation = 'relu')(flat)
x2_ = Conv1D(32, 3, activation='relu', padding='same')(x3)
x1_ = UpSampling1D(2)(x2_)
x_ = Conv1D(64, 3, activation='relu', padding='same')(x1_)
upsamp = UpSampling1D(2)(x_)
decoded = Conv1D(1, 3, activation='sigmoid', padding='same')(upsamp)
autoencoder = Model(input_sig, decoded)
autoencoder.compile(optimizer='adam', loss='mse', metrics=['accuracy'])

Это выглядит следующим образом:

autoencoder.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_57 (InputLayer)        (None, 3001, 1)           0         
_________________________________________________________________
conv1d_233 (Conv1D)          (None, 3001, 64)          256       
_________________________________________________________________
max_pooling1d_115 (MaxPoolin (None, 1500, 64)          0         
_________________________________________________________________
conv1d_234 (Conv1D)          (None, 1500, 32)          6176      
_________________________________________________________________
max_pooling1d_116 (MaxPoolin (None, 750, 32)           0         
_________________________________________________________________
conv1d_235 (Conv1D)          (None, 750, 32)           3104      
_________________________________________________________________
up_sampling1d_106 (UpSamplin (None, 1500, 32)          0         
_________________________________________________________________
conv1d_236 (Conv1D)          (None, 1500, 64)          6208      
_________________________________________________________________
up_sampling1d_107 (UpSamplin (None, 3000, 64)          0         
_________________________________________________________________
conv1d_237 (Conv1D)          (None, 3000, 64)          12352     
=================================================================
Total params: 28,096
Trainable params: 28,096
Non-trainable params: 0

следовательно, все, кажется, идет гладко, пока я не обучаю netowrk

autoencoder.fit(train_X,train_y,epochs=3,batch_size=100,validation_data=(test_X, test_y))

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/bsxcto/miniconda3/lib/python3.6/site-packages/keras/engine/training.py", line 1630, in fit
    batch_size=batch_size)
  File "/home/bsxcto/miniconda3/lib/python3.6/site-packages/keras/engine/training.py", line 1480, in _standardize_user_data
    exception_prefix='target')
  File "/home/bsxcto/miniconda3/lib/python3.6/site-packages/keras/engine/training.py", line 113, in _standardize_input_data
    'with shape ' + str(data_shape))
ValueError: Error when checking target: expected conv1d_237 to have 3 dimensions, but got array with shape (32318, 1)

Поэтому я попытался добавить слой "Изменить форму" перед последним.

upsamp = UpSampling1D(2)(x_)
flat = Flatten()(upsamp)
reshaped = Reshape((3000,64))(flat)
decoded = Conv1D(1, 3, activation='sigmoid', padding='same')(reshaped)

в этом случае сеть выглядит следующим образом:

autoencoder.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_59 (InputLayer)        (None, 3001, 1)           0         
_________________________________________________________________
conv1d_243 (Conv1D)          (None, 3001, 64)          256       
_________________________________________________________________
max_pooling1d_119 (MaxPoolin (None, 1500, 64)          0         
_________________________________________________________________
conv1d_244 (Conv1D)          (None, 1500, 32)          6176      
_________________________________________________________________
max_pooling1d_120 (MaxPoolin (None, 750, 32)           0         
_________________________________________________________________
conv1d_245 (Conv1D)          (None, 750, 32)           3104      
_________________________________________________________________
up_sampling1d_110 (UpSamplin (None, 1500, 32)          0         
_________________________________________________________________
conv1d_246 (Conv1D)          (None, 1500, 64)          6208      
_________________________________________________________________
up_sampling1d_111 (UpSamplin (None, 3000, 64)          0         
_________________________________________________________________
flatten_111 (Flatten)        (None, 192000)            0         
_________________________________________________________________
reshape_45 (Reshape)         (None, 3000, 64)          0         
_________________________________________________________________
conv1d_247 (Conv1D)          (None, 3000, 1)           193       
=================================================================
Total params: 15,937
Trainable params: 15,937
Non-trainable params: 0

Но та же ошибка приводит к:

Error when checking target: expected conv1d_247 to have 3 dimensions, but got array with shape (32318, 1)

Мои вопросы:

1) Является ли это возможным способом поиска шаблона, который отличает образцы с меткой "1" против "0"?

2) как сделать так, чтобы последний слой принимал окончательный результат последнего слоя с повышением частоты дискретизации?

1 ответ

original = Sequential() 
original.add(Conv1D(75,repeat_length,strides=stride, input_shape=shape, activation='relu’,padding=‘same’))
original.add(MaxPooling1D(repeat_length))   
original.add(Flatten()) 
original.add(Dense(1, activation='sigmoid'))    
original.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy']) 
calculate_roc(original......)

mod=Sequential()
mod.add(original.layers[0])
mod.add(original.layers[1]) 
mod.add(Conv1D(75,window, activation='relu', padding='same'))   
mod.add(UpSampling1D(window))   
mod.add(Conv1D(1, 1, activation='sigmoid', padding='same'))
mod.compile(optimizer='adam', loss='mse', metrics=['accuracy']) 
mod.layers[0].trainable=False   
mod.layers[1].trainable=False   
mod.fit(train_X,train_X,epochs=1,batch_size=100)
decoded_imgs = mod.predict(test_X)  
x=decoded_imgs.mean(axis=0) 
plt.plot(x)
Другие вопросы по тегам