質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.57%

CNNのAccuracyが増加せず減少する

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 847

yusukee345

score 31

Tensorflowでmnistを扱うCNNを実装しているのですが、学習を進めてもAccuracy(正答率)が上がるどころか下がってしまいます。
以下そのコードです。

import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
from sklearn.utils import shuffle
from sklearn.metrics import f1_score
from sklearn.model_selection import train_test_split
import matplotlib.pylab as plt

random_state = 42

x=tf.placeholder(tf.float32, shape=(None,28,28,1))
y=tf.placeholder(tf.float32, shape=(None,10))
t=tf.placeholder(tf.float32, shape=(None,10))

def weight(shape):
    init=tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(init)
def bias(shape):
    init=tf.constant(0.1,shape=shape)
    return tf.Variable(init)
def conv2d(x, w):
    return tf.nn.conv2d(x, w, strides=[1,1,1,1], padding='SAME')
def max_pooling(x):
    return tf.nn.max_pool(x, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')

conv1_w=weight([5,5,1,32])
conv1_b=bias([32])
conv1_y=tf.nn.relu(conv2d(x,conv1_w)+conv1_b)

pool1_y=max_pooling(conv1_y)

conv2_w=weight([5,5,32,64])
conv2_b=bias([64])
conv2_y=tf.nn.relu(conv2d(pool1_y,conv2_w)+conv2_b)

pool2_y=max_pooling(conv2_y)

pool2_y_flat=tf.reshape(pool2_y,[-1,7*7*64])

fc1_w=weight([7*7*64,1024])
fc1_b=bias([1024])
fc1_y=tf.nn.relu(tf.matmul(pool2_y_flat,fc1_w)+fc1_b)

fc2_w=weight([1024,10])
fc2_b=bias([10])
y=tf.nn.relu(tf.matmul(fc1_y,fc2_w)+fc2_b) 

EPOCH=10
batch_size=100
learning_rate=0.0001

cross_entropy=-tf.reduce_sum(t*tf.log(y))
train_step=tf.train.AdamOptimizer(learning_rate).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))

init=tf.global_variables_initializer()

mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)
mnist_X, mnist_y = mnist.train.images, mnist.train.labels
mnist_X = mnist_X.reshape((mnist_X.shape[0], 28, 28, 1))

train_x, test_x, train_y, test_y = train_test_split(mnist_X, mnist_y, test_size=0.1, random_state=42)

train_epochs=[]
ACCURACY=[]
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(EPOCH):
        train_x, train_y=shuffle(train_x, train_y, random_state=random_state)
        for i in range(batch_size):
            start = i * batch_size
            end = start + batch_size
            sess.run(train_step, feed_dict={x:train_x[start:end], t:train_y[start:end]})
            result=sess.run(accuracy, feed_dict={x:test_x,t:test_y})
        print('Epoch:%i Accuracy:%.3f'%(epoch+1,result))
result=sess.run(accuracy, feed_dict={x:test_x,t:test_y})    
print('Accuracy:', result)


学習結果は以下のようになりました。Accuracyが増加していないことがわかります。

train
Epoch:1 Accuracy:0.125
Epoch:2 Accuracy:0.174
Epoch:3 Accuracy:0.126
Epoch:4 Accuracy:0.194
Epoch:5 Accuracy:0.102
Epoch:6 Accuracy:0.102
Epoch:7 Accuracy:0.102
Epoch:8 Accuracy:0.102
Epoch:9 Accuracy:0.102
Epoch:10 Accuracy:0.102
Accuracy: 0.102181815

Accuracyが変化している以上、各層を通って学習されていることは分かりますが、増加していないので、パラメーターの設定方法に問題があるのでしょうか。調べてもよく原因が分からないので何か助言頂ければ幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

2つ目のAffine層後をreluではなくsoftmaxにするとAccuracyが0.98になってくれました。また、batch_sizeを200にしました。

y=tf.nn.relu(tf.matmul(fc1_y,fc2_w)+fc2_b)


y=tf.nn.softmax(tf.matmul(fc1_y,fc2_w)+fc2_b) 
train
Epoch:1 Accuracy:0.922
Epoch:2 Accuracy:0.957
Epoch:3 Accuracy:0.961
Epoch:4 Accuracy:0.972
Epoch:5 Accuracy:0.977
Epoch:6 Accuracy:0.978
Epoch:7 Accuracy:0.979
Epoch:8 Accuracy:0.981
Epoch:9 Accuracy:0.980
Epoch:10 Accuracy:0.980
Accuracy: 0.9803636


お騒がせしました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

正直、TensorFlowは難しい
特にプレースフォルダを使うのは学習コストが高い気がします
googleが出してるので安心感はありますが
それであればTensorFlowにも吸収された
kerasのほうが簡単で良い感じかなと
個人的に思います
また、pytorchもおすすめです

いま、TensorFlowはアップデートを控えているのでその意味でも
時期じゃないのかなと思います

回答になっていなくてすみません(._.)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/22 16:50

    お勧めのご紹介ありがとうございます。
    周囲の人がTensorFlow使っているので、私だけ違うものを使うのには抵抗があるんですよね。
    ネットに転がってた実装コードを漁って、より自分に分かりやすいコードを書こうとしたら明らかにおかしい結果が出て......。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.57%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る