私は以下のネットワークを持っていますが、訓練を受けても精度は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))
'train(...) 'を1回だけ実行していますか?ループ内で 'session.run(train_op、feed_dict = ...)'を呼び出す必要があります。この呼び出しはパラメータの更新を1回だけ行いますが、これはランダム初期化よりもはるかに優れていません。 –
あなたのコードは、クラスの中にあるかのようにselfを使っているようですが、クラス定義はありません。より完全なコードサンプルを投稿できますか? –
@DavidParks:どのように私はそれを逃した..私はそれを試して、それは素晴らしい働いた!ありがとう!回答としてあなたのコメントを投稿できますか? – cageman