2016-03-29 23 views
33

Tôi đang cố gắng chạy một mạng nơron nhiều lần với các tham số khác nhau để hiệu chỉnh tham số mạng (khả năng bỏ học, tỷ lệ học tập). Tuy nhiên tôi đang gặp những vấn đề mà chạy mạng trong khi vẫn giữ các thông số tương tự vẫn mang lại cho tôi một giải pháp khác nhau khi tôi chạy mạng trong một vòng lặp như sau:Làm thế nào để có được kết quả ổn định với TensorFlow, thiết lập hạt giống ngẫu nhiên

filename = create_results_file() 
for i in range(3): 
    g = tf.Graph() 
    with g.as_default(): 
    accuracy_result, average_error = network.train_network(
     parameters, inputHeight, inputWidth, inputChannels, outputClasses) 
    f, w = get_csv_writer(filename) 
    w.writerow([accuracy_result, "did run %d" % i, average_error]) 
    f.close() 

Tôi đang sử dụng đoạn mã sau vào lúc bắt đầu chức năng train_network tôi trước khi thiết lập các lớp và hàm sai số của mạng của tôi:

np.random.seed(1) 
tf.set_random_seed(1) 

tôi cũng đã thử thêm mã này trước khi tạo biểu đồ TensorFlow, nhưng tôi cứ bị các giải pháp khác nhau về sản lượng kết quả của tôi.

Tôi đang sử dụng Trình kích hoạt AdamOptimizer và đang khởi tạo trọng số mạng bằng cách sử dụng tf.truncated_normal. Ngoài ra, tôi đang sử dụng np.random.permutation để trộn các hình ảnh đến cho mỗi kỷ nguyên.

Trả lời

24

Đặt hạt giống ngẫu nhiên TensorFlow hiện tại chỉ ảnh hưởng đến biểu đồ mặc định hiện tại. Vì bạn đang tạo một biểu đồ mới cho đào tạo của mình và đặt nó làm mặc định (with g.as_default():), bạn phải đặt hạt giống ngẫu nhiên trong phạm vi khối with đó.

Ví dụ, vòng lặp của bạn sẽ giống như sau:

for i in range(3): 
    g = tf.Graph() 
    with g.as_default(): 
    tf.set_random_seed(1) 
    accuracy_result, average_error = network.train_network(
     parameters, inputHeight, inputWidth, inputChannels, outputClasses) 

Lưu ý rằng điều này sẽ sử dụng hạt giống ngẫu nhiên tương tự cho mỗi lần lặp của vòng lặp bên ngoài for. Nếu bạn muốn sử dụng khác nhau — nhưng vẫn xác định hạt giống — trong mỗi lần lặp, bạn có thể sử dụng tf.set_random_seed(i + 1).

+2

Tôi tin rằng set_random_seed (1) của tôi đã nằm trong g.as_default() chặn chúng vì nó là một trong những dòng đầu tiên bên trong mã train_network. Tuy nhiên tôi đã cố gắng đưa các mã như trong ví dụ của bạn, nhưng tôi vẫn nhận được kết quả không ổn định: > Độ chính xác \t nhãn \t lỗi > 0,9805 \t đã run0 \t 2,96916 > 0,9807 \t đã run1 \t 2,96494 > 0,9804 \t đã run2 \t 2.95215 – Waanders

+0

Tôi đang gặp vấn đề tương tự. 'tensorflow'' 0.12.1' thiết lập hạt giống ngẫu nhiên như được chỉ định Tôi thấy sự khác biệt nhỏ trong kết quả đầu ra xác suất từ ​​chạy đến chạy. – Luke

+2

Lý do sẽ phụ thuộc vào chức năng của bạn, nhưng có thể những khác biệt nhỏ trong tính toán chính xác là do giảm song song không xác định trong các op như 'tf.reduce_sum()'. (Các ops này cho phép thêm điểm nổi như giao hoán, khi thực tế nó không phải là, và những thay đổi trong thứ tự giảm có thể dẫn đến các lỗi nhỏ trong kết quả ....) – mrry

6

Có thể có được hành vi xác định bằng cách cung cấp một cấp độ biểu đồ hoặc một cấp độ hoạt động. Cả hai đều làm việc cho tôi. Một hạt giống cấp đồ thị có thể được đặt với tf.set_random_seed. Có thể đặt hạt giống cấp hoạt động, ví dụ: trong bộ mã hóa biến thể như sau:

myvar = tf.Variable(tf.truncated_normal(((10,10)), stddev=0.1, seed=0)) 
Các vấn đề liên quan