Keras CONV1D: Ошибка при проверке цели: ожидалось, что плотность_производителя имеет 2 измерения, но получен массив с формой (35206, 50, 1) - PullRequest
0 голосов
/ 29 сентября 2019

У меня возникла эта проблема: ошибка при проверке цели: ожидалось, что плотность_производителя имеет 2 измерения, но получен массив с формой (35206, 50, 1). При этом коде используется автоматический кодер с CONV1D и двумя выходными данными, но проблема заключается в реконструкциивыходной сигнал (density_output):

X_train, X_test, y_train, y_test = train_test_split(X, other_output, test_size=0.3, random_state=42)

TAM_VECTOR = X_train.shape[1]

input_tweet = Input(shape=(TAM_VECTOR,X_train.shape[2]))

encoded = Conv1D(64, kernel_size=1, activation='relu')(input_tweet)
encoded = Conv1D(32, kernel_size=1, activation='relu')(encoded)

decoded = Conv1D(32, kernel_size=1, activation='relu')(encoded)
decoded = Conv1D(64, kernel_size=1, activation='relu')(decoded)
decoded = Flatten()(decoded)
decoded = Dense(TAM_VECTOR, activation='relu', name='dense_output')(decoded)

encoded = Flatten()(encoded)
second_output = Dense(1, activation='linear', name='second_output')(encoded)

autoencoder = Model(inputs=input_tweet, outputs=[decoded, second_output])

autoencoder.compile(optimizer="adam",
                    loss={'dense_output': 'mse', 'second_output': 'mse'},
                    loss_weights={'dense_output': 0.001, 'second_output': 0.999},
                    metrics=["mae"])

autoencoder.fit([X_train], [X_train, y_train], epochs=10, batch_size=32)

Вход (X) имеет форму (50000,50), и я изменяю его на:

X = np.reshape(X, (X.shape[0], X.shape[1], -1))

(50000,50,1)

И other_output -

other_output.shape

(50000,1)

А вот краткое изложение модели

Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_27 (InputLayer)           (None, 50, 1)        0                                            
__________________________________________________________________________________________________
conv1d_105 (Conv1D)             (None, 50, 64)       128         input_27[0][0]                   
__________________________________________________________________________________________________
conv1d_106 (Conv1D)             (None, 50, 32)       2080        conv1d_105[0][0]                 
__________________________________________________________________________________________________
conv1d_107 (Conv1D)             (None, 50, 32)       1056        conv1d_106[0][0]                 
__________________________________________________________________________________________________
conv1d_108 (Conv1D)             (None, 50, 64)       2112        conv1d_107[0][0]                 
__________________________________________________________________________________________________
flatten_42 (Flatten)            (None, 3200)         0           conv1d_108[0][0]                 
__________________________________________________________________________________________________
flatten_43 (Flatten)            (None, 1600)         0           conv1d_106[0][0]                 
__________________________________________________________________________________________________
dense_output (Dense)            (None, 50)           160050      flatten_42[0][0]                 
__________________________________________________________________________________________________
second_output (Dense)           (None, 1)            1601        flatten_43[0][0]                 
==================================================================================================
Total params: 167,027
Trainable params: 167,027
Non-trainable params: 0

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Теперь, изменяя последний Dense на Conv, код выглядит так:

input_tweet = Input(shape=(TAM_VECTOR,X_train.shape[2]))

encoded = Conv1D(64, kernel_size=1, activation='relu')(input_tweet)
encoded = Conv1D(32, kernel_size=1, activation='relu')(encoded)

decoded = Conv1D(32, kernel_size=1, activation='relu')(encoded)
decoded = Conv1D(64, kernel_size=1, activation='relu')(decoded)
decoded = Conv1D(TAM_VECTOR, kernel_size=1, activation='relu', name='decoded_output')(decoded)

encoded = Flatten()(encoded)
second_output = Dense(1, activation='linear', name='second_output')(encoded)

Но с этой ошибкой:

ValueError: Error when checking target: expected tweet_output to have shape (50, 50) but got array with shape (50, 1)

У меня также была эта ошибка в других тестах, когда яположить плотный слой без Flatten ранее

0 голосов
/ 29 сентября 2019

Вы обучаете сверточный автоэнкодер, поэтому выходной слой для декодирования не может быть плотным слоем (у него нет канала).Вместо этого вам нужен слой Conv1D в конце.

Вот код, который работает:

tf.reset_default_graph()

X = np.random.rand(50000, 50, 1); y = np.linspace(1, 50000, 50000)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

TAM_VECTOR = X_train.shape[1]

input_tweet = Input(shape=(TAM_VECTOR, X_train.shape[2]))
encoded = Conv1D(64, kernel_size=1, activation='relu')(input_tweet)
encoded = Conv1D(32, kernel_size=1, activation='relu')(encoded)

decoded = Conv1D(32, kernel_size=1, activation='relu')(encoded)
decoded = Conv1D(64, kernel_size=1, activation='relu')(decoded)
decoded = Conv1D(1, kernel_size=1, activation='sigmoid', name='dense_output')(decoded)

encoded = Flatten()(encoded)
second_output = Dense(1, activation='linear', name='second_output')(encoded)

autoencoder = Model(inputs=input_tweet, outputs=[decoded, second_output])
autoencoder.compile(optimizer='adam', loss='mse')

plot_model(autoencoder, show_shapes=True)
autoencoder.fit(X_train, {'dense_output': X_train, 'second_output': y_train}, epochs=10, batch_size=32)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...