1

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

Спасибо.

UPDATE1: По словам Матиаса Вальденего, комментарий. Вот формы после перестройки 'X' и после onehot кодирования для 'у':

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

Выход:

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

UPDATE2: Еще раз спасибо Матиас Valdenegro. 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) 

ответ

1

Ввод в 1D свертку должен иметь размеры (num_samples, channels, width). Таким образом, это означает, что вам нужно изменить 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]) 
+0

Как вы можете видеть в моем вопросе, я пробовал без изменения y_train. И это также вызывает исключение. – shda

+0

@shda Формы в вашем вопросе не соответствуют тому, что ожидается после изменения формы, уверены ли вы, что они правы? –

+0

Извините, это были формы перед изменением формы. Я уточню свой вопрос. – shda