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

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

ただいまの
回答率

90.32%

  • Python

    9231questions

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

  • TensorFlow

    758questions

オートエンコーダの関数を作ってStackedAEを作りたいが、処理が進まない

受付中

回答 1

投稿

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

knght

score 5

以前Autoencoderを組み、mnistを用いて、784→625→784と次元を圧縮し戻すプログラムを作ったのですが、今度はStackedAEを作りたいと思っています。
次元数を784→676→625→676→784と層を増やし、それぞれの層でAEを用いて重みを決め、その重みを用いて得られた出力を次の層への入力とし、その次の層でも同様にAEを用いて重みを決める…というのを上層まで繰り返していきます。
しかし、私が組んだプログラムでは,Autoencoderの関数に引数を渡すところの部分で処理が長くなり、いつまでたっても終わりません。一行ずつ試してみても、依然作ったシンプルなAEよりも時間がかかっています。
また関数内で、変数の初期化を行うのもなぜかよくわからず、書かないとエラーがでたので入れています。関数内のprintも一向にされず、処理が進んでいるのかも分からない状況です。
改善方法を教えていただけたら幸いです。

def Autoencoder(inp, w_enc, b_enc, input_n, hidden_n):
    w_dec = tf.Variable(tf.random_normal([hidden_n, input_n], mean=0.0, stddev=0.05))
    b_dec = tf.Variable(tf.zeros([input_n]))
    encoded = tf.nn.sigmoid(tf.matmul(inp, w_enc) + b_enc)
    decoded = tf.nn.sigmoid(tf.matmul(encoded, w_dec) + b_dec)

    cross_entropy = -1. * inp * tf.log(decoded) - (1. - inp) * tf.log(1. - decoded)
    loss = tf.reduce_mean(cross_entropy)
    train_step = tf.train.AdagradOptimizer(0.1).minimize(loss)

    init = tf.global_variables_initializer()
    sess = tf.Session()
    sess.run(init)

    for epoch in range(epochs):
        inp_ = inp[np.random.choice(inp.shape[0], 100, replace=False), :]
        sess.run(train_step, feed_dict={
            x: inp_   
        })
    if i % 1000 == 0:
        train_loss = loss.eval(session=sess, feed_dict={ 
            x: inp
         })
        print('step: {}, loss: {}'.format(i, train_loss))

    output = tf.nn.sigmoid(tf.matmal(inp, w_enc) + b_enc)

    return w_enc, b_enc, output


hidden = [676, 625, 676]

x = tf.placeholder(tf.float32, shape=[None, None])

weight0 = tf.Variable(tf.random_normal([784, hidden[0]], mean=0.0, stddev=0.05))
bias0= tf.Variable(tf.zeros([hidden[0]]))
weight1 = tf.Variable(tf.random_normal([hidden[0], hidden[1]], mean=0.0, stddev=0.05))
bias1 = tf.Variable(tf.zeros([hidden[1]]))
weight2 = tf.Variable(tf.random_normal([hidden[1], hidden[2]], mean=0.0, stddev=0.05))
bias2 = tf.Variable(tf.zeros([hidden[2]]))
weight3 = tf.Variable(tf.random_normal([hidden[2], 784], mean=0.0, stddev=0.05))
bias3 = tf.Variable(tf.zeros([784]))

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

w_0, b_0, output0 = Autoencoder(mnist.train.images, weight0, bias0, 784, hidden[0])
w_1, b_1, output1 = Autoencoder(output0, weight1, bias1, hidden[0], hidden[1])
w_2, b_2, output2 = Autoencoder(output1, weight2, bias2, hidden[1], hidden[2])
w_3, b_3, output3 = Autoencoder(output2, weight3, bias3, hidden[2], hidden[3])
w_4, b_4, output4 = Autoencoder(output3, weight4, bias4, hidden[3], hidden[4])
w_5, b_5, output5 = Autoencoder(output4, weight5, bias5, hidden[4], 784)

シンプルなAEのコードも載せておきます。

import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt
from matplotlib import cm
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

n_hidden = 625
x = tf.placeholder(tf.float32, shape=[None, 784])
w_enc = tf.Variable(tf.random_normal([784, n_hidden], mean=0.0, stddev=0.055))
b_enc = tf.Variable(tf.zeros([n_hidden]))
w_dec = tf.Variable(tf.random_normal([n_hidden, 784], mean=0.0, stddev=0.05))
b_dec = tf.Variable(tf.zeros([784]))

def AE(w_enc, b_enc, w_dec, b_dec):
    encoded = tf.nn.sigmoid(tf.matmul(x, w_enc) + b_enc)
    decoded = tf.nn.sigmoid(tf.matmul(encoded, w_dec) + b_dec)
    return encoded, decoded

encoded, decoded = AE(w_enc, b_enc, w_dec, b_dec)

cross_entropy = -1. * x * tf.log(decoded) - (1. - x) * tf.log(1. - decoded)
loss = tf.reduce_mean(cross_entropy)
train_step = tf.train.AdagradOptimizer(0.1).minimize(loss)

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

for i in range(10001):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={
        x: batch_xs
    })
    if i % 1000 == 0:
        train_loss = loss.eval(session=sess, feed_dict={
            x: batch_xs
        })
        print('step: {}, loss: {}'.format(i, train_loss))

decoded_imgs = decoded.eval(session=sess, feed_dict={
    x: mnist.test.images
})
print('loss(test) = ', loss.eval(session=sess, feed_dict={
    x: mnist.test.images
}))
plt.figure(figsize=(4, 40))
for i in range(20):
    plt.subplot(20, 2, i*2+1)
    plt.imshow(mnist.test.images[i].reshape(28, 28), cmap=cm.gray_r)
    plt.subplot(20, 2, i*2+2)
    plt.imshow(decoded_imgs[i].reshape(28, 28), cmap=cm.gray_r)
plt.show()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

https://qiita.com/TomokIshii/items/26b7414bdb3cd3052786

https://datumstudio.jp/blog/tensorflowで積層自己符号化器を用いた事前学習を実装

こういうのをお読みになりました?

コードをうまくまとめれていないように思うので、まずは生のtensorflowではなく、kerasで実装することをオススメします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/07/02 16:04

    すみません、初学者で色々と至っていないのだと思いますが、アドバイスありがとうございます。
    Kerasでの実装が良いということですが、あまりKerasについて知らず…。そちらの方が実装、学ぶには易しいということでしょうか?Kerasで組めるようになればTensorFlowでも理解しやすいということですかね?
    回答ありがとうございます。

    キャンセル

  • 2018/07/02 16:39

    KerasはTensorflowの上位ラッパーで、普通みんながやるようなことを抽象化し、より少ないコードで、よりバグが起きにくいように、開発することを可能にします。

    たとえば、
    Kerasなら、
    3x3の畳み込み層を入れよう、
    とだけ考えればよいのに対して、
    Tensorflowでは、
    前の層のチャンネルの数と
    後続層のチャンネルの数も考慮して、
    3x3の畳み込み層を用意して、
    パディングの処理をどうしようかも決めなければなりません。

    キャンセル

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

  • Python

    9231questions

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

  • TensorFlow

    758questions