2017-09-13 19 views
0

私は10個のRehUアクティベーションとXavier Initializationを使って2つの隠れたレイヤーを持つTensorFlowニューラルネットワークを作成しました。出力層は、入力特徴に基づいてタイタニックの乗客が生き残ったと信じるかどうかを分類するために、シグモイド活性化関数を用いてバイナリ分類(0または1)を出力する1ユニットを有する。TensorFlow:列車とテストセットで常にニューラルネットワークの精度が100%

パラメータ

# Hyperparams 
learning_rate = 0.001 
lay_dims = [10,10, 1] 

# Other params 
m = X_train.shape[1] 
n_x = X_train.shape[0] 
n_y = Y_train.shape[0] 

入力

X = tf.placeholder(tf.float32, shape=[X_train.shape[0], None], name="X") 
norm = tf.nn.l2_normalize(X, 0) # normalize inputs 

Y = tf.placeholder(tf.float32, shape=[Y_train.shape[0], None], name="Y") 

(省略のみコードは、プログラムの後半で使用される変数X_train、Y_train、X_test、Y_testを移入LOAD_DATA関数です)ウェイトの初期化&バイアス

W1 = tf.get_variable("W1", [lay_dims[0],n_x], initializer=tf.contrib.layers.xavier_initializer()) 
b1 = tf.get_variable("b1", [lay_dims[0],1], initializer=tf.zeros_initializer()) 

W2 = tf.get_variable("W2", [lay_dims[1],lay_dims[0]], initializer=tf.contrib.layers.xavier_initializer()) 
b2 = tf.get_variable("b2", [lay_dims[1],1], initializer=tf.zeros_initializer()) 

W3 = tf.get_variable("W3", [lay_dims[2],lay_dims[1]], initializer=tf.contrib.layers.xavier_initializer()) 
b3 = tf.get_variable("b3", [lay_dims[2],1], initializer=tf.zeros_initializer()) 

フォワードプロップ

Z1 = tf.add(tf.matmul(W1,X), b1) 
A1 = tf.nn.relu(Z1) 

Z2 = tf.add(tf.matmul(W2,A1), b2) 
A2 = tf.nn.relu(Z2) 

Y_hat = tf.add(tf.matmul(W3,A2), b3) 

バックプロパゲーション

cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=tf.transpose(Y_hat), labels=tf.transpose(Y))) 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) 

セッション

# Initialize 
init = tf.global_variables_initializer() 

with tf.Session() as sess: 
    # Initialize 
    sess.run(init) 

    # Normalize Inputs 
    sess.run(norm, feed_dict={X:X_train, Y:Y_train}) 

    # Forward/Backprob and update weights 
    for i in range(10000): 
     c, _ = sess.run([cost, optimizer], feed_dict={X:X_train, Y:Y_train}) 
     if i % 100 == 0: 
      print(c) 

    correct_prediction = tf.equal(tf.argmax(Y_hat), tf.argmax(Y)) 

    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) 

    print("Training Set:", sess.run(accuracy, feed_dict={X: X_train, Y: Y_train})) 
    print("Testing Set:", sess.run(accuracy, feed_dict={X: X_test, Y: Y_test})) 

訓練の万のエポックを実行している実行した後、それはlearning_rateがあることを示しているので、コストは毎回ダウンコスト関数が正常に表示されます。しかし、トレーニングの後、私のY_hatの値(トレーニングセットの予測値)はすべて1です(生き残った乗客を予測します)。したがって、基本的には、すべてのトレーニングの例でy = 1が出力されます。

また、Y_hatでtf.argmaxを実行すると、結果はすべて0の行列になります。 tf.argmaxがY(グラウンド・トゥルース・ラベル)に適用されても、Yは訓練例のすべての正しいラベルで構成されているため、同じことが起こっています。

ご協力いただきまして誠にありがとうございます。ありがとう。

+0

私は理解していません "Y_hatから来るデータはすべて1または1に近く、Y_hatとYのargmaxのすべての値をモデル化しますまたは1)0として出てきます。 "文はかなり混乱しています。あなたはそれを言い換えることができますか? – Lan

+0

編集しました。それは良いですか? – IanTimmis

答えて

3

私はあなたのY_hatが(1、m)の行列であると仮定します。mはトレーニングの例です。その後tf.argmax(Y_hat)がtensorflow文書によると、すべて0を与える、テンソルの軸間の最大値でインデックスを返し

をARGMAX。

軸を渡すと軸は0に設定されます。軸0には1つの値しかないため、返されるインデックスは常に0になります。

+0

それは大きな助けです。 argmaxの使用は、さまざまな "one_hot"ラベルを使用してネットワークを評価するためにオンラインで使用されているとわかったすべての精度の例の成果物だと思います。この例では、通常、tf.argmax(foo、1)を使用して、one_hotベクトルでどのラベルが選択されたかを示します – IanTimmis

関連する問題