【问题标题】:Error on tensorflow: Shape must be rank 2 but is rank 1 for 'MatMul_25'张量流上的错误:形状必须为 2 级,但“MatMul_25”为 1 级
【发布时间】:2019-05-21 20:01:11
【问题描述】:

我正在尝试创建一个条件 GAN。但是,我不知道为什么无论我做什么,它都会一遍又一遍地出现相同的错误。 代码如下:

image_dim = 784  #28 * 28
Y_dimension = 10
gen_hidd_dim = 256
disc_hidd_dim = 256
z_noise_dim =100 #input noise datapoint

def xavier_init(shape):
  return tf.random_normal(shape = shape, stddev = 1/tf.sqrt(shape[0]/2.0))

weights = {
    'disc_H' : tf.Variable(xavier_init([image_dim + Y_dimension, disc_hidd_dim])),
    'disc_final' : tf.Variable(xavier_init([disc_hidd_dim, 1])),
    'gen_H': tf.Variable([z_noise_dim + Y_dimension, gen_hidd_dim]),
    'gen_final': tf.Variable(xavier_init([gen_hidd_dim, image_dim]))
}

bias = {
    'disc_H': tf.Variable(xavier_init([disc_hidd_dim])),
    'disc_final': tf.Variable(xavier_init([1])),
    'gen_H': tf.Variable(xavier_init([gen_hidd_dim])),
    'gen_final': tf.Variable(xavier_init([image_dim]))
}

Z_input = tf.placeholder(tf.float32, shape= [None, z_noise_dim ], name = 'input_noise')
Y_input = tf.placeholder(tf.float32, shape= [None, Y_dimension], name='Labels')
X_input = tf.placeholder(tf.float32, shape=[None, image_dim], name = 'real_input')

def Discriminator(x,y):
  inputs = tf.concat(axis = 1, values = [x,y])
  hidden_layer = tf.nn.relu(tf.add(tf.matmul(inputs, weights['disc_H']), bias['disc_H']))
  final_layer = tf.add(tf.matmul(hidden_layer, weights['disc_final']), bias['disc_final'])
  disc_output = tf.nn.sigmoid(final_layer)
  return final_layer, disc_output

def Generator(x,y):
  inputs = tf.concat(axis=1, values=[x,y])
  hidden_layer = tf.nn.relu(tf.add(tf.matmul(tf.cast(inputs, tf.float32), tf.cast(weights['gen_H'], tf.float32)), tf.cast(bias['gen_H'],tf.float32)))
  final_layer = tf.add(tf.matmul(hidden_layer, weights['gen_final']), bias['gen_final'])
  gen_output = tf.nn.sigmoid(final_layer)
  return gen_output

output_Gen = Generator(Z_input, Y_input)

在执行生成器后,我得到以下错误:

 ValueError: Shape must be rank 2 but is rank 1 for 'MatMul_25' (op: 'MatMul') with input shapes: [?,110], [2].

怎么办?

【问题讨论】:

  • 检查权重和 hidden_​​layer 形状

标签: tensorflow deep-learning


【解决方案1】:

我认为您在初始化权重时刚刚错过了一个对 xavier_init() 的呼叫。

你有这个:

weights = {
    'disc_H' : tf.Variable(xavier_init([image_dim + Y_dimension, disc_hidd_dim])),
    'disc_final' : tf.Variable(xavier_init([disc_hidd_dim, 1])),
    'gen_H': tf.Variable([z_noise_dim + Y_dimension, gen_hidd_dim]),
    'gen_final': tf.Variable(xavier_init([gen_hidd_dim, image_dim]))
}

但我认为你想要这个:

weights = {
    'disc_H' : tf.Variable(xavier_init([image_dim + Y_dimension, disc_hidd_dim])),
    'disc_final' : tf.Variable(xavier_init([disc_hidd_dim, 1])),
    'gen_H': tf.Variable(xavier_init([z_noise_dim + Y_dimension, gen_hidd_dim])),
    'gen_final': tf.Variable(xavier_init([gen_hidd_dim, image_dim]))
}

错误消息是因为weights['gen_H'] 的形状为[2],而您预计它的形状为[110, 256]。这意味着对tf.matmul() 的调用失败,因为不可能将形状为[m, 110] 的矩阵乘以形状为[2] 的矩阵

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2018-05-30
    • 2018-06-06
    相关资源
    最近更新 更多