У меня проблема с мультиклассовой классификацией. Скажем, у меня есть матрица признаков:
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)
- Является ли этот подход с Convolution1D правильным для достижения моей цели?
- Если № 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)