У меня 2к наблюдений.Каждое наблюдение имеет 2 канала, и каждый канал представляет собой вектор 1D 1024.
Observation_dim = (2000,2,1024)
Структура:
channe1 (1,1024)----> Convolutional layer1---
\
> concatenate-->FCN-->binary_classification
/
channe2 (1,1024)----> Convolutional layer2---
Каждый канал содержит независимую информацию, поэтому свертка должна выполняться 1D и отдельнодля каждого канала.
Это двоичная классификация, поэтому каждое наблюдение может принадлежать к классу 0 или 1.
Проблема: Я не знаю, как установить измерениядля простой классификации):
Примечание: Я пытаюсь извлечь элементы из каждого канала отдельно, используя функцию conv_1d
, затем объединить сглаженный вывод каждого conv_1d
и вставить вFCN.
def conv_1d(x):
w_s=3
p_s=4
conv1 = Conv1D(32, w_s, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(x)
batch1 = BatchNormalization()(conv1)
pool1 = MaxPooling1D(pool_size=p_s)(batch1)
conv2 = Conv1D(64, w_s, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool1)
batch2 = BatchNormalization()(conv2)
pool2 = MaxPooling1D(pool_size=p_s)(batch2)
flat = Flatten()(pool2)
return flat
def tst_1():
model = Sequential()
inputs = Input((2, 1024,1))#(batch, height, width, channels)
x1 = Lambda(lambda x:x[:,0])(inputs)
dense12= conv_1d(x1)
x2 = Lambda(lambda x:x[:,1])(inputs)
dense22 = conv_1d(x2)
flat = keras.layers.Concatenate()([dense12, dense22])
dense1 = Dense(512, activation='relu')(flat)
BN1 = BatchNormalization()(dense1)
dense2 = Dense(256, activation='relu')(BN1)
drop2 = Dropout(0.5)(dense2)
dense3 = Dense(64, activation='relu')(drop2)
densef = Dense(1, activation='sigmoid')(dense3)
model = Model(inputs = inputs, outputs = densef)
model.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy'])
return model
model = tst_1()
model.summary()