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

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

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

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

Python

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

Q&A

解決済

1回答

1350閲覧

Tensorflowでmultipyの値が安定しない

WEjpon

総合スコア88

Python 3.x

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

Python

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

0グッド

3クリップ

投稿2017/09/07 01:44

編集2017/09/07 01:46

下記のコードを実行すると、結果が
[9, 9, 3, 0]
になるときと
[9, 0, 3, 0]
になるときがあります。疑問は2つあります。

値が安定しないのはなぜでしょうか。
同じval1を参照しているmul_op4が0なのにmul_op2が0にならないのは違和感がありますが、正しい挙動でしょうか。

Python

1# coding: UTF-8 2from __future__ import absolute_import 3from __future__ import division 4from __future__ import print_function 5 6import tensorflow as tf 7 8var1 = tf.Variable(0) 9const2 = tf.constant(3) 10 11add_op = tf.add(var1, const2) 12 13update_var1 = tf.assign(var1, add_op) 14 15mul_op1 = tf.multiply(add_op, update_var1) 16mul_op2 = tf.multiply(add_op, var1) 17mul_op3 = tf.multiply(add_op, 1) 18mul_op4 = tf.multiply(var1, 1) 19 20with tf.Session() as sess: 21 sess.run(tf.global_variables_initializer()) 22 23 print(sess.run([mul_op1, mul_op2, mul_op3, mul_op4])) 24

実行環境
Windows7 SP1 64bit
Python 3.6.1
Anaconda 4.4.0 (64-bit)
Tensorflow 1.3.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

正しい挙動ですが、意図した挙動ではないでしょう。
変数が1つしかないのに、それが途中で変更されていることから問題が生じています。
ここでの犯人はmul_op1を実行する際のtf.assignですね。

run()の中のリストの各成分について、並列して計算が行われています。
それぞれの成分を計算しようとしたとき、var1の中身が何であるかが問題です。

並列計算と参照・ポインタに関する経験があれば、よく出会うトラブルの1つです。

試しに、以下のコードを実行すれば安定した出力が得られます。
実行するたびにどんな結果が出てくるのかわからないコードを意図していないのであれば、避けるべきコードとなっています。

python

1with tf.Session() as sess: 2 sess.run(tf.global_variables_initializer()) 3 4 print(sess.run([mul_op1])) 5 print(sess.run([mul_op2])) 6 print(sess.run([mul_op3])) 7 print(sess.run([mul_op4]))

投稿2017/11/08 17:04

mkgrei

総合スコア8560

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

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

WEjpon

2017/11/15 02:30

回答ありがとうございます。 教えていただいた内容から、なぜこれが正しい挙動なのかを考えたのですが次の理解で合っているでしょうか? ・sess.run([mul_op1, mul_op2, mul_op3, mul_op4])ではmul_op1~4の実行順序は保障されない。 ・mul_op1の中の何ステップ目かでval1が更新される。 ・mul_op4が常に0になるのはもう1つの引数が固定値のためvar1が参照されるタイミングが早いから。 ・mul_op2が安定しないのはもう1つの引数がオペレーションのためvar1が参照されるタイミングがmul_op4より遅く、mul_op1のval1更新タイミングと近いところにあるから
mkgrei

2017/11/15 02:32

まさにそのとおりだと思います。
WEjpon

2017/11/15 03:38

ありがとうございます。 とても納得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問