2

다소 혼란스러운 문제가 생기고 있습니다. 나는 눈이 멀었거나 뭔가를 놓쳤거나 재사용 변수를 놓쳤습니다. 동시에 FalseTrue으로 설정됩니다.ValueError : 변수 d_w1/Adam /이 존재하지 않거나 tf.get_variable()을 사용하여 생성되지 않았습니다.

이 내 모델 정의입니다 : 이것은 최적화/트레이너에 대한 내 정의

def discriminator(data, reuse=False): 
if reuse: 
    tf.get_variable_scope().reuse_variables() 

# Fully Connected 1 
d_w1 = tf.get_variable('d_w1', [41, 1024], initializer=tf.truncated_normal_initializer(stddev=0.02)) 
d_b1 = tf.get_variable('d_b1', [1024], initializer=tf.constant_initializer(0)) 
d1 = tf.nn.relu(tf.matmul(data, d_w1) + d_b1) 

# Fully Connected 2 Wide 
d_w2 = tf.get_variable('d_w2', [1024, 6144], initializer=tf.truncated_normal_initializer(stddev=0.02)) 
d_b2 = tf.get_variable('d_b2', [6144], initializer=tf.constant_initializer(0)) 
d2 = tf.nn.relu(tf.matmul(d1, d_w2) + d_b2) 

# Fully Connected 3 Choking 
d_w3 = tf.get_variable('d_w3', [6144, 1024], initializer=tf.truncated_normal_initializer(stddev=0.02)) 
d_b3 = tf.get_variable('d_b3', [1024], initializer=tf.constant_initializer(0)) 
d3 = tf.nn.relu(tf.matmul(d2, d_w3) + d_b3) 

d_w4 = tf.get_variable('d_w4', [1024, 1], initializer=tf.truncated_normal_initializer(stddev=0.02)) 
d_b4 = tf.get_variable('d_b4', [1], initializer=tf.constant_initializer(0)) 

output = tf.nn.sigmoid(tf.matmul(d3, d_w4) + d_b4) 
return output 

def generator(z, batch_size, z_dim): 
# Input layer 
g_w1 = tf.get_variable('g_w1', [z_dim, 41], dtype=tf.float32, 
         initializer=tf.truncated_normal_initializer(stddev=0.02)) 
g_b1 = tf.get_variable('g_b1', [41], initializer=tf.truncated_normal_initializer(stddev=0.02)) 
g1 = tf.matmul(z, g_w1) + g_b1 
g1 = tf.reshape(g1, [-1, 41]) 
g1 = tf.contrib.layers.batch_norm(g1, epsilon=1e-5, scope='bn1') 
g1 = tf.nn.relu(g1) 

g_w2 = tf.get_variable('g_w2', [41, 1024], dtype=tf.float32, 
         initializer=tf.truncated_normal_initializer(stddev=0.02)) 
g_b2 = tf.get_variable('g_b2', [1024], initializer=tf.truncated_normal_initializer(stddev=0.02)) 
g2 = tf.matmul(g1, g_w2) + g_b2 
g2 = tf.contrib.layers.batch_norm(g2, epsilon=1e-5, scope='bn2') 
g2 = tf.nn.relu(g2) 

g_w3 = tf.get_variable('g_w3', [1024, 5120], dtype=tf.float32, 
         initializer=tf.truncated_normal_initializer(stddev=0.02)) 
g_b3 = tf.get_variable('g_b3', [5120], initializer=tf.truncated_normal_initializer(stddev=0.02)) 
g3 = tf.matmul(g2, g_w3) + g_b3 
g3 = tf.contrib.layers.batch_norm(g3, epsilon=1e-5, scope='bn3') 
g3 = tf.nn.relu(g3) 

g_w4 = tf.get_variable('g_w4', [5120, 41], dtype=tf.float32, 
         initializer=tf.truncated_normal_initializer(stddev=0.02)) 
g_b4 = tf.get_variable('g_b4', [41], initializer=tf.truncated_normal_initializer(stddev=0.02)) 
g4 = tf.matmul(g3, g_w4) + g_b4 
g4 = tf.sigmoid(g4) 

return g4 

입니다 :

Traceback (most recent call last): File "C:/Users/FW/PycharmProjects/GAN IDS/GAN 2.py", line 151, in <module> ['d_w1:0', 'd_b1:0', 'd_w2:0', 'd_b2:0', 'd_w3:0', 'd_b3:0', 'd_w4:0', 'd_b4:0'] ['g_w1:0', 'g_b1:0', 'g_w2:0', 'g_b2:0', 'g_w3:0', 'g_b3:0', 'g_w4:0', 'g_b4:0'] reuse or not: True 
    assert tf.get_variable_scope().reuse == False, "Problems!" AssertionError: Problems! 
:

batch_size = 50 
tf.reset_default_graph() 
sess = tf.Session() 
z_placeholder = tf.placeholder(tf.float32, [None, z_dimensions], name='z_placeholder') # Hold my noise 

x_placeholder = tf.placeholder(tf.float32, shape=[None, 41], name='x_placeholder') # Hold my data 

Gz = generator(z_placeholder, batch_size, z_dimensions) # Hold my counterfeits 

Dx = discriminator(x_placeholder) # Hold Predictions on the real data 

Dg = discriminator(Gz, reuse=True) # Hold Predictions on the fake data 

# Loss 

d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Dx, labels=tf.ones_like(Dx))) 
d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Dg, labels=tf.ones_like(Dg))) 

g_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=Dg, labels=tf.ones_like(Dg))) 

# Trainable Vars 
# Separate weights and biases via a name prefix basis, Thanks Jon Bruner and Adit Deshpande. 


tvars = tf.trainable_variables() 

d_vars = [var for var in tvars if 'd_' in var.name] 
g_vars = [var for var in tvars if 'g_' in var.name] 

print([v.name for v in d_vars]) 
print([v.name for v in g_vars]) 

# Optimizers! 
with tf.variable_scope(tf.get_variable_scope(), reuse=False): 
    print("reuse or not: {}".format(tf.get_variable_scope().reuse)) 
    assert tf.get_variable_scope().reuse == False, "Problems!" 
    d_trainer_fake = tf.train.AdamOptimizer(0.0003).minimize(d_loss_fake, var_list=d_vars) 
    d_trainer_real = tf.train.AdamOptimizer(0.0003).minimize(d_loss_real, var_list=d_vars) 

    g_trainer = tf.train.AdamOptimizer(0.0001).minimize(g_loss, var_list=g_vars) 

내 코드를 실행하면 나는이 멋진 오류

자리에 잡기가 없으면 다음과 같이됩니다.

이 문제로 가장 일반적인 스레드를 찾았으므로 지금까지 해결 된 솔루션이 없으므로 어떤 문제가 있는지 잘 모릅니다.

내 모델이나 코드의 최적화 섹션에서 무언가 잘못되었다고 생각합니다.

답변

1

이렇게하면 세 개의 AdamOptimizer 인스턴스가 생성됩니다. 당신이 그들을 분리하려는 경우 가장 좋은 방법은 자신의 범위에 각 하나를 만드는 것입니다 :

with tf.variable_scope('fake-optimizer'): 
    d_trainer_fake = tf.train.AdamOptimizer(0.0003).minimize(d_loss_fake, var_list=d_vars) 

with tf.variable_scope('real-optimizer'): 
    d_trainer_real = tf.train.AdamOptimizer(0.0003).minimize(d_loss_real, var_list=d_vars) 

with tf.variable_scope('optimizer'): 
    g_trainer = tf.train.AdamOptimizer(0.0001).minimize(g_loss, var_list=g_vars) 

, 어떤 이유로, 당신은 자신의 내부 파라미터를 공유하고자하는 경우, 최초의 최적화가 reuse=None으로 작성되어야한다, 그 다음 두 개는 reuse=True입니다. 또는 세 가지 모두 reuse=tf.AUTO_REUSE (tensorflow 1.4에서 지원됨)과 동일합니다.

+0

그래, 그것을 고정 범위에 이름을 추가, 나는 항상 끔찍한 생각입니다 최신 Tensorflow에 레거시 가이드를 따라했습니다. 또한 최적화 도구를 분리하는 것이 중요한 아이디어이기 때문에 나중에 교육 할 때 문제가 발생하지 않습니다. 나는이 실수를 너무 늦게 보았 기 때문에 이미 그 실수를 저질렀다. 통찰력을 주셔서 감사합니다. 다른 누군가가이 조언을 접한다면, 여러분이 따라 다니는 가이드가있는 공식 문서 _along_을 읽으십시오. – SpiderStryder