Я получаю недопустимый аргумент: размеры должны быть одинаковыми при работе с многослойной нейронной сетью - PullRequest
0 голосов
/ 19 апреля 2019

Я использую набор данных CIFAR-10 для шумоподавления изображения. Я получаю сообщение об ошибке при выполнении умножения матриц, которое говорит InvalidArgumentError

Я планирую построить автоэнкодер с тремя слоями кодера и тремя слоями декодера. Но умножение матриц происходит не так, как я ожидал. Я попытался использовать API-интерфейс tenorflow «плотный», но не смог разобраться.

Вот как я изучаю веса и смещения, также определяя кодер и декодер

n_input =1024
X = tf.placeholder("float", [None, n_input])
Y = tf.placeholder("float", [None, n_input])


weights = {
    'encoder_h1': tf.Variable(tf.truncated_normal([n_input, n_hidden_1], stddev=0.01)),
    'encoder_h2': tf.Variable(tf.truncated_normal([n_hidden_1, n_hidden_2], stddev=0.01)),
    'encoder_h3': tf.Variable(tf.truncated_normal([n_hidden_2, n_hidden_3], stddev=0.01)),
    'decoder_h1': tf.Variable(tf.truncated_normal([n_hidden_3, n_hidden_2], stddev=0.01)),
    'decoder_h2': tf.Variable(tf.truncated_normal([n_hidden_2, n_hidden_1], stddev=0.01)),
    'decoder_h3': tf.Variable(tf.truncated_normal([n_hidden_1, n_input], stddev=0.01))      
}


biases = {
    'encoder_b1': tf.Variable(tf.truncated_normal([n_hidden_1], stddev=0.01)),
    'encoder_b2': tf.Variable(tf.truncated_normal([n_hidden_2], stddev=0.01)),
    'encoder_b3': tf.Variable(tf.truncated_normal([n_hidden_3], stddev=0.01)),
    'decoder_b1': tf.Variable(tf.truncated_normal([n_hidden_2], stddev=0.01)),
    'decoder_b2': tf.Variable(tf.truncated_normal([n_hidden_1], stddev=0.01)),
    'decoder_b3': tf.Variable(tf.truncated_normal([n_input], stddev=0.01))      
}

def encoder(x):
  layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']),
                                biases['encoder_b1']))
  layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['encoder_h2']),
                                biases['encoder_b2']))
  layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['encoder_h3']),
                                biases['encoder_b3']))  
  return layer_3

def decoder(x):
  layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']),
                                biases['decoder_b1']))
  layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['decoder_h2']),
                                biases['decoder_b2']))
  layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['decoder_h3']),
                                biases['decoder_b3']))  
  return layer_3

После того, как я приступил к построению модели нейронной сети, выполнив приведенный ниже код, я начал получать ошибки

encoder_op = encoder(X)
decoder_op = decoder(encoder_op)

y_pred = decoder_op

cost = tf.reduce_mean(tf.pow(Y - y_pred, 2))
optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost)

init = tf.global_variables_initializer()

Вот как выглядит журнал ошибок, я думаю, что проблема начинается с вызова функции encoder () при построении модели.

InvalidArgumentError                      Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/ops.py in _create_c_op(graph, node_def, inputs, control_inputs)
   1658   try:
-> 1659     c_op = c_api.TF_FinishOperation(op_desc)
   1660   except errors.InvalidArgumentError as e:

InvalidArgumentError: Dimensions must be equal, but are 1024 and 128 for 'MatMul_2' (op: 'MatMul') with input shapes: [?,1024], [128,256].
...