Выпадающий слой прямо в тензорном потоке: как тренироваться? - PullRequest
4 голосов
/ 01 апреля 2019

После того, как я создал свою модель в Керасе, я хочу получить градиенты и применить их непосредственно в Tensorflow с помощью класса tf.train.AdamOptimizer. Однако, поскольку я использую слой Dropout, я не знаю, как сказать модели, находится ли она в режиме обучения или нет. Ключевое слово training не принято. Это код:

    net_input = Input(shape=(1,))
    net_1 = Dense(50)
    net_2 = ReLU()
    net_3 = Dropout(0.5)
    net = Model(net_input, net_3(net_2(net_1(net_input))))

    #mycost = ...

    optimizer = tf.train.AdamOptimizer()
    gradients = optimizer.compute_gradients(mycost, var_list=[net.trainable_weights])
    # perform some operations on the gradients
    # gradients = ...
    trainstep = optimizer.apply_gradients(gradients)

Я получаю одинаковое поведение с выпадающим слоем и без него, даже с выпадением rate=1. Как это решить?

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Как уже сказал @Sharky, вы можете использовать аргумент training при вызове call() метода класса Dropout.Однако, если вы хотите тренироваться в режиме графика тензорного потока, вам нужно передать заполнитель и передать ему логическое значение во время обучения.Вот пример подгонки гауссовых капель, применимых к вашему случаю:

import tensorflow as tf
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import ReLU
from tensorflow.keras.layers import Input
from tensorflow.keras import Model

x_train, y_train = make_blobs(n_samples=10,
                              n_features=2,
                              centers=[[1, 1], [-1, -1]],
                              cluster_std=1)

x_train, x_test, y_train, y_test = train_test_split(
    x_train, y_train, test_size=0.2)

# `istrain` indicates whether it is inference or training
istrain = tf.placeholder(tf.bool, shape=()) 
y = tf.placeholder(tf.int32, shape=(None))
net_input = Input(shape=(2,))
net_1 = Dense(2)
net_2 = Dense(2)
net_3 = Dropout(0.5)
net = Model(net_input, net_3(net_2(net_1(net_input)), training=istrain))

xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
        labels=y, logits=net.output)
loss_fn = tf.reduce_mean(xentropy)

optimizer = tf.train.AdamOptimizer(0.01)
grads_and_vars = optimizer.compute_gradients(loss_fn,
                                             var_list=[net.trainable_variables])
trainstep = optimizer.apply_gradients(grads_and_vars)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    l1 = loss_fn.eval({net_input:x_train,
                       y:y_train,
                       istrain:True}) # apply dropout
    print(l1) # 1.6264652
    l2 = loss_fn.eval({net_input:x_train,
                       y:y_train,
                       istrain:False}) # no dropout
    print(l2) # 1.5676715
    sess.run(trainstep, feed_dict={net_input:x_train,
                                   y:y_train, 
                                   istrain:True}) # train with dropout

1 голос
/ 01 апреля 2019

Слои Keras наследуются от класса tf.keras.layers.Layer.Keras API обрабатывает это внутренне с помощью model.fit.Если Keras Dropout используется с чистым циклом обучения TensorFlow, он поддерживает обучающий аргумент в своей функции вызова.

Так что вы можете управлять им с помощью

dropout = tf.keras.layers.Dropout(rate, noise_shape, seed)(prev_layer, training=is_training)

Из официальных документов TF

Примечание: - Следующие необязательные аргументы ключевых слов зарезервированы для конкретного использования: * training: логический скалярный тензор Python boolean, указывающий, предназначен ли вызов для обучения или логического вывода.* mask: логическая маска ввода.- Если метод вызова слоя принимает аргумент маски (как это делают некоторые слои Keras), его значение по умолчанию будет установлено на маску, сгенерированную для входов предыдущего слоя (если входные данные поступили из слоя, который сгенерировал соответствующую маску, т.е. еслиэто было сделано из слоя Keras с поддержкой маскировки. https://www.tensorflow.org/api_docs/python/tf/keras/layers/Dropout#call

...