Neural network 沿单个特征行的Keras卷积

Neural network 沿单个特征行的Keras卷积,neural-network,theano,keras,conv-neural-network,keras-layer,Neural Network,Theano,Keras,Conv Neural Network,Keras Layer,我有一个多类分类问题。假设我有一个特征矩阵: 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_过滤器=2,批次大小=3。所以我希望卷积层的输入形状是(3,4),输出形状是(3,3)(正如它应用于AB,BC,CD) 下面是我对Keras(v1.2.1,Theano后端)的尝试: 形状: print X_train.shape print

我有一个多类分类问题。假设我有一个特征矩阵:

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_过滤器=2,批次大小=3。所以我希望卷积层的输入形状是(3,4),输出形状是(3,3)(正如它应用于AB,BC,CD)

下面是我对Keras(v1.2.1,Theano后端)的尝试:

形状:

print X_train.shape
print X_test.shape
print y_train.shape
print X_train.shape
print X_test.shape
print y_train.shape
输出:

(45561, 44)
(11391, 44)
(45561L,)
(45561L, 1L, 44L)
(11391L, 1L, 44L)
(45561L, 3L)
当我尝试运行此代码时,会出现以下异常:

ValueError: Error when checking model target: expected dense_1 to have 3 dimensions, but got array with shape (45561L, 3L)
ValueError: Error when checking model target: expected dense_1 to have 3 dimensions, but got array with shape (136683L, 2L)
我试图重塑你的火车:

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 (45561L, 3L)
ValueError: Error when checking model target: expected dense_1 to have 3 dimensions, but got array with shape (136683L, 2L)
  • 使用卷积1d的方法是否正确,以实现我的目标
  • 如果#1为是,我如何修复代码
  • 我已经在这里阅读了很多github问题和一些问题(,),但它没有真正的帮助

    谢谢

    更新1: 根据Matias Valdenegro的评论。 以下是重塑“X”和对“y”进行onehot编码后的形状:

    输出:

    (45561, 44)
    (11391, 44)
    (45561L,)
    
    (45561L, 1L, 44L)
    (11391L, 1L, 44L)
    (45561L, 3L)
    
    更新2:再次感谢Matias 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)
    

    一维卷积的输入应具有维度(num_样本、通道、宽度)。因此,这意味着您需要重塑X_序列和X_测试,而不是y_序列:

    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])
    

    正如你在我的问题中所看到的,我尝试过不改造y_火车。它还抛出异常。@shda您问题中的形状与重塑后的预期不匹配,您确定它们是正确的吗?抱歉,这些是重塑前的形状。我将更新我的问题。@shda确保他输入的dims是正确的,应该是(1,44)。我应该在哪里检查它?CreateModel中的输入变量在运行时等于44。所以卷积1d的输入形状是(1,44)。