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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

573閲覧

CNN-Autoencoderでlossがnanばかり出て、Accuracyも出ずに困っています。

yusukee345

総合スコア31

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/03/14 09:55

編集2019/03/15 10:54

失礼します。
CNN-Autoencoderを用いた画像分類器を作ろうとしていて、folder1内の28*28画像(460枚)を読み込んでCNN-Autoencoderで学習させて、更にfolder1内の画像を用いてテストした後にテスト画像の復元(decoded)を出力しようとしています。学習を進めていくと以下の様にlossやAccuracyの値が出ません。更には復元画像もほとんど真っ白な画像しか出ず、明らかに学習できていません。

step, loss, accuracy = 1: nan 0.935 step, loss, accuracy = 2: nan 0.935 step, loss, accuracy = 3: nan 0.891 step, loss, accuracy = 4: nan 0.891 step, loss, accuracy = 5: nan 0.913 step, loss, accuracy = 6: nan 0.978 step, loss, accuracy = 7: nan 0.913 step, loss, accuracy = 8: nan 0.935 step, loss, accuracy = 9: nan 0.848 step, loss, accuracy = 10: nan 0.913 step, loss, accuracy = 11: nan 0.935 step, loss, accuracy = 12: nan 0.870 step, loss, accuracy = 13: nan 0.848 step, loss, accuracy = 14: nan 0.913 step, loss, accuracy = 15: nan 0.935 step, loss, accuracy = 16: nan 0.935 step, loss, accuracy = 17: nan 0.913 step, loss, accuracy = 18: nan 0.913 step, loss, accuracy = 19: nan 0.913 step, loss, accuracy = 20: nan 0.826 loss (test) = nan accuracy(test) = 0.9347826

以下のコードを使用しています。
コードはこの方 https://qiita.com/TomokIshii/items/26b7414bdb3cd3052786 のコードを使わせて頂きました。ネットワークの定義はより高レベルに書き換えました(tf.nn.conv2dでなくtf.layers.conv2dを使用)。

cnn_ae.py

import numpy as np import matplotlib as mpl import random mpl.use('Agg') import matplotlib.pyplot as plt import tensorflow as tf import glob from PIL import Image from my_nn_lib import Convolution2D, MaxPooling2D from my_nn_lib import FullConnected, ReadOutLayer image_size = 28 one_layer = 14 two_layer = 7 # Create the model def mk_nn_model(x): # Encoding phase x_image = tf.reshape(x, [-1, image_size, image_size, 1]) conv1 = tf.layers.conv2d(inputs=x_image, filters=16, kernel_size=(3, 3), padding='same', activation=tf.nn.relu) pool1 = tf.layers.max_pooling2d(conv1, pool_size=(2, 2), strides=(2, 2), padding='same') conv2 = tf.layers.conv2d(inputs=pool1, filters=8, kernel_size=(3, 3), padding='same', activation=tf.nn.relu) pool2 = tf.layers.max_pooling2d(conv2, pool_size=(2, 2), strides=(2, 2), padding='same') conv3 = tf.layers.conv2d(pool2, filters=8, kernel_size=(3, 3), padding='same', activation=tf.nn.relu) encoded = tf.layers.max_pooling2d(conv3, pool_size=(2, 2), strides=(2, 2), padding='same') # at this point the representation is (8, 4, 4) i.e. 128-dimensional # Decoding phase upsample1 = tf.image.resize_images(encoded, size=(two_layer, two_layer), method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) conv4 = tf.layers.conv2d(inputs=upsample1, filters=8, kernel_size=(3, 3), padding='same', activation=tf.nn.relu) upsample2 = tf.image.resize_images(conv4, size=(one_layer, one_layer), method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) conv5 = tf.layers.conv2d(inputs=upsample2, filters=8, kernel_size=(3, 3), padding='same', activation=tf.nn.relu) upsample3 = tf.image.resize_images(conv5, size=(image_size, image_size), method=tf.image.ResizeMethod.NEAREST_NEIGHBOR) conv6 = tf.layers.conv2d(inputs=upsample3, filters=16, kernel_size=(3, 3), padding='same', activation=tf.nn.relu) logits = tf.layers.conv2d(inputs=conv6, filters=1, kernel_size=(3, 3), padding='same', activation=None) decoded = tf.nn.sigmoid(logits) decoded = tf.reshape(decoded, [-1, image_size*image_size]) cross_entropy = -1. * x * tf.log(decoded) - (1. - x) * tf.log(1. - decoded) loss = tf.reduce_mean(cross_entropy) prediction_match = tf.equal(tf.argmax(decoded, axis=1), tf.argmax(x, axis=1)) accuracy = tf.reduce_mean(tf.cast(prediction_match, tf.float32), name='accuracy') return loss, decoded, accuracy if __name__ == '__main__': all_files = glob.glob('folder1/*.jpg') filelist = [] for f in all_files: image = Image.open(f) np_image = np.array(image) list_image = np_image.tolist() filelist.append(list_image) print("success") data_number = len(filelist) fileset = np.array(filelist).reshape((data_number, image_size*image_size)) # Variables x = tf.placeholder(tf.float32, (None, image_size*image_size)) learning_rate = 0.001 loss, decoded, accuracy = mk_nn_model(x) train_step = tf.train.AdagradOptimizer(learning_rate).minimize(loss) epochs = 20 batch_size = data_number // 10 init = tf.initialize_all_variables() # Train with tf.Session() as sess: sess.run(init) print('Training...') for i in range(epochs): X = np.random.permutation(fileset) for ii in range(data_number // batch_size): batch = X[ii * batch_size:(ii + 1) * batch_size] train_loss, train_accuracy, _ = sess.run([loss, accuracy, train_step], feed_dict={x: batch}) print(' step, loss, accuracy = %6d: %6.3f %6.3f' % (i+1, train_loss, train_accuracy)) # generate decoded image with test data X = np.random.permutation(fileset) test_image = X[0:batch_size] decoded_imgs, test_loss, test_accuracy = sess.run([decoded, loss, accuracy], feed_dict={x: test_image}) print('loss (test) = ', test_loss) print('accuracy(test) = ', test_accuracy) x_test = test_image n = 10 # how many digits we will display plt.figure(figsize=(20, 4)) for i in range(n): # display original ax = plt.subplot(2, n, i + 1) plt.imshow(x_test[i].reshape(image_size, image_size)) plt.gray() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # display reconstruction ax = plt.subplot(2, n, i + 1 + n) plt.imshow(decoded_imgs[i].reshape(image_size, image_size)) plt.gray() ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) # plt.show() plt.savefig('images.png')

####実行環境
OS Windows10 64bit
プロセッサ Intel(R) Core(TM)i7-8700k CPU @ 3.70GHz
RAM 32.0 GB
Anaconda Prompt

####試したこと
・decoded直前でsigmoidをsoftmaxにした。その結果、nanばかり表示されてしまい、全く改善せず。
・元々、256256の画像でやってみてうまくいかないと考えて、2828に圧縮してやってみたが全く改善しなかった。よって、画像サイズの問題ではなく、ナットワーク設計そのものに問題があると考えられる。
・もちろんサンプルコードより大きなepoch数(100程度)で試したが結果は変わらず。

おそらくネットワーク設計(重みの設定、誤差関数の設定など)を改善するべきなのでしょうが、具体的にどこをどう確かめれば良いのか方向性が掴めません。lossがnanになった途端にaccuracyが1に近づいたので、外れ値(-∞か+∞)がsigmoidを通って、0か1を吐き出したのだろうということくらいしか分かりません。
まだ機械学習をやり始めて経験が浅くどうすればよいか分からない状況ですので、何卒助言頂ければ幸いです。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問