Tensorflow не может согласовать созданную вручную модель с моделью API слоев - PullRequest
0 голосов
/ 13 мая 2018

У меня проблемы с созданием вручную модели, созданной с помощью API слоев.Вот две формулировки, которые, по моему мнению, должны быть равны, но не работают так, как если бы я их запускал.

def create_mlp_net(input_images=input_images, reuse=False):
    with tf.variable_scope('mlp', reuse = reuse):
        l1 = tf.layers.dense(input_images, 512, activation=tf.nn.relu)
        l2 = tf.layers.dense(l1, 512, activation=tf.nn.relu)
        y = tf.layers.dense(l2, 10, activation=tf.nn.softmax)
    return y

def manual_create_mlp_net(input_images=input_images, reuse=False):
    with tf.variable_scope('mlp', reuse = reuse):
        W1 = tf.Variable(tf.zeros([784,512]))
        b1 = tf.Variable(tf.zeros([512]))
        l1 = tf.nn.relu(tf.matmul(input_images,W1) + b1)
        W2 = tf.Variable(tf.zeros([512,512]))
        b2 = tf.Variable(tf.zeros([512]))
        l2 = tf.nn.relu(tf.matmul(l1,W2) + b2)
        W3 = tf.Variable(tf.zeros([512,10]))
        b3 = tf.Variable(tf.zeros([10]))
        y = tf.nn.softmax(tf.matmul(l2,W3) + b3)
    return y

Первая дает точность 97%, а ручная - 11%,Я не могу понять, почему, поскольку они должны быть идентичными.Ниже приведен минимальный рабочий код, который я использую для запуска этого.

Правильная реализация

Основываясь на ответе ниже NPE, проблема была в инициализации.Реализация вручную, приведенная ниже, наиболее близка к использованию API слоев:

def manual_create_mlp_net(input_images=input_images, reuse=False):
    with tf.variable_scope('mlp', reuse = reuse):
        W1 = tf.get_variable('w1',shape=[784,512])
        b1 = tf.Variable(tf.zeros([512]))
        l1 = tf.nn.relu(tf.matmul(input_images,W1) + b1)
        W2 = tf.get_variable('w2',shape=[512,512])
        b2 = tf.Variable(tf.zeros([512]))
        l2 = tf.nn.relu(tf.matmul(l1,W2) + b2)
        W3 = tf.get_variable('w3',shape=[512,10])
        b3 = tf.Variable(tf.zeros([10]))
        y = tf.nn.softmax(tf.matmul(l2,W3) + b3)
    return y

Минимальный рабочий код

import numpy as np
import tensorflow as tf

# Load training and eval data
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
input_images = tf.placeholder(tf.float32, [None, 784], name='input_images')
input_labels = tf.placeholder(tf.float32, [None, 10], name = 'input_labels')
y_api = create_mlp_net(input_images,reuse=False)
y_man = manual_create_mlp_net(input_images,reuse=False)

y_use = y_api  ## Changing this to y_man does not yield the same result

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=input_labels, logits=y_use))
train_step = tf.train.RMSPropOptimizer(0.001).minimize(cross_entropy)

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    for _ in range(1000):
        batch_xs, batch_ys = mnist.train.next_batch(100)
        sess.run(train_step, feed_dict={input_images: batch_xs, input_labels: batch_ys})
    correct_prediction = tf.equal(tf.argmax(y_use,1), tf.argmax(input_labels,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    print(sess.run(accuracy, feed_dict={input_images: mnist.test.images, input_labels: mnist.test.labels}))

1 Ответ

0 голосов
/ 13 мая 2018

Основная причина заключается в том, что вы инициализируете три весовые матрицы нулем.

Это не работает, потому что нет никакой асимметрии между нейронами в слое, и поэтому у них нет возможности учиться различным вещам.

Рекомендуемая практика для нелинейных моделей - использовать небольшие случайные начальные веса. Это делается в tf.layers.dense путем делегирования get_variable(), который в свою очередь по умолчанию равен glorot_uniform_initializer.

Обратите внимание, что это делается только для весов; смещения инициализируются нулями, как это делается в вашем коде.

Для обсуждения инициализаторов Xavier см. Почему инициализация весов и смещений должна быть выбрана около 0?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...