2017-11-07 19 views
0

私は以下のネットワークを持っていますが、訓練を受けても精度は0.000のままです。私はちょうど2つのサンプルを含めることでそれを簡単にしようとしました。入力はサンプルの1つを除いてすべてゼロです。サンプルの違いは、ゼロの場合、出力は0.3 0.4 0.3、その他の場合は0.4 0.3 0.3(どちらも1になります)です。私はそれが少なくとも2つの訓練サンプルで少なくとも50%の精度とおそらく100%を得ることは容易であると期待します。シンプルニューラルネットワークのテンソルフロートレーニングで精度が向上しない

質問:ネットワークの設定に問題がありますか?そうでない場合は、どのように進めるかに関する提案。これまでのテンソルフローは私にとってはデバッグが容易ではありません。

関連性がある可能性があります:まず、重みとバイアスをゼロに初期化してから0.5精度を得ました。トレーニング後にレイヤーの内容を印刷するとき、アウトレイヤーの重みとバイアスのみが正の値を含みます。

self.session = tf.Session() 
n_hidden_1 = 10 # 1st layer number of neurons 
n_hidden_2 = 10 # 2nd layer number of neurons 
self.num_input = 68 # data values 
self.num_classes = 18 

self.weights = { 
    'h1': tf.Variable(tf.random_normal([self.num_input, n_hidden_1])), 
    'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([n_hidden_2, self.num_classes])) 
} 
self.biases = { 
    'b1': tf.Variable(tf.random_normal([n_hidden_1])), 
    'b2': tf.Variable(tf.random_normal([n_hidden_2])), 
    'out': tf.Variable(tf.random_normal([self.num_classes])) 
} 
self.input = tf.placeholder(dtype=tf.float32, shape = [None, self.num_input]) 
self.output = tf.placeholder(dtype=tf.float32, shape = [None, self.num_classes]) 
layer_1 = tf.nn.relu(tf.add(tf.matmul(self.input, self.weights['h1']), self.biases['b1'])) 
# Hidden fully connected layer with 256 neurons 
layer_2 = tf.nn.relu(tf.add(tf.matmul(layer_1, self.weights['h2']), self.biases['b2'])) 
# Output fully connected layer with a neuron for each class 
self.out_layer = tf.nn.softmax(tf.matmul(layer_2, self.weights['out']) + self.biases['out']) 

self.loss_op = tf.reduce_mean(tf.squared_difference(self.out_layer, self.output)) 
optimizer = tf.train.AdamOptimizer(learning_rate=0.1) 
self.train_op = optimizer.minimize(self.loss_op) 

# Evaluate model 
correct_pred = tf.equal(tf.argmax(self.out_layer, 1), tf.argmax(self.output, 1)) 
self.accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) 
self.session.run(tf.global_variables_initializer()) 

def train(self,train_x,train_y): 
    loss, acc = self.session.run([self.loss_op, self.accuracy], feed_dict={self.input: train_x, self.output: train_y}) 
    self.logger.info("Before training Loss= " + \ 
       "{:.4f}".format(loss) + ", Training Accuracy= " + \ 
       "{:.3f}".format(acc)) 

    self.session.run(self.train_op, feed_dict={self.input: train_x, self.output: train_y}) 
    loss, acc = self.session.run([self.loss_op, self.accuracy], feed_dict={self.input: train_x, self.output: train_y}) 
    self.logger.info("After training Loss= " + \ 
       "{:.4f}".format(loss) + ", Training Accuracy= " + \ 
       "{:.3f}".format(acc)) 
+1

'train(...) 'を1回だけ実行していますか?ループ内で 'session.run(train_op、feed_dict = ...)'を呼び出す必要があります。この呼び出しはパラメータの更新を1回だけ行いますが、これはランダム初期化よりもはるかに優れていません。 –

+0

あなたのコードは、クラスの中にあるかのようにselfを使っているようですが、クラス定義はありません。より完全なコードサンプルを投稿できますか? –

+1

@DavidParks:どのように私はそれを逃した..私はそれを試して、それは素晴らしい働いた!ありがとう!回答としてあなたのコメントを投稿できますか? – cageman

答えて

1

あなたはtrain(...)を1回だけ実行しているようです。ループでsession.run(train_op, feed_dict=...)に電話する必要があります。

この呼び出しはパラメータの更新を1回だけ行いますが、これはランダム初期化よりもはるかに優れていません。

関連する問題