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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2212閲覧

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

yusukee345

総合スコア31

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/11/22 06:18

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

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

お騒がせしました。

投稿2018/11/22 10:00

yusukee345

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

投稿2018/11/22 07:27

ko.tu

総合スコア178

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yusukee345

2018/11/22 07:50

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問