51594


私は「[詳解
ディープラーニング](https://book.mynavi.jp/ec/products/detail/id=72995)」の本で勉強しています.  
そこで4章でmnistのデータで簡単なニューラルネットワークを作りました.  
本ではkerasのみの実装でtensorflowがなかったのでtensorflowで同じモデルを作ることを試みました.

以下コードです.

[code]

    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)
    
[/code]

本書ではこのモデルで87%の正解率を達成できているのですが,  
上記のコードでは65%程度です.

ご教示のほどよろしくお願いいたします.


CC BY-SA 4.0
2018-12-28T03:59:38.300
51570
2018-12-29T01:47:15.430
2018-12-28T16:53:59.807
3060
31609
question
python tensorflow
mnistの分類問題で正答率が低すぎる


僕もこの本を持ち合わせておりまして、コードなど比較してみました。  
1つ目の原因として、データ数が少なすぎるのではないかと考えられます。  
質問者様のコードですと、データ数がN=1000となっていますが、本ではN=10000となっていますね。  
僕も一応N=10000で実装してみましたが、accuracy=0.74くらいまで上がりました。  
もう1つ考えられる原因としては、epoch数ですかね。おそらく、学習回数が少なすぎるのではないかと思います。  
本でもepoch=1000となっていますが、多分5000くらいでやったほうがいいかもしれませんね。機械学習は、コードやデータが同じだとしても、毎回同じepochで同じaccuracyに到達するわけでわありません。なぜかというと、重みの初期値が違うからです。なので、この本の著者は運良くepoch=1000で高い精度になったんですかね笑  
実際、epoch=5000でaccuracy=0.81まで上がりました。  
それか、バッチサイズをもう少し大きくするとかです。機械学習では慣習的に、2^nでバッチサイズを決めることが多いみたいです。それと、N=10000でbatch_szie=100だと少し小さすぎる印象があります。大体batch_size=256、512あたりが妥当ですかね。

この書籍はとっつきやすくわかりやすい構成で書いてありますが、誤植が多いのが玉に瑕です。なので、ある程度の機械学習の構造を理解するくらいがこの本にとってちょうど良いかもしれませんね。  
他にも機械学習に関しての書籍はいっぱいありますし、この本を読んだ後に違う本を読んでみるのも1つの手かもしれませんね。  
現に僕も何冊も読んで、各書籍の良いとこや理解できたとこだけを取っていってます笑


CC BY-SA 4.0
2018-12-29T01:47:15.430
51594
2018-12-29T01:47:15.430
29506
51570
answer