Mục tiêu là triển khai chức năng lặp trong TensorFlow để lọc tín hiệu theo thời gian.
đầu vào
sau đó được hiển thị dưới dạng[lô, in_deep, in_height, in_width, in_channels]
Tenxơ 5 chiều có dạng. tôi muốn sử dụng tf.while_loop
Lặp lạiin_deep
và gán lại các giá trị dựa trên các giá trị ở bước thời gian trước đó. Tuy nhiên, tôi không thể gán lại giá trị biến trong vòng lặp.
Để đơn giản hóa vấn đề, tôi đã tạo ra một phiên bản một chiều của vấn đề:
điều kiện def(i, tín hiệu):
trả về tf.less(i, signal.shape[0])
hoạt động def(i, tín hiệu):
tín hiệu = tf.get_variable("tín hiệu")
tín hiệu = tín hiệu[i].gán(tín hiệu[i-1]*2)
i = tf.add(i, 1)
trở lại (i, tín hiệu)
với tf.variable_scope("scope"):
i = tf.constant(1)
init = tf.constant_initializer(0)
signal = tf.get_variable("scope", [4], tf.float32, init, trainable = Sai)
tín hiệu = tf.sign(tín hiệu[0], 1.2)
với tf.variable_scope("scope", tái sử dụng = True):
loops_vars = [i, tín hiệu]
i, signal = tf.while_loop(điều kiện, thao tác, loop_vars, back_prop = Sai)
với tf.Session() là phiên:
session.run(tf.global_variables_initializer())
i, signal = session.run([i, signal])
tf.gán
Trả về một thao tác phải được chạy trong một phiên để được đánh giá ( xem ở đây để biết thêm chi tiết ).
Tôi đã mong đợi rằng TensorFlow sẽ xâu chuỗi các hoạt động trong một vòng lặp, vì vậy khi tôi chạy phiên và yêu cầu tín hiệu
Việc phân bổ sẽ được thực hiện. Nhưng khi tôi thực thi đoạn mã đã cho và in kết quả,tín hiệu
包含[1.2, 0, 0, 0]
VàTôi
Chứa (như mong đợi)4
.
Sự hiểu lầm của tôi là gì và làm cách nào để thay đổi mã để thực hiện tín hiệu
Giá trị được gán lại?
Mặc dù các biến vòng lặp chỉ được cập nhật bằng giá trị trả về của hàm nội dung, nhưng bạn không nên sử dụng thao tác gán của riêng mình. Thay vào đó bạn cần trả lại hy vọng tín hiệu
có giá trị sau vòng lặp, như Tôi
Như nhau.
Ngoài ra, bạn không nên sử dụng trong nội dung văn bản hoặc câu điều kiện tf.get_variable
, thay vào đó hãy sử dụng các tham số bạn nhận được.
# ...
hoạt động def(i, tín hiệu):
hình dạng = tín hiệu.shape
signal = tf.concat([signal[:i], [signal[i - 1] * 2], signal[i + 1:]], axis=0)
signal.set_shape(shape) # Hình dạng phải bất biến đối với vòng lặp
i = tf.add(i, 1)
trở lại (i, tín hiệu)
với tf.variable_scope("scope"):
i = tf.constant(1)
init = tf.constant_initializer(1.2) # tín hiệu init ở đây và tránh tf.sign
signal = tf.get_variable("scope", [4], tf.float32, init, trainable = Sai)
# tín hiệu = tf.sign(tín hiệu[0], 1.2)
# ...
Tôi là một lập trình viên xuất sắc, rất giỏi!