Валидационные потери уменьшаются при включении отсева - PullRequest
0 голосов
/ 01 октября 2019

Я построил nn с тензорным потоком. Я использовал отсев, чтобы упорядочить это. После тренировки я проверил его на проверочном наборе и получил точность 0,37. Затем только для целей тестирования я снова включил отсев, и моя точность проверки повысилась до 0,87. Как это возможно. Использование отсева должно сделать модель хуже. Вот мой код, определяющий архитектуру nn:

with tf.name_scope('train_data'):
    X = tf.placeholder(tf.float32, shape=(None, 28, 28, 1))
    Y = tf.placeholder(tf.int32, shape=(None, 36))

train = tf.placeholder_with_default(False, shape=())
batch_size = tf.placeholder_with_default(1, shape=())

def layer(inp, k, l, train, padding='SAME'):
    with tf.name_scope('layer'):
        z = tf.layers.conv2d(inp, k, kernel_size=(3, 3), strides=(1, 1), padding=padding, kernel_initializer=tf.initializers.he_normal(), name='z'+l)
        bn = tf.layers.batch_normalization(z, epsilon=1e-7, name='bn'+l)
        a = tf.nn.leaky_relu(bn, 0.2)
        d = tf.layers.dropout(a, rate=0.5, training=train, name='d'+l)
        return (z, bn, a, d)    

with tf.name_scope('network'):
    d0 = tf.layers.dropout(X, rate=0.2, training=train, name='d0')
    z1, bn1, a1, d1 = layer(d0, 32, '1', train)
    p1 = tf.nn.max_pool(d1, ksize=(1, 2, 2, 1), strides=(1, 2, 2, 1), padding='VALID', name='p1')
    z2, bn2, a2, d2 = layer(p1, 64, '2', train)
    p2 = tf.nn.max_pool(d2, ksize=(1, 2, 2, 1), strides=(1, 2, 2, 1), padding='VALID', name='p2')
    fc2 = tf.layers.flatten(p2, name='fc2')
    enc = tf.layers.dense(fc2, 36, name='fc3')

with tf.name_scope('encodings'):
    target = tf.slice(enc, [0, 0], [batch_size, -1])
    for i in range(36):
        globals()['enc'+str(i)] = tf.slice(enc, [(1+i)*batch_size, 0], [batch_size, -1])

with tf.name_scope('prediction'):
    logits = tf.concat([-tf.sqrt(tf.reduce_mean((globals()['enc'+str(i)] - target)**2, axis=1, keepdims=True)) for i in range(36)], 1)
    out = tf.nn.softmax(logits)

with tf.name_scope('cost'):
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=Y, logits=logits))

Затем я обучил модель с использованием ADAM-оптимизатора и установил поезд в True во время обучения.

_, loss, acc = sess.run([trainig_op, cost, accuracy], feed_dict={X: x_batch, Y: y_batch, train: True, batch_size: bs})

Наконец, для оценки я вычислилв соответствии с моим набором проверки и установите для параметра поезда значение False.

loss, acc = sess.run([cost, accuracy], feed_dict={X: x_batch, Y: y_batch, batch_size: bs})
...