mnistの分類問題で正答率が低すぎる
私は「詳解 ディープラーニング」の本で勉強しています.
そこで4章でmnistのデータで簡単なニューラルネットワークを作りました.
本ではkerasのみの実装でtensorflowがなかったのでtensorflowで同じモデルを作ることを試みました.
以下コードです.
import numpy as np
import tensorflow as tf
from sklearn.utils import shuffle
from sklearn.model_selection import train_test_split
#70000のデータから10000だけ選ぶ
n = len(mnist.data)
N = 1000
indices = np.random.permutation(range(n))[:N]
X = mnist.data[indices]
y = mnist.target[indices]
Y = np.eye(10)[y.astype(int)]
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, train_size = 0.8)
#モデルの設定
n_in = len(X[0])
n_hidden = 200
n_out = 10
x = tf.placeholder(tf.float32,shape = [None,n_in])
t = tf.placeholder(tf.float32,shape = [None,n_out])
#入力~隠れ層
W = tf.Variable(tf.truncated_normal([n_in,n_hidden]))
b = tf.Variable(tf.zeros([n_hidden]))
h = tf.nn.sigmoid(tf.matmul(x,W) + b)
#隠れ層~出力
V = tf.Variable(tf.truncated_normal([n_hidden,n_out]))
c = tf.Variable(tf.zeros([n_out]))
y = tf.nn.softmax(tf.matmul(h,V)+ c)
cross_entropy = tf.reduce_mean(-tf.reduce_sum(t * tf.log(y),reduction_indices = [1]))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(t,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
epochs = 1000
batch_size = 100
n_batches = epochs // batch_size
#モデルの学習
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for epoch in range(epochs):
X_, Y_ = shuffle(X_train,Y_train)
for i in range(n_batches):
start = batch_size * i
end = start + batch_size
sess.run(train_step, feed_dict = {
x:X_[start:end],
t:Y_[start:end]
})
accuracy_rate = accuracy.eval(session = sess, feed_dict = {
x:X_test,
t:Y_test
})
print(accuracy_rate)
本書ではこのモデルで87%の正解率を達成できているのですが,
上記のコードでは65%程度です.
ご教示のほどよろしくお願いいたします.