2017-06-30 8 views
0

ここには、3つの入力値と3つの出力値を含む単純なニューラルネットワークがあります。ケラスニューラルネットワークアーキテクチャが正しくない

エラー:私はこのネットワークを実行すると

ValueError: Error when checking model target: expected dense_78 to have shape (None, 3) but got array with shape (3, 1) 

がスローされます。私は正しくこのネットワークを設計さていませんでした

model.add(Dense(3, activation='softmax')) 

、私のミスです:私は、最終的な層は、ラベルの数と一致する3つの可能な出力を持つように設定していますか?

data = ([[ 0.29365378], 
     [ 0.27958957], 
     [ 0.27946938]]) 

labels = [[1], [2], [3]] 

import numpy as np 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation 
from keras.optimizers import SGD 

model.add(Dense(64, activation='relu', input_dim=1)) 
model.add(Dropout(0.5)) 
model.add(Dense(64, activation='relu')) 
model.add(Dropout(0.5)) 
model.add(Dense(3, activation='softmax')) 

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) 
model.compile(loss='categorical_crossentropy', 
       optimizer=sgd, 
       metrics=['accuracy']) 

model.fit(data, labels, 
      epochs=20, 
      batch_size=32) 

答えて

2

Dense(3...)はあなたに3つの出力サンプルあたりを与えるだろう。

Dense(3...)の出力には、形状(BatchSize、3)または(None,3)の形状があります(Keras氏の説明)。

各サンプルに3つのクラスを1つ希望する場合は、labelsのシェイプ(BatchSize、3)が必要です。

  • クラス1 = [1,0,0]
  • クラス2 = [0:どこにあなたのケースでバッチサイズはまた、あなたがone-hotベクトルにラベルをフォーマットする必要があります。3.

    のようです、1,0]

  • クラス3 = [0,0,1]

ワンホットベクトルのクラスに数値クラスを変換するに役立つことができkeras.utilsでto_categorical

次の3つのサンプルを持っている場合は、あなたのようにラベルを持っている必要があります。

labels = [[1,0,0],[0,1,0],[0,0,1]] 

3つのサンプルを、三つの可能なクラスと各サンプル、最初のサンプルクラス1は、第2のサンプルクラス2と第3のサンプルクラス3.

これは、Dense(3...)が要求する(None、3)と一致する形状(3,3)を持ちます。

関連する問題