2016-08-30 14 views
5

フィードフォワードニューラルネットワークを実装しようとしました。ケラスニューラルネットワークはすべての入力に対して同じ結果を出力します

構造: 入力層:8ニューロン、隠れ層:8ニューロンおよび出力層:8ニューロン。

入力データは8ビット(入力層の各ニューロンごとに1ビット)のベクトルです。 ニューラルネットワークの出力も8ビットのベクトルです。したがって、データセットには合計256の例があります。

例:X = [0.0、1.0、0.0、0.0、1.0、1.0、0.0、1.0]

与えられた場合、出力は、1.0、0.0、0.0、0.0、0.0、1.0 [= Yでなければなりませんこれは私が出力に得るものです

from keras.models import Sequential 
from keras.layers import Dense 
import numpy as np 
import random 
from math import ceil 

#Dimension of layers 
dim = 8 

#Generate dataset 
X = [] 
for i in range(0,2**dim): 
    n = [float(x) for x in bin(i)[2:]] 
    X.append([0.]*(dim-len(n))+n) 
y = X[:] 
random.shuffle(y) 
X = np.array(X) 
y = np.array(y) 

# create model 
model = Sequential() 
model.add(Dense(dim, input_dim=dim, init='normal', activation='sigmoid')) 
model.add(Dense(dim, init='normal', activation='sigmoid')) 
model.add(Dense(dim, init='normal', activation='sigmoid')) 

# Compile model 
model.compile(loss='mse', optimizer='SGD', metrics=['accuracy']) 
# Fit the model 
model.fit(X, y, nb_epoch=1000, batch_size=50, verbose=0) 
# evaluate the model 
scores = model.evaluate(X, y) 
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) 
output = model.predict(X) 

#Make the output binary 
for i in range(0, output[:,0].size): 
    for j in range(0, output[0].size): 
     if output[i][j] > 0.5 or output[i][j] == 0.5: 
      output[i][j] = 1 
     else: 
      output[i][j] = 0 
print(output) 

:0.0は、1.0]

これが実装され

acc: 50.39% 
[[ 1. 0. 0. ..., 0. 1. 1.] 
[ 1. 0. 0. ..., 0. 1. 1.] 
[ 1. 0. 0. ..., 0. 1. 1.] 
..., 
[ 1. 0. 0. ..., 0. 1. 1.] 
[ 1. 0. 0. ..., 0. 1. 1.] 
[ 1. 0. 0. ..., 0. 1. 1.]] 

それはと思われるアルl出力は同じ値を持ちます。だから私は設定の何が間違っているのかわかりません。私はこれを試みましたCannot train a neural network in keras - stackoverflow出力層でアクティベーション関数を削除することを示唆しましたが、これを実行すると、この値ですべての出力ベクトルを取得します。 ]

どのように動作させるかについての洞察はありますか?

+1

これを何回再実行しようとしましたか?多分別のオプティマイザや正規化/ランダム化アルゴリズムを使用すると役に立つかもしれません。あなたのネットワークはローカルのミニマについているようです。 –

+0

私は15回のようにそれを再実行しようとし、同じ結果を得ました。私は "アダム"を使ってみましたが、 "relu"アクティベーションを試してみましたが、少しばかげてしまいました。 –

+0

例を使用しようとしましたか?脱落?またはバッチ正規化? –

答えて

5

出力は私が推薦するマルチラベル分類に比較的似ています

  1. 変更損失関数を
  2. はシグモイドとして最後の活性層を保持し、他の人を変更binary_crossentropyする - reluは良いことができます選択。
  3. あなたの電話を「適合」と冗長性を高めるに検証を追加 - これはあなたが理解できるようになりますどのようにあなたのネットワークの変更エポックを通って、その上/下には、あなたが
  4. をオーバーフィットするまで
  5. がネットワークに奥行きを追加収まる場合は特にあなたは4 + 5
2

  • 繰り返しをオーバーフィットしていないまで、私は非常に同じ問題を抱えていたネットワークに正則を追加します。

    SGDの学習率を下げることをお勧めします。私の場合、Adam Optimizerをlr = 0.001で使用しましたが、0.0001に変更すると問題が解決しました。

    SGDため

    デフォルトのパラメータは次のとおりです。

    SGD = SGD(LR = 0.01、減衰= 1E-6、勢い= 0.9、ネステロフ=真)

  • 1

    あなたは上記のすべてをしようとした場合それがうまくいかない場合は、ノイズにぴったり合うように を意味します。入力と出力の間には関連性/関連性はありません。

    関連する問題