[PYTHON] TensorFlow : 반복 불가능한 결과
PYTHONTensorFlow : 반복 불가능한 결과
바이너리 분류를하기 위해 TensorFlow를 사용하여 다중 레이어 퍼셉트론 넷 (드롭 아웃 포함)을 만드는 Python 스크립트가 있습니다. 파이썬과 TensorFlow 씨드 모두를 조심스럽게 설정했지만, 반복 할 수없는 결과를 얻습니다. 한 번 실행 한 다음 다시 실행하면 다른 결과가 나옵니다. 한 번 실행하고 Python을 종료하고 Python을 다시 시작하고 다시 실행하여 다른 결과를 얻을 수도 있습니다.
어떤 사람들은 TensorFlow에서 반복 불가능한 결과를 얻는 것에 대한 질문을 게시했습니다 (예 : "안정된 결과 얻기 ...", "set_random_seed not working ...", "TensorFlow에서 재현 가능한 결과를 얻는 방법"). 답변은 대개 tf.set_random_seed ()의 잘못된 사용 / 이해로 나타납니다. 나는 주어진 솔루션을 구현하도록 확실히했지만 그게 내 문제를 해결하지 못했다.
일반적인 실수는 tf.set_random_seed ()가 그래프 수준의 시드라는 사실을 인식하지 못하고 스크립트를 여러 번 실행하면 그래프가 변경되어 반복 불가능한 결과가 설명됩니다. 다음 문장을 사용하여 전체 그래프를 인쇄하고 결과가 다른 경우에도 그래프가 동일 함을 확인했습니다 (diff를 통해).
print [n.name for n in tf.get_default_graph().as_graph_def().node]
필자는 tf.reset_default_graph () 및 tf.get_default_graph (). finalize ()와 같은 함수 호출을 사용하여 과도한 그래프 일지라도 그래프의 변경을 피했습니다.
내 스크립트는 ~ 360 행이므로 여기에 관련 선이 표시됩니다 (스 니펫 코드가 표시됨). ALL CAPS에있는 항목은 아래의 매개 변수 블록에 정의 된 상수입니다.
import numpy as np
import tensorflow as tf
from copy import deepcopy
from tqdm import tqdm # Progress bar
# --------------------------------- Parameters ---------------------------------
(snip)
# --------------------------------- Functions ---------------------------------
(snip)
# ------------------------------ Obtain Train Data -----------------------------
(snip)
# ------------------------------ Obtain Test Data -----------------------------
(snip)
random.seed(12345)
tf.set_random_seed(12345)
(snip)
# ------------------------- Build the TensorFlow Graph -------------------------
tf.reset_default_graph()
with tf.Graph().as_default():
x = tf.placeholder("float", shape=[None, N_INPUT])
y_ = tf.placeholder("float", shape=[None, N_CLASSES])
# Store layers weight & bias
weights = {
'h1': tf.Variable(tf.random_normal([N_INPUT, N_HIDDEN_1])),
'h2': tf.Variable(tf.random_normal([N_HIDDEN_1, N_HIDDEN_2])),
'h3': tf.Variable(tf.random_normal([N_HIDDEN_2, N_HIDDEN_3])),
'out': tf.Variable(tf.random_normal([N_HIDDEN_3, N_CLASSES]))
}
biases = {
'b1': tf.Variable(tf.random_normal([N_HIDDEN_1])),
'b2': tf.Variable(tf.random_normal([N_HIDDEN_2])),
'b3': tf.Variable(tf.random_normal([N_HIDDEN_3])),
'out': tf.Variable(tf.random_normal([N_CLASSES]))
}
# Construct model
pred = multilayer_perceptron(x, weights, biases, USE_DROP_LAYERS, DROP_KEEP_PROB)
mean1 = tf.reduce_mean(weights['h1'])
mean2 = tf.reduce_mean(weights['h2'])
mean3 = tf.reduce_mean(weights['h3'])
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y_))
regularizers = (tf.nn.l2_loss(weights['h1']) + tf.nn.l2_loss(biases['b1']) +
tf.nn.l2_loss(weights['h2']) + tf.nn.l2_loss(biases['b2']) +
tf.nn.l2_loss(weights['h3']) + tf.nn.l2_loss(biases['b3']))
cost += COEFF_REGULAR * regularizers
optimizer = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(cost)
out_labels = tf.nn.softmax(pred)
sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
tf.get_default_graph().finalize() # Lock the graph as read-only
#Print the default graph in text form
print [n.name for n in tf.get_default_graph().as_graph_def().node]
# --------------------------------- Training ----------------------------------
print "Start Training"
pbar = tqdm(total = TRAINING_EPOCHS)
for epoch in range(TRAINING_EPOCHS):
avg_cost = 0.0
batch_iter = 0
train_outfile.write(str(epoch))
while batch_iter < BATCH_SIZE:
train_features = []
train_labels = []
batch_segments = random.sample(train_segments, 20)
for segment in batch_segments:
train_features.append(segment[0])
train_labels.append(segment[1])
sess.run(optimizer, feed_dict={x: train_features, y_: train_labels})
line_out = "," + str(batch_iter) + "\n"
train_outfile.write(line_out)
line_out = ",," + str(sess.run(mean1, feed_dict={x: train_features, y_: train_labels}))
line_out += "," + str(sess.run(mean2, feed_dict={x: train_features, y_: train_labels}))
line_out += "," + str(sess.run(mean3, feed_dict={x: train_features, y_: train_labels})) + "\n"
train_outfile.write(line_out)
avg_cost += sess.run(cost, feed_dict={x: train_features, y_: train_labels})/BATCH_SIZE
batch_iter += 1
line_out = ",,,,," + str(avg_cost) + "\n"
train_outfile.write(line_out)
pbar.update(1) # Increment the progress bar by one
train_outfile.close()
print "Completed training"
# ------------------------------ Testing & Output ------------------------------
keep_prob = 1.0 # Do not use dropout when testing
print "now reducing mean"
print(sess.run(mean1, feed_dict={x: test_features, y_: test_labels}))
print "TRUE LABELS"
print(test_labels)
print "PREDICTED LABELS"
pred_labels = sess.run(out_labels, feed_dict={x: test_features})
print(pred_labels)
output_accuracy_results(pred_labels, test_labels)
sess.close()
보시다시피, 나는 각 시대 동안 결과를 파일로 출력하고 마지막에 정확한 숫자를 출력합니다. 비록 내가 씨앗을 올바르게 놓았다고 믿더라도,이 두 가지는 일치하지 않습니다. random.seed (12345)와 tf.set_random_seed (12345)를 모두 사용했습니다.
자세한 정보를 제공해야하는지 알려주세요. 어떤 도움을 주셔서 감사드립니다.
-DG
TensorFlow 버전 0.8.0 (CPU 전용) Enthought Canopy 버전 1.7.2 (Python 2.7, 3. +가 아님) Mac OS X 버전 10.11.3
해결법
-
==============================
1.그래프 수준의 시드 (seed) 이외에 작업 수준 시드를 설정해야합니다.
그래프 수준의 시드 (seed) 이외에 작업 수준 시드를 설정해야합니다.
tf.reset_default_graph() a = tf.constant([1, 1, 1, 1, 1], dtype=tf.float32) graph_level_seed = 1 operation_level_seed = 1 tf.set_random_seed(graph_level_seed) b = tf.nn.dropout(a, 0.5, seed=operation_level_seed)
-
==============================
2.이 tensorflow github 문제를 참조하십시오. GPU의 일부 연산은 완전히 결정적이지 않습니다 (속도 대 정밀도).
이 tensorflow github 문제를 참조하십시오. GPU의 일부 연산은 완전히 결정적이지 않습니다 (속도 대 정밀도).
나는 또한 시드가 어떤 영향을 미치는지 관찰했다. 세션이 생성되기 전에 tf.set_random_seed (...)가 호출되어야한다. 또한 코드를 실행할 때마다 파이썬 인터프리터를 완전히 다시 시작하거나 시작시 tf.reset_default_graph ()를 호출해야합니다.
-
==============================
3.야로 슬라브의 대답에 덧붙이면, 일부 백엔드 연산은 numpy에 의존하기 때문에 연산 및 그래프 수준 시드 이외에 numpy seed도 설정해야합니다. 이것은 Tensorflow V 1.1.0을 사용하여 np.random.seed ()의 트릭을 만들었습니다.
야로 슬라브의 대답에 덧붙이면, 일부 백엔드 연산은 numpy에 의존하기 때문에 연산 및 그래프 수준 시드 이외에 numpy seed도 설정해야합니다. 이것은 Tensorflow V 1.1.0을 사용하여 np.random.seed ()의 트릭을 만들었습니다.
from https://stackoverflow.com/questions/38469632/tensorflow-non-repeatable-results by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬을 사용하여 CSV 파일 읽기 (0) | 2018.11.27 |
---|---|
[PYTHON] Heroku에 장고 배포 (Psycopg2 오류) (0) | 2018.11.27 |
[PYTHON] 파이썬에서 multiprocessing.pool으로 전역 잠금 / 세마포어를 만드는 법? (0) | 2018.11.27 |
[PYTHON] pandas는 DataFrame에서 주어진 색인의 위치를 얻습니다. (0) | 2018.11.27 |
[PYTHON] 파이썬 팬더를 사용하여 hh : mm : ss를 몇 분으로 변환하십시오. (0) | 2018.11.27 |