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

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

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

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

Q&A

解決済

2回答

290閲覧

関数にすると出力結果が変わってしまう原因について

trafalbad

総合スコア303

Python

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

0グッド

0クリップ

投稿2017/07/12 11:40

DCGANでGeneratorを実装したのですが、関数を定義しないで書いたものと関数を定義したものでは出力結果が違ってしまいます。
関数を定義しないものでは<tf.Tensor 'Tanh_18:0' shape=(100, 64, 64, 3) dtype=float32>

ですが
関数を定義すると

<tf.Tensor 'Tanh_9:0' shape=(100, 8, 8, 256),dtype=float32>

と出力結果が違うのはなぜのでしょうか?

関数を定義しないもの

inputs = tf.random_uniform([100, 3], minval=-1.0, maxval=1.0) depths = [512, 256, 128, 64, 3] i_depth = depths[0:4] o_depth = depths[1:5] w0 = weight_variable([3, i_depth[0] * 4 * 4]) b0 = bias_variable([i_depth[0]]) dc0 = tf.nn.bias_add(tf.reshape(tf.matmul(inputs, w0), [-1, 4, 4, i_depth[0]]), b0) mean0, variance0 = tf.nn.moments(dc0, [0, 1, 2]) bn0 = tf.nn.batch_normalization(dc0, mean0, variance0, None, None, 1e-5) out = tf.nn.relu(bn0) #shape=(100, 4, 4, 512) # deconvolution layers for i in range(4): w = weight_variable([5, 5, o_depth[i], i_depth[i]]) b = bias_variable([o_depth[i]]) dc = tf.nn.conv2d_transpose(out, w, [100, 4 * 2 ** (i + 1), 4 * 2 ** (i + 1), o_depth[i]], [1, 2, 2, 1]) out = tf.nn.bias_add(dc, b) if i < 3: mean, variance = tf.nn.moments(out, [0, 1, 2]) out = tf.nn.relu(tf.nn.batch_normalization(out, mean, variance, None, None, 1e-5)) tf.nn.tanh(out) tf.nn.tanh(out) <tf.Tensor 'Tanh_18:0' shape=(100, 64, 64, 3) dtype=float32>

関数を定義したもの

def inference(inputs): depths = [512, 256, 128, 64, 3] i_depth = depths[0:4] o_depth = depths[1:5] w0 = weight_variable([3, i_depth[0] * 4 * 4]) b0 = bias_variable([i_depth[0]]) dc0 = tf.nn.bias_add(tf.reshape(tf.matmul(inputs, w0), [-1, 4, 4, i_depth[0]]), b0) mean0, variance0 = tf.nn.moments(dc0, [0, 1, 2]) bn0 = tf.nn.batch_normalization(dc0, mean0, variance0, None, None, 1e-5) out = tf.nn.relu(bn0) # deconvolution layers for i in range(4): w = weight_variable([5, 5, o_depth[i], i_depth[i]]) b = bias_variable([o_depth[i]]) dc = tf.nn.conv2d_transpose(out, w, [100, 4 * 2 ** (i + 1), 4 * 2 ** (i + 1), o_depth[i]], [1, 2, 2, 1]) out = tf.nn.bias_add(dc, b) if i < 3: mean, variance = tf.nn.moments(out, [0, 1, 2]) out = tf.nn.relu(tf.nn.batch_normalization(out, mean, variance, None, None, 1e-5)) return tf.nn.tanh(out) g= tf.placeholder(tf.float32, [None, 3]) inference(g) <tf.Tensor 'Tanh_9:0' shape=(100, 8, 8, 256) dtype=float32>

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

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

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

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

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

guest

回答2

0

ベストアンサー

関数の方は

python

1for i in range(4): 2 if i < 3 3 ... 4 return tf.nn.tanh(out)

となっていますが,

python

1for i in range(4): 2 if i < 3 3 ... 4 tf.nn.tanh(out) 5 6return tf.nn.tanh(out)

ではないでしょうか

投稿2017/07/12 12:33

what_alnk

総合スコア147

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

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

trafalbad

2017/07/12 13:38

インデントが違っていただけでした。ご教授ありがとうございました
guest

0

関数を定義したもの

for i in range(4): w = weight_variable([5, 5, o_depth[i], i_depth[i]]) b = bias_variable([o_depth[i]]) dc = tf.nn.conv2d_transpose(out, w, [100, 4 * 2 ** (i + 1), 4 * 2 ** (i + 1), o_depth[i]], [1, 2, 2, 1]) out = tf.nn.bias_add(dc, b) if i < 3: mean, variance = tf.nn.moments(out, [0, 1, 2]) out = tf.nn.relu(tf.nn.batch_normalization(out, mean, variance, None, None, 1e-5)) return tf.nn.tanh(out)

forの1周目、iが0の時点でreturnで関数を抜けてしまっています。

なので単純に処理が違うから結果が違うだけです。

ところで、
関数を定義しないもの

for i in range(4): w = weight_variable([5, 5, o_depth[i], i_depth[i]]) b = bias_variable([o_depth[i]]) dc = tf.nn.conv2d_transpose(out, w, [100, 4 * 2 ** (i + 1), 4 * 2 ** (i + 1), o_depth[i]], [1, 2, 2, 1]) out = tf.nn.bias_add(dc, b) if i < 3: mean, variance = tf.nn.moments(out, [0, 1, 2]) out = tf.nn.relu(tf.nn.batch_normalization(out, mean, variance, None, None, 1e-5)) tf.nn.tanh(out)

この最後の tf.nn.tanh(out) はただ作っただけで捨てられていますね。ネットワークに含まれてません。


追加
「インデントが違っていただけ」なわけないじゃないですか。結果のネットワークは別のものになってますよね。

でも一晩経ってやっと思いつきました。

関数を定義したもの(インデントの修正)

for i in range(4): w = weight_variable([5, 5, o_depth[i], i_depth[i]]) b = bias_variable([o_depth[i]]) dc = tf.nn.conv2d_transpose(out, w, [100, 4 * 2 ** (i + 1), 4 * 2 ** (i + 1), o_depth[i]], [1, 2, 2, 1]) out = tf.nn.bias_add(dc, b) if i < 3: mean, variance = tf.nn.moments(out, [0, 1, 2]) out = tf.nn.relu(tf.nn.batch_normalization(out, mean, variance, None, None, 1e-5)) return tf.nn.tanh(out)

関数を定義しないもの(最後の代入忘れの修正)

for i in range(4): w = weight_variable([5, 5, o_depth[i], i_depth[i]]) b = bias_variable([o_depth[i]]) dc = tf.nn.conv2d_transpose(out, w, [100, 4 * 2 ** (i + 1), 4 * 2 ** (i + 1), o_depth[i]], [1, 2, 2, 1]) out = tf.nn.bias_add(dc, b) if i < 3: mean, variance = tf.nn.moments(out, [0, 1, 2]) out = tf.nn.relu(tf.nn.batch_normalization(out, mean, variance, None, None, 1e-5)) out = tf.nn.tanh(out)

が正しい(=作ろうとしていた)モデルですか?

投稿2017/07/12 12:39

編集2017/07/12 23:44
quickquip

総合スコア11038

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

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

trafalbad

2017/07/14 06:59

回答ありがとうございます。しかし実際インデントを変更したら出力結果が同じになったので、処理自体は間違っていないようでした。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問