Tôi muốn cập nhật hàng tenorflow theo hàngtf.while_loop
hai chiều bên trongtf.variable
. Vì vậy, tôi sử dụng phương thức tf.sign. Vấn đề là việc thực hiện của tôi và song song>1
Kết quả là sai. sử dụng song song_iterations=1
Kết quả là đúng. Mã này là như thế này:
a = tf.Variable(tf.zeros([100, 100]), dtype=tf.int64)
i = tf.constant(0)
điều kiện def (i, var):
trả về tf.less(i, 100)
phần thân def(i, var):
Update_row = Method() # Phương thức này trả về một tenxơ [1, 100] là hàng được cập nhật cho biến
temp = tf.sign(a[i],update_row)
trả về [tf.add(i, 1), temp]
z = tf.while_loop(điều kiện, nội dung, [i, a], back_prop=False, Parallel_iterations=10)
Các lần lặp lại hoàn toàn độc lập và tôi không biết vấn đề là gì.
Điều kỳ lạ là nếu tôi thay đổi mã như thế này:
a = tf.Variable(tf.zeros([100, 100]), dtype=tf.int64)
i = tf.constant(0)
điều kiện def (i, var):
trả về tf.less(i, 100)
phần thân def(i, var):
số không = lambda: tf.zeros([100, 100], dtype=tf.int64)
temp = tf.Variable(initial_value=zeros, dtype=tf.int64)
Update_row = Method() # Phương thức này trả về một tenxơ [1, 100] là hàng được cập nhật cho biến
temp = tf.sign(temp[i], update_row)
trả về [tf.add(i, 1), temp]
z = tf.while_loop(điều kiện, nội dung, [i, a], back_prop=False, Parallel_iterations=10)
Mã này cho song song>1
kết quả đúng. Ai đó có thể vui lòng giải thích điều gì đang xảy ra ở đây và cho tôi một giải pháp hiệu quả để cập nhật biến vì biến ban đầu tôi đang cập nhật rất lớn và giải pháp tôi tìm thấy rất kém hiệu quả.
Bạn không cần sử dụng các biến cho việc này, bạn chỉ cần tạo tensor cập nhật hàng trên thân vòng lặp:
nhập tensorflow astf
phương thức def (i):
# Logic giữ chỗ
trả về tf.cast(tf.range(i, i + 100), tf.float32)
điều kiện def (i, var):
trả về tf.less(i, 100)
phần thân def(i, var):
# Tạo hàng mới
đã cập nhật_row = phương thức (i)
# Vectơ chỉ mục chỉ là 1 trên hàng cần cập nhật
idx = tf.equal(tf.range(tf.shape(a)[0]), i)
idx = tf.cast(idx[:, tf.newaxis], var.dtype)
# Soạn tenxơ mới với hàng cũ và hàng mới
var_updated = (1 - idx) * var + idx * update_row
trả về [tf.add(i, 1), var_updated]
# Bắt đầu bằng số không
a = tf.zeros([100, 100], tf.float32)
i = tf.constant(0)
i_end, a_updated = tf.while_loop(điều kiện, nội dung, [i, a], Parallel_iterations=10)
với tf.Session() là sess:
print(sess.run(a_updated))
Đầu ra:
[[ 0. 1. 2. ... 97. 98. 99.]
[1. 2. 3. ... 98. 99. 100.]
[2. 3. 4. ... 99. 100. 101.]
...
[97. 98. 99. ... 194. 195. 196.]
[98. 99. 100. ... 195. 196. 197.]
[99. 100. 101. ... 196. 197. 198.]]
Tôi là một lập trình viên xuất sắc, rất giỏi!