1

私はマルチクラス分類の問題があります。単一機能行に沿ったKeras畳み込み

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

とラベル:私はKeras各単一機能の行に沿ってコンボリューションカーネルを適用しようとしたい

LABEL 
0 
1 
2 
0 
2 

私は機能行列を持っていると言います。 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がyesの場合、コードを修正するにはどうすればよいですか?

私はすでに数多くのgithubの問題と、ここでいくつかの質問(12を)読んだが、それは本当に助けにはなりませんでした。

ありがとうございました。

UPDATE1: Matias Valdenegroコメントによると、 ここで 'X' を再形成した後と 'Y' のonehot符号化後の形状は以下のとおりです。

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

出力:

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

アップデート2:おかげで再びマティアス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)を持つ必要があります。つまり、あなたはy_trainではなくX_trainとX_testを再形成する必要があります。

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

関連する問題