ValueError: 变量 d_w1/Adam/ 不存在,或者不是通过 tf.get_variable() 创建的

我遇到了一个相当令人困惑的问题,要么是我太盲目了,错过了什么,要么是我的复用变量同时被设置为 FalseTrue

这些是我的模型定义:

def discriminator(data, reuse=False):
    if reuse:
        tf.get_variable_scope().reuse_variables()
    # 全连接层 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)
    # 全连接层 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)
    # 全连接层 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):
    # 输入层
    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

这是我对优化器/训练器的定义:

batch_size = 50
tf.reset_default_graph()
sess = tf.Session()
z_placeholder = tf.placeholder(tf.float32, [None, z_dimensions], name='z_placeholder')  # 保存我的噪声
x_placeholder = tf.placeholder(tf.float32, shape=[None, 41], name='x_placeholder')  # 保存我的数据
Gz = generator(z_placeholder, batch_size, z_dimensions)  # 保存我的伪造品
Dx = discriminator(x_placeholder)  # 保存对真实数据的预测
Dg = discriminator(Gz, reuse=True)  # 保存对假数据的预测
# 损失
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)))
# 可训练变量
# 通过名称前缀基础分离权重和偏置,感谢 Jon Bruner 和 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])
# 优化器!
with tf.variable_scope(tf.get_variable_scope(), reuse=False):
    print("是否复用: {}".format(tf.get_variable_scope().reuse))
    assert tf.get_variable_scope().reuse == False, "有问题!"
    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)

运行我的代码时,我得到了这个美妙的错误:

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']
    是否复用: True
    assert tf.get_variable_scope().reuse == False, "有问题!"
AssertionError: 有问题!

如果没有捕获措施,它会变成这样:

Traceback (most recent call last):
  File "C:/Users/FW/PycharmProjects/GAN IDS/GAN 2.py", line 152, in <module>
    d_trainer_fake = tf.train.AdamOptimizer(0.0003).minimize(d_loss_fake, var_list=d_vars)
  File "C:\Users\FW\Anaconda3\lib\site-packages\tensorflow\python\training\optimizer.py", line 325, in minimize
    name=name)
  File "C:\Users\FW\Anaconda3\lib\site-packages\tensorflow\python\training\optimizer.py", line 446, in apply_gradients
    self._create_slots([_get_variable_for(v) for v in var_list])
  File "C:\Users\FW\Anaconda3\lib\site-packages\tensorflow\python\training\adam.py", line 128, in _create_slots
    self._zeros_slot(v, "m", self._name)
  File "C:\Users\FW\Anaconda3\lib\site-packages\tensorflow\python\training\optimizer.py", line 766, in _zeros_slot
    named_slots[_var_key(var)] = slot_creator.create_zeros_slot(var, op_name)
  File "C:\Users\FW\Anaconda3\lib\site-packages\tensorflow\python\training\slot_creator.py", line 174, in create_zeros_slot
    colocate_with_primary=colocate_with_primary)
  File "C:\Users\FW\Anaconda3\lib\site-packages\tensorflow\python\training\slot_creator.py", line 146, in create_slot_with_initializer
    dtype)
  File "C:\Users\FW\Anaconda3\lib\site-packages\tensorflow\python\training\slot_creator.py", line 66, in _create_slot_var
    validate_shape=validate_shape)
  File "C:\Users\FW\Anaconda3\lib\site-packages\tensorflow\python\ops\variable_scope.py", line 1065, in get_variable
    use_resource=use_resource, custom_getter=custom_getter)
  File "C:\Users\FW\Anaconda3\lib\site-packages\tensorflow\python\ops\variable_scope.py", line 962, in get_variable
    use_resource=use_resource, custom_getter=custom_getter)
  File "C:\Users\FW\Anaconda3\lib\site-packages\tensorflow\python\ops\variable_scope.py", line 367, in get_variable
    validate_shape=validate_shape, use_resource=use_resource)
  File "C:\Users\FW\Anaconda3\lib\site-packages\tensorflow\python\ops\variable_scope.py", line 352, in _true_getter
    use_resource=use_resource)
  File "C:\Users\FW\Anaconda3\lib\site-packages\tensorflow\python\ops\variable_scope.py", line 682, in _get_single_variable
    "VarScope?" % name)
ValueError: 变量 d_w1/Adam/ 不存在,或者不是通过 tf.get_variable() 创建的。您是否打算在 VarScope 中设置 reuse=None?

我查看了这个问题最常见的讨论线程,但到目前为止他们的解决方案都没有奏效,所以我不知道哪里出了问题。

我假设我的模型或优化器部分的代码中出现了严重错误。


回答:

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注