2017-07-11 7 views
0

私は基本的なニューラルネットワーク分類子に取り組んでいます。目標は、3ラベルのデータグループに基づいてNNを訓練し、次に値を予測することです。データ図は次のとおりです。enter image description here基本的なロジスティッククラシファイアのSoftmax

私のコードは、ガベージの回答を返します。助言がありますか?

現在のコードは以下の通りです:

import tensorflow as tf 
import numpy as np 

#increased the number of epoch 
epochs = 100000 
# For eq100tion y = b + 0.1, sample data below 
myImportedDatax1_np = np.array([[.1],[.1],[.2],[.2],[.3],[.3],[.4],[.4],[.1],[.1],[.2],[.2],],dtype=float) 
myImportedDatax2_np = np.array([[.1],[.2],[.1],[.2],[.3],[.4],[.3],[.4],[.3],[.4],[.3],[.4]],dtype=float) 
combined_Imported_Data_x = np.append(myImportedDatax1_np, myImportedDatax2_np, axis=1) 
myImportedDatay_np = np.array([0,0,0,0,1,1,1,1,2,2,2,2],dtype=int) 

number_unique_labels = myImportedDatay_np.max()+1 
myImportedDatay_np_one_hot = np.zeros((myImportedDatay_np.size, number_unique_labels)) 

myImportedDatay_np_one_hot[np.arange(myImportedDatay_np.size),myImportedDatay_np] = 1 

print(myImportedDatay_np_one_hot) 

x = tf.placeholder(tf.float32, [None, 2], name='x') 

y_true = tf.placeholder(tf.float32, [None, number_unique_labels], name='y_true') 

nodes_Hidden_Layer_1 = 6 
number_Inputs = 2 
number_Outputs = 3 

W1 = tf.Variable(tf.random_normal([number_Inputs, nodes_Hidden_Layer_1], stddev=0.03), name='W1') 
b1 = tf.Variable(tf.random_normal([nodes_Hidden_Layer_1]), name='b1') 
W2 = tf.Variable(tf.random_normal([nodes_Hidden_Layer_1, number_Outputs], stddev=0.03), name='W2') 
b2 = tf.Variable(tf.random_normal([number_Outputs]), name='b2') 

hidden_out = tf.add(tf.matmul(x, W1), b1) 
hidden_out = tf.nn.relu(hidden_out) 

y_ = (tf.add(tf.matmul(hidden_out, W2), b2)) 

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_)) 

optimiser = tf.train.GradientDescentOptimizer(0.7).minimize(cost) 

init_op = tf.global_variables_initializer() 

with tf.Session() as sess: 
    # initialise the variables 
    sess.run(init_op) 
    for epoch in range(epochs): 
     _, cost_now = sess.run([optimiser, cost], {x: combined_Imported_Data_x, y_true: myImportedDatay_np_one_hot}) 
    print("Predicted values are:") 
    print(sess.run(y_, {x: combined_Imported_Data_x})) 
+0

あなたは 'ロジスティック分類器'を作成したいと思っていますが、代わりに線形回帰をしているようです。特に必要なものはどれですか?それが本当に分類子であれば、なぜ非バイナリ値で1つの出力しか持たないのですか? 3点の出力を持ち、真のラベルを0,1,2とし、それらをワンホットベクトルに変換し、SoftMax + Cross Entropyを使用してモデルを訓練する方が理にかなっていませんか? –

+0

大丈夫、あなたの意見が分かります。 –

+0

私はコードを従来のロジスティック分類器に変更しました。しかし、私はsoftmaxを使って正解を得ていません。助言がありますか? –

答えて

1

ので、一言で言えば、どのようなコードから行方不明になったことは以下の通りです:

  • あなたがy_を印刷しようとしている最後に、それはあなたが簡単に解釈することができないあなたのニューロン から生まれていないので、それはごみのように見えますが、本質的には正しいです。

  • 生の出力をsoftmaxで渡す必要があります。これを確率として解釈できるものにスカッシュします。あなたのコードはtf.nn.softmax_cross_entropy_with_logitsへの呼び出しでsoftmaxに通していますが、グラフの別の枝に終わります。これは自分の目で印刷しているものではありません。TFはcost計算のためにそれを取得しますが、それを参照してください

  • したがって、生の出力をsoftmaxで別々に実行し、その出力のargmaxを取ります。 Argmaxは入力の中で最大の要素のインデックスを提供します。したがって、基本的にあなたが探しているクラスです。最終的には、あなたが予測した価値として見なければならないものです。

  • あなたの予測の出力を印刷する場合は、ステップバイステップで、あなたはそれが200回目の繰り返しの周りに行う必要がある 何(本質的記憶)ネットワーク「学習」ことがわかります(10万 エポックのためにとても必要はありません!) 。しかし、これは些細な問題 であり、データセットのバリエーションはないので、あなたの悪い6 ニューロンでも、ネットワークは基本的に何をする必要があるかを記憶しています。 しかし、これはあなたにそれがどのように学ぶのかを示す大きな図を与えます。

他のものは慎重程度を念頭に置いておくとされるように:

  1. tf.one_hot()機能があり、ものを行うためにその必要はありませんが、手動で
  2. 0.7のあなたの学習率は、一般的に高すぎます。この問題では問題ないと思われますが、オプティマイザは にジャンプし、その速度であまりにも多くのことを心に留めておきます。

私はあなたのコードにちょっとした調整を加えました。それはそれがどのように見えるかです。私はこれがOKであるべきだと思う:

import tensorflow as tf 
import numpy as np 

#increased the number of epoch 
epochs = 1000 
step = 5 
# For eq100tion y = b + 0.1, sample data below 
myImportedDatax1_np = np.array([[.1],[.1],[.2],[.2],[.3],[.3],[.4],[.4],[.1],[.1],[.2],[.2],],dtype=float) 
myImportedDatax2_np = np.array([[.1],[.2],[.1],[.2],[.3],[.4],[.3],[.4],[.3],[.4],[.3],[.4]],dtype=float) 
combined_Imported_Data_x = np.append(myImportedDatax1_np, myImportedDatax2_np, axis=1) 
myImportedDatay_np = np.array([0,0,0,0,1,1,1,1,2,2,2,2],dtype=int) 

number_unique_labels = myImportedDatay_np.max()+1 
myImportedDatay_np_one_hot = np.zeros((myImportedDatay_np.size, number_unique_labels)) 

myImportedDatay_np_one_hot[np.arange(myImportedDatay_np.size),myImportedDatay_np] = 1 

print('x {}\n{}\n*****'.format(combined_Imported_Data_x.shape, combined_Imported_Data_x)) 
print('y {}\n{}\n*****'.format(myImportedDatay_np_one_hot.shape, myImportedDatay_np_one_hot)) 

x = tf.placeholder(tf.float32, [None, 2], name='x') 

y_true = tf.placeholder(tf.float32, [None, number_unique_labels], name='y_true') 

nodes_Hidden_Layer_1 = 6 
number_Inputs = 2 
number_Outputs = 3 

W1 = tf.Variable(tf.random_normal([number_Inputs, nodes_Hidden_Layer_1], stddev=0.03), name='W1') 
b1 = tf.Variable(tf.random_normal([nodes_Hidden_Layer_1]), name='b1') 
W2 = tf.Variable(tf.random_normal([nodes_Hidden_Layer_1, number_Outputs], stddev=0.03), name='W2') 
b2 = tf.Variable(tf.random_normal([number_Outputs]), name='b2') 

hidden_out = tf.add(tf.matmul(x, W1), b1) 
hidden_out = tf.nn.relu(hidden_out) 

y_ = (tf.add(tf.matmul(hidden_out, W2), b2)) 
ys = tf.nn.softmax(y_, name='ys') 
pred = tf.argmax(ys, axis=1) 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_)) 

optimiser = tf.train.GradientDescentOptimizer(0.7).minimize(cost) 

init_op = tf.global_variables_initializer() 

with tf.Session() as sess: 
    # initialise the variables 
    sess.run(init_op) 
    for epoch in range(epochs): 
     _, cost_now, p = sess.run([optimiser, cost, pred], {x: combined_Imported_Data_x, y_true: myImportedDatay_np_one_hot}) 
     if epoch % step == 0: 
      print('Step {}, Predictions: {}'.format(epoch, p)) 
+0

あなたの答えにどれくらい感謝しているかは分かりません。主な問題は、基本的なNN方程式(私はシグモイドに基づいて慎重に研究しました!!)ではなく、テンソルフローをブラックボックスとして見ていることです。愚かな気分だが、少なくとも啓発されている。 –