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

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

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

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

Q&A

1回答

190閲覧

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

knght

総合スコア14

Python

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

0グッド

0クリップ

投稿2018/06/29 15:00

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

TensorFlow

1def Autoencoder(inp, w_enc, b_enc, input_n, hidden_n): 2 w_dec = tf.Variable(tf.random_normal([hidden_n, input_n], mean=0.0, stddev=0.05)) 3 b_dec = tf.Variable(tf.zeros([input_n])) 4 encoded = tf.nn.sigmoid(tf.matmul(inp, w_enc) + b_enc) 5 decoded = tf.nn.sigmoid(tf.matmul(encoded, w_dec) + b_dec) 6 7 cross_entropy = -1. * inp * tf.log(decoded) - (1. - inp) * tf.log(1. - decoded) 8 loss = tf.reduce_mean(cross_entropy) 9 train_step = tf.train.AdagradOptimizer(0.1).minimize(loss) 10 11 init = tf.global_variables_initializer() 12 sess = tf.Session() 13 sess.run(init) 14 15 for epoch in range(epochs): 16 inp_ = inp[np.random.choice(inp.shape[0], 100, replace=False), :] 17 sess.run(train_step, feed_dict={ 18 x: inp_ 19 }) 20 if i % 1000 == 0: 21 train_loss = loss.eval(session=sess, feed_dict={ 22 x: inp 23 }) 24 print('step: {}, loss: {}'.format(i, train_loss)) 25 26 output = tf.nn.sigmoid(tf.matmal(inp, w_enc) + b_enc) 27 28 return w_enc, b_enc, output 29 30 31hidden = [676, 625, 676] 32 33x = tf.placeholder(tf.float32, shape=[None, None]) 34 35weight0 = tf.Variable(tf.random_normal([784, hidden[0]], mean=0.0, stddev=0.05)) 36bias0= tf.Variable(tf.zeros([hidden[0]])) 37weight1 = tf.Variable(tf.random_normal([hidden[0], hidden[1]], mean=0.0, stddev=0.05)) 38bias1 = tf.Variable(tf.zeros([hidden[1]])) 39weight2 = tf.Variable(tf.random_normal([hidden[1], hidden[2]], mean=0.0, stddev=0.05)) 40bias2 = tf.Variable(tf.zeros([hidden[2]])) 41weight3 = tf.Variable(tf.random_normal([hidden[2], 784], mean=0.0, stddev=0.05)) 42bias3 = tf.Variable(tf.zeros([784])) 43 44init = tf.global_variables_initializer() 45sess = tf.Session() 46sess.run(init) 47 48w_0, b_0, output0 = Autoencoder(mnist.train.images, weight0, bias0, 784, hidden[0]) 49w_1, b_1, output1 = Autoencoder(output0, weight1, bias1, hidden[0], hidden[1]) 50w_2, b_2, output2 = Autoencoder(output1, weight2, bias2, hidden[1], hidden[2]) 51w_3, b_3, output3 = Autoencoder(output2, weight3, bias3, hidden[2], hidden[3]) 52w_4, b_4, output4 = Autoencoder(output3, weight4, bias4, hidden[3], hidden[4]) 53w_5, b_5, output5 = Autoencoder(output4, weight5, bias5, hidden[4], 784)

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

TensorFlow

1import tensorflow as tf 2import numpy as np 3from tensorflow.examples.tutorials.mnist import input_data 4import matplotlib.pyplot as plt 5from matplotlib import cm 6mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 7 8n_hidden = 625 9x = tf.placeholder(tf.float32, shape=[None, 784]) 10w_enc = tf.Variable(tf.random_normal([784, n_hidden], mean=0.0, stddev=0.055)) 11b_enc = tf.Variable(tf.zeros([n_hidden])) 12w_dec = tf.Variable(tf.random_normal([n_hidden, 784], mean=0.0, stddev=0.05)) 13b_dec = tf.Variable(tf.zeros([784])) 14 15def AE(w_enc, b_enc, w_dec, b_dec): 16 encoded = tf.nn.sigmoid(tf.matmul(x, w_enc) + b_enc) 17 decoded = tf.nn.sigmoid(tf.matmul(encoded, w_dec) + b_dec) 18 return encoded, decoded 19 20encoded, decoded = AE(w_enc, b_enc, w_dec, b_dec) 21 22cross_entropy = -1. * x * tf.log(decoded) - (1. - x) * tf.log(1. - decoded) 23loss = tf.reduce_mean(cross_entropy) 24train_step = tf.train.AdagradOptimizer(0.1).minimize(loss) 25 26init = tf.global_variables_initializer() 27sess = tf.Session() 28sess.run(init) 29 30for i in range(10001): 31 batch_xs, batch_ys = mnist.train.next_batch(100) 32 sess.run(train_step, feed_dict={ 33 x: batch_xs 34 }) 35 if i % 1000 == 0: 36 train_loss = loss.eval(session=sess, feed_dict={ 37 x: batch_xs 38 }) 39 print('step: {}, loss: {}'.format(i, train_loss)) 40 41decoded_imgs = decoded.eval(session=sess, feed_dict={ 42 x: mnist.test.images 43}) 44print('loss(test) = ', loss.eval(session=sess, feed_dict={ 45 x: mnist.test.images 46})) 47plt.figure(figsize=(4, 40)) 48for i in range(20): 49 plt.subplot(20, 2, i*2+1) 50 plt.imshow(mnist.test.images[i].reshape(28, 28), cmap=cm.gray_r) 51 plt.subplot(20, 2, i*2+2) 52 plt.imshow(decoded_imgs[i].reshape(28, 28), cmap=cm.gray_r) 53plt.show()

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

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

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

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

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

guest

回答1

0

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

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

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

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

投稿2018/07/01 06:00

mkgrei

総合スコア8560

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

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

knght

2018/07/02 07:04

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

2018/07/02 07:39

KerasはTensorflowの上位ラッパーで、普通みんながやるようなことを抽象化し、より少ないコードで、よりバグが起きにくいように、開発することを可能にします。 たとえば、 Kerasなら、 3x3の畳み込み層を入れよう、 とだけ考えればよいのに対して、 Tensorflowでは、 前の層のチャンネルの数と 後続層のチャンネルの数も考慮して、 3x3の畳み込み層を用意して、 パディングの処理をどうしようかも決めなければなりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問