Свертка Keras вдоль одной строки признаков

У меня проблема с мультиклассовой классификацией. Скажем, у меня есть матрица признаков:

A   B C D
1  -1 1 -6
2 0.5 0 11
7 3.7 1 1
4 -50 1 0

И этикетки:

LABEL
0
1
2
0
2

Я хочу попытаться применить ядра свертки вдоль каждой отдельной строки функций с помощью Keras. Скажите nb_filter=2 и batch_size=3. Поэтому я ожидаю, что входная форма для слоя свертки будет (3, 4), а выходная форма будет (3, 3) (как это применяется для AB, BC, CD).

Вот что я пробовал с Keras (v1.2.1, бэкэнд Theano):

def CreateModel(input_dim, num_hidden_layers):
    from keras.models import Sequential
    from keras.layers import Dense, Dropout, Convolution1D, Flatten

    model = Sequential()
    model.add(Convolution1D(nb_filter=10, filter_length=1, input_shape=(1, input_dim), activation='relu'))
    model.add(Dense(3, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam')
    model.summary()
    return model

def OneHotTransformation(y):
    from keras.utils import np_utils
    return np_utils.to_categorical(y)

X_train = X_train.values.reshape(X_train.shape[0], 1, X_train.shape[1])
X_test = X_test.values.reshape(X_test.shape[0], 1, X_test.shape[1]),
y_train = OneHotTransformation(y_train)

clf = KerasClassifier(build_fn=CreateModel, input_dim=X_train.shape[1], num_hidden_layers=1, nb_epoch=10, batch_size=500)

clf.fit(X_train, y_train)

Формы:

print X_train.shape
print X_test.shape
print y_train.shape

Выход:

(45561, 44)
(11391, 44)
(45561L,)

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

ValueError: Error when checking model target: expected dense_1 to have 3 dimensions, but got array with shape (45561L, 3L)

Я попытался изменить форму y_train:

y_train = y_train.reshape(y_train.shape[0], 1, y_train.shape[1])

Это дает мне исключение:

ValueError: Error when checking model target: expected dense_1 to have 3 dimensions, but got array with shape (136683L, 2L)
  1. Является ли этот подход с Convolution1D правильным для достижения моей цели?
  2. Если № 1 да, как я могу исправить свой код?

Я уже прочитал множество проблем с github и несколько вопросов (1, 2) здесь, но это не особо помогло.

Спасибо.

ОБНОВЛЕНИЕ 1: согласно комментарию Матиаса Вальденегро. Вот фигуры после изменения формы «X» и после горячего кодирования для «y»:

print X_train.shape
print X_test.shape
print y_train.shape

Выход:

(45561L, 1L, 44L)
(11391L, 1L, 44L)
(45561L, 3L)

ОБНОВЛЕНИЕ 2: еще раз спасибо Матиасу Вальденегро. Изменение формы X выполняется после создания модели, чтобы убедиться, что это проблема копирования и вставки. Код должен выглядеть так:

def CreateModel(input_dim, num_hidden_layers):
    from keras.models import Sequential
    from keras.layers import Dense, Dropout, Convolution1D, Flatten

    model = Sequential()
    model.add(Convolution1D(nb_filter=10, filter_length=1, input_shape=(1, input_dim), activation='relu'))
    model.add(Dense(3, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam')
    model.summary()
    return model

def OneHotTransformation(y):
    from keras.utils import np_utils
    return np_utils.to_categorical(y)

clf = KerasClassifier(build_fn=CreateModel, input_dim=X_train.shape[1], num_hidden_layers=1, nb_epoch=10, batch_size=500)

X_train = X_train.values.reshape(X_train.shape[0], 1, X_train.shape[1])
X_test = X_test.values.reshape(X_test.shape[0], 1, X_test.shape[1]),
y_train = OneHotTransformation(y_train)

clf.fit(X_train, y_train)

person shda    schedule 31.01.2017    source источник


Ответы (1)


Входные данные для одномерной свертки должны иметь размеры (количество выборок, каналы, ширина). Это означает, что вам нужно изменить X_train и X_test, а не y_train:

X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
X_test = X_test.reshape(X_test.shape[0], 1, X_test.shape[1])
person Dr. Snoopy    schedule 01.02.2017
comment
Как вы можете видеть в моем вопросе, я пытался не изменять форму y_train. И это также вызывает исключение. - person shda; 01.02.2017
comment
@shda Формы в вашем вопросе не соответствуют ожидаемым после изменения формы, вы уверены, что они верны? - person Dr. Snoopy; 01.02.2017
comment
Извините, это были формы до изменения формы. Я обновлю свой вопрос. - person shda; 01.02.2017
comment
@shda Убедитесь, что размер ввода правильный, это должно быть (1, 44). - person Dr. Snoopy; 01.02.2017
comment
Где я должен это проверить? input_dim variale в CreateModel равен 44 во время выполнения. Таким образом, input_shape для Convolution1D равен (1, 44). - person shda; 01.02.2017
comment
@shda Внутри CreateModel из кода, который сейчас находится в вопросе, вы передаете X_train.shape[1], который после изменения формы равен 1. Также я считаю, что длина фильтра не должна быть 1, попробуйте с 2. - person Dr. Snoopy; 01.02.2017
comment
Изменение формы выполняется после создания модели. Это была проблема с копипастом. Спасибо. Также я пробовал с filter_length=2. Без изменений. Возникает такое же исключение: ValueError: Ошибка при проверке цели модели: ожидается, что плотности_1 будут иметь 3 измерения, но получен массив с формой (45561L, 3L) - person shda; 01.02.2017