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

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

ただいまの
回答率

90.51%

  • Python

    10780questions

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

  • Python 3.x

    8901questions

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

  • TensorFlow

    863questions

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

受付中

回答 0

投稿 編集

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

yusukee345

score 23

失礼します。
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ばかり表示されてしまい、全く改善せず。
・元々、256*256の画像でやってみてうまくいかないと考えて、28*28に圧縮してやってみたが全く改善しなかった。よって、画像サイズの問題ではなく、ナットワーク設計そのものに問題があると考えられる。
・もちろんサンプルコードより大きなepoch数(100程度)で試したが結果は変わらず。

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

  • Python

    10780questions

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

  • Python 3.x

    8901questions

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

  • TensorFlow

    863questions