ValueError: ошибка при проверке цели: ожидалось, что плотный_35 будет иметь форму (1,), но получил массив с формой (116,) - PullRequest
0 голосов
/ 08 мая 2020

Я занимаюсь обнаружением аномалий. Я смог сделать это с помощью автокодировщика. Теперь я использую комбинацию autoencoder и mlp для сравнения результатов, для этого я создал следующий код:

encoding_dim=58
input_dim=xtrain.shape[1]# The input layer must have an equal number of neurons as the number of columns which is 116

############################
#Define the DAE architecture
############################

inputArray=Input(shape=(input_dim,)) #definir le type d'input : <tf.Tensor 'input_1:0' shape=(?, 29) dtype=float32>
encoded= Dense(units=encoding_dim,activation="tanh")(inputArray) # units ; nember of neurons for the layer , relu =max(0,x)
encoded= Dense(units=29,activation="tanh")(encoded)
encoded= Dense(units=15,activation="tanh")(encoded)
encoded= Dense(units=10,activation="tanh")(encoded)
encoded= Dense(units=3,activation="tanh")(encoded)
encoded= Dense(units=10,activation="tanh")(encoded)
decoded= Dense(units=15,activation="tanh")(encoded)
decoded= Dense(units=29,activation="tanh")(decoded)
decoded= Dense(units=encoding_dim,activation="tanh")(decoded)
decoded= Dense(units=input_dim,activation="softmax",name='decoded')(decoded) #softmax return a vector of probabilty for each class 

############################
#Define the MLP architecture
############################
output_mlp = 70
first_input = Input(shape=(input_dim, ))
mlp = Dense(40, )(first_input)
mlp = Dense(80, input_dim=60, activation='relu')(mlp)
dropout_mlp = Dropout(0.1)(mlp)
mlp =Dense(70, input_dim=80, activation='relu')(dropout_mlp)
dropout_mlp =Dropout(0.1)(mlp)
mlp =Dense(30, input_dim=output_mlp, activation='relu',name='mlp')(dropout_mlp)
#dropout_mlp =Dropout(0.1)(mlp)
#mlp =Dense(10, input_dim=30, activation='relu')(dropout_mlp)
#dropout_mlp =Dropout(0.1)(mlp)

############################
#Define the concatenate layer
############################

merge_layer = concatenate([mlp, decoded])

############################
#Define the rest of layers
############################

third_layer =Dense(input_dim+ output_mlp, input_dim=input_dim+ output_mlp, activation='relu')(merge_layer)
dropout_mlp =Dropout(0.1)(third_layer)
third_layer =Dense(40, input_dim=70, activation='relu')(dropout_mlp)
dropout_mlp =Dropout(0.1)(third_layer)
third_layer =Dense(5, input_dim=40, activation='relu')(dropout_mlp)
third_layer = Dense(1, activation='sigmoid')(third_layer)


############################
#Compile and plot the model
############################

autoecoder = Model(inputs=[first_input, inputArray], outputs=third_layer)
autoecoder.compile(optimizer='adam', 
              loss='categorical_crossentropy', 
              metrics=['accuracy'])

plot_model(autoecoder,to_file='demo.png',show_shapes=True)

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

#hyperparametrs :
batchsize=100
epoch=10
start_time = time.time() 
autoecoder.fit([xtrain,xtrain],xtrain,
              batch_size=batchsize,
              epochs=epoch,
              verbose=1,
              shuffle=True,
              validation_data=([xtest,xtest],xtest),
              callbacks=[TensorBoard(log_dir="../logs/autoencoderHoussem")])

, но у меня есть эта ошибка:

ValueError: Ошибка при проверке цели: ожидалось, что плотный_35 будет иметь форму (1,), но получил массив с формой (116,)

Кто-нибудь может помочь, пожалуйста

1 Ответ

0 голосов
/ 08 мая 2020

В этой строке (которая определяет последний слой в вашей модели):

third_layer = Dense(1, activation='sigmoid')(third_layer)

Вы говорите, что модель должна выводить 1 значение. Однако здесь:

autoecoder.fit(x = [xtrain,xtrain], y = xtrain,
              ...,
              )

Вы даете своей модели массив из 116 значений (размер xtrain) в качестве ожидаемого значения. Это вызывает ошибку ValueError, так как не может вычислить потери из-за несоответствия размера.

...