Трудности реализации DANN с использованием пакета ADAPT для Python: входные данные для изменения формы — это тензор со 1Python

Программы на Python
Anonymous
Трудности реализации DANN с использованием пакета ADAPT для Python: входные данные для изменения формы — это тензор со 1

Сообщение Anonymous »

Я хотел бы реализовать DANN (доменно-состязательную нейронную сеть), используя пакет ADAPT для Python, однако, похоже, существует проблема с формой ввода классификатора или дискриминатора задач.Ниже вы можете найти мой код.
В качестве входных данных я использую данные ЭЭГ, что означает, что данные имеют следующую форму:
Xs: (254, 60, 257, 1) (значение: (#испытания, #каналы, #точки времени, 1))
Xt: (255, 60, 257, 1)
ys: (254,)
yt: (255,)
Я хочу использовать EEGNet в качестве кодировщика (экстрактора функций) а также определили задачу и классификатор дискриминатора. Я еще не делал ничего необычного с оптимизаторами и не запускал поиск по гиперпараметрам, так как постоянно получаю ту же ошибку при попытке запустить код.

Код: Выделить всё

channels = Xs.shape[1]
timepoints = Xs.shape[2]

def get_EEGNet_feature_encoder(Chans=channels, Samples=timepoints,
dropoutRate=0.3, kernLength=64, F1=6,
D=1, F2=6, dropoutType='Dropout'):

if dropoutType == 'SpatialDropout2D':
dropoutType = SpatialDropout2D
elif dropoutType == 'Dropout':
dropoutType = Dropout
else:
raise ValueError('dropoutType must be one of SpatialDropout2D '
'or Dropout, passed as a string.')

model = Sequential()
model.add(Conv2D(F1, (1, kernLength), padding='valid',
input_shape=(Chans, Samples, 1),
use_bias=False))
model.add(BatchNormalization())
model.add(DepthwiseConv2D((Chans, 1), use_bias=False,
depth_multiplier=D,
depthwise_constraint=max_norm(1.), padding='valid'))
model.add(BatchNormalization())
model.add(Activation('elu'))
model.add(AveragePooling2D((1, 4)))
model.add(dropoutType(dropoutRate))

model.add(SeparableConv2D(F2, (1, 16),
use_bias=False, padding='valid'))
model.add(BatchNormalization())
model.add(Activation('elu'))
model.add(AveragePooling2D((1, 8)))
model.add(dropoutType(dropoutRate))

model.add(Flatten())

model.compile(optimizer=SGD(0.01), loss='mse')

return model

def get_EEGNet_task(input_shape, nb_classes=4, norm_rate=0.25):
model = Sequential()
model.add(Input(shape=input_shape))
model.add(Dense(nb_classes, name='task_dense', kernel_constraint=max_norm(norm_rate), activation='softmax'))
model.compile(optimizer=SGD(0.01), loss='mse')
return model

def get_EEGNet_discriminator(input_shape):
model = Sequential()
model.add(Input(shape=input_shape))
model.add(Dense(10, activation='elu'))
model.add(Dense(1, name='disc_dense', activation='sigmoid'))
model.compile(optimizer=SGD(0.01), loss='mse')
return model

encoder = get_EEGNet_feature_encoder()
encoder_output_shape = encoder.output_shape[1:]

model = DANN(encoder=get_EEGNet_feature_encoder(), task=get_EEGNet_task(input_shape=encoder_output_shape),
discriminator=get_EEGNet_discriminator(input_shape=encoder_output_shape), lambda_=0.01, Xt=Xt, metrics=["acc"],
optimizer=SGD(0.001), random_state=304)

# Train the model
model.fit(Xs, ys, Xt, epochs=100)

# Evaluate the model
model.score(Xt, yt)

Сообщение об ошибке при выполнении model.fit():

Код: Выделить всё

Input to reshape is a tensor with 128 values, but the requested shape has 32
[[{{node Reshape}}]] [Op:__inference_train_function_3508]
Я даже не могу сказать, связана ли проблема с задачей или классификатором дискриминатора (может быть и с тем, и с другим). Я думал, что решил проблему, извлекая выходную форму кодера в качестве входной формы для классификатора задачи и дискриминатора, но, очевидно, нет. Удаление сглаживающего слоя из кодировщика также не помогло.
Я был бы рад, если бы кто-нибудь мог мне здесь помочь. Мой вопрос, возможно, легко решить, однако, если вы делаете это самостоятельно, вы не замечаете допущенных вами ошибок.
Заранее благодарим за любые советы!

Подробнее здесь: https://stackoverflow.com/questions/789 ... nput-to-re

Вернуться в «Python»