質問

TensorflowでMLPを実装する方法についてオンラインで多くのリソースがあり、ほとんどのサンプルは機能します:)しかし、私は特定のものに興味があります。 https://www.coursera.org/learn/machine-learning. 。その中で、それはaを使用します 費用 次のように定義された関数:

$ j( theta)= frac {1} {m} sum_ {i = 1}^{m} sum_ {k = 1}^{k} left [-y_k^{(i)} log log ((h_ theta(x^{(i)}}))_ k - (1 -y_k^{(i)}) log(1-(h_ theta(x^{(i)}))_ k right ] $

$ h_ theta $はです シグモイド 働き。

そして、私の実装があります:

# one hidden layer MLP

x = tf.placeholder(tf.float32, shape=[None, 784])
y = tf.placeholder(tf.float32, shape=[None, 10])

W_h1 = tf.Variable(tf.random_normal([784, 512]))
h1 = tf.nn.sigmoid(tf.matmul(x, W_h1))

W_out = tf.Variable(tf.random_normal([512, 10]))
y_ = tf.matmul(h1, W_out)

# cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(y_, y)
cross_entropy = tf.reduce_sum(- y * tf.log(y_) - (1 - y) * tf.log(1 - y_), 1)
loss = tf.reduce_mean(cross_entropy)
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(loss)

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# train
with tf.Session() as s:
    s.run(tf.initialize_all_variables())

    for i in range(10000):
        batch_x, batch_y = mnist.train.next_batch(100)
        s.run(train_step, feed_dict={x: batch_x, y: batch_y})

        if i % 100 == 0:
            train_accuracy = accuracy.eval(feed_dict={x: batch_x, y: batch_y})
            print('step {0}, training accuracy {1}'.format(i, train_accuracy))

レイヤーの定義は正しいと思いますが、問題は Cross_Entropy. 。最初のものを使用する場合、 コメントアウトされました, 、モデルは迅速に収束します。 しかし、2番目のものを使用すると、以前の方程式の翻訳であると思う/希望する場合、モデルは収束しません。

役に立ちましたか?

解決

あなたは3つの間違いを犯しました:

  1. 非線形変換の前にオフセット項を省略しました(変数B_1およびB_OUT)。これにより、ニューラルネットワークの代表的な力が向上します。
  2. 最上層のソフトマックス変換を省略しました。これにより、出力が確率分布になるため、分類の通常のコスト関数であるクロスエントロピーを計算できます。
  3. マルチクラスフォームを使用する必要がある場合、クロスエントロピーのバイナリ形式を使用しました。

これを実行すると、90%を超える精度が得られます。

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets('/tmp/MNIST_data', one_hot=True)

x = tf.placeholder(tf.float32, shape=[None, 784])
y = tf.placeholder(tf.float32, shape=[None, 10])

W_h1 = tf.Variable(tf.random_normal([784, 512]))
b_1 = tf.Variable(tf.random_normal([512]))
h1 = tf.nn.sigmoid(tf.matmul(x, W_h1) + b_1)

W_out = tf.Variable(tf.random_normal([512, 10]))
b_out = tf.Variable(tf.random_normal([10]))
y_ = tf.nn.softmax(tf.matmul(h1, W_out) + b_out)

# cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(y_, y)
cross_entropy = tf.reduce_sum(- y * tf.log(y_), 1)
loss = tf.reduce_mean(cross_entropy)
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(loss)

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# train
with tf.Session() as s:
    s.run(tf.initialize_all_variables())

    for i in range(10000):
        batch_x, batch_y = mnist.train.next_batch(100)
        s.run(train_step, feed_dict={x: batch_x, y: batch_y})

        if i % 1000 == 0:
            train_accuracy = accuracy.eval(feed_dict={x: batch_x, y: batch_y})
            print('step {0}, training accuracy {1}'.format(i, train_accuracy))
ライセンス: CC-BY-SA帰属
所属していません datascience.stackexchange
scroll top