Я пытаюсь присвоить аудио одному из двух классов (положительный / отрицательный), используя CNN с Keras. Моя модель должна принимать различные длины ввода (кадры), в которых каждый кадр содержит 41 объект, но я борюсь с размером ввода. Имейте в виду, что я не получил полный набор данных, поэтому я просто высмеял некоторые бессмысленные данные, просто чтобы проверить, работает ли сеть вообще.
Согласно документации https://keras.io/layers/convolutional/ и, насколько я понимаю, Conv1D может работать с различными длинами, если первый элемент кортежа input_shape
равен None
. Форма переменной, содержащей входные данные X_train.shape
, равна (4, 497, 41)
.
data = pd.read_csv('output_file.csv', sep=';')
featureCount = data.values.shape[1]
#mocks because full data is not available yet
Y_train = np.asarray([1, 0, 1, 0])
X_train = np.asarray(
[np.array(data.values, copy=True), np.array(data.values, copy=True), np.array(data.values, copy=True),
np.array(data.values, copy=True)])
# variable length with 41 features
model = keras.models.Sequential()
model.add(keras.layers.Conv1D(100, 5, activation='relu', input_shape=(None, featureCount)))
model.add(keras.layers.GlobalMaxPooling1D())
model.add(keras.layers.Dense(10, activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
model.summary()
model.fit(X_train, Y_train, epochs=10, verbose=False, validation_data=(np.array(data.values, copy=True), [1]))
Этот код выдает ошибку
ValueError: Error when checking input: expected conv1d_input to have 3 dimensions, but got array with shape (497, 41)
. Таким образом, кажется, что первое измерение было вырезано, так как оно содержит обучающие образцы (мне кажется, это правильно), что беспокоило меня - требуемая размерность, почему это 3?
После поиска ответа я наткнулся на Измерение формы в conv1D и последовал за ним, добавив последнее измерение (используя X_train = np.expand_dims(X_train, axis=3)
), которое содержит только одну цифру, но я закончил с другой, похожей ошибкой:
ValueError: Error when checking input: expected conv1d_input to have 3 dimensions, but got array with shape (4, 497, 41, 1)
теперь кажется, что первое измерение, которое ранее рассматривалось как примерный «список», теперь является частью фактических данных.
Я также пытался поиграться с параметром input_shape
, но безрезультатно и использовал слой Reshape
, но в итоге боролся с размером
Что я должен сделать, чтобы удовлетворить требуемую форму? Как подготовить данные для обработки?