1D CNN керас неправильной формы - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь подогнать 1D CNN к своим данным.Данные состоят из частот MEL и имеют следующие характеристики:

X_train.shape = (68251, 99)
y_train_hot.shape = (68251, 35)<-- one hot encoding with 35 output classes

Когда я пытаюсь обучить модель, я получаю эту ошибку значения для кода ниже:

ValueError: Error when checking input: expected conv1d_5_input to have 3 dimensions, but got array with shape (68251, 99)


#hyperparameters
input_dimension = 68251
learning_rate = 0.0025
momentum = 0.85
hidden_initializer = random_uniform(seed=1)
dropout_rate = 0.2
# create model
model = Sequential()
model.add(Convolution1D(nb_filter=32, filter_length=3, input_shape=X_train.shape, activation='relu'))
model.add(Convolution1D(nb_filter=16, filter_length=1, activation='relu'))
model.add(Flatten())
model.add(Dropout(dropout_rate))
model.add(Dense(128, input_dim=input_dimension, kernel_initializer=hidden_initializer, activation='relu'))
model.add(Dropout(dropout_rate))
model.add(Dense(64, kernel_initializer=hidden_initializer, activation='relu'))
model.add(Dense(2, kernel_initializer=hidden_initializer, activation='softmax'))

sgd = SGD(lr=learning_rate, momentum=momentum)
model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['acc'])
model.fit(X_train, y_train_hot, epochs=5, batch_size=128)
predictions = model.predict_proba(X_test)

ans = pd.DataFrame(predictions)
ans = ans[0]

Икогда я изменяю форму X_train и X_test на (68251, 99, 1) и (17063, 99, 1) соответственно, я получаю следующую ошибку:

ValueError: Input 0 is incompatible with layer conv1d_7: expected ndim=3, found ndim=4

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

РЕДАКТИРОВАТЬ
На самом деле я на этот раз скомпилировал вашу модель, нашел несколько проблем и исправил их:

# create model
model = Sequential()
model.add(Convolution1D(nb_filter=32, filter_length=3, input_shape=(99, 1), activation='relu'))
model.add(Convolution1D(nb_filter=16, filter_length=1, activation='relu'))
model.add(Flatten())
model.add(Dropout(0.2))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(64, activation='relu'))
model.add(Dense(35, activation='softmax'))


model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['acc'])
model.fit(X_train, y_train_hot, epochs=5, batch_size=128)

У вас было 2 и должно быть 35, так как у вас 35 выходных классов, ваш первый Denseне требует input_dim, так как фигура будет выведена предыдущим слоем, а форма ввода была неправильной.
Надеюсь, это поможет

0 голосов
/ 12 декабря 2018

попробуйте изменить

model.add(Convolution1D(nb_filter=32, filter_length=3, input_shape=X_train.shape, activation='relu'))

на

model.add(Convolution1D(nb_filter=32, filter_length=3, input_shape=(99,), activation='relu'))

и передать X_train на fit функцию без изменения формы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...