tensorflow2.0 keras: is dropout disabled during testing by default?

  • Last Update :
  • Techknowledgy :

As per the documentation:

Call arguments:
   inputs: Input tensor(of any rank).
training: Python boolean indicating whether the layer should behave in
   training mode(adding dropout) or in inference mode(doing nothing).
""
"

Suggestion : 2

So yes, dropout is disabled when anycodings_python testing, which is logically correct. The anycodings_python same holds for SpatialDropout as well.,I am wondering if in the following model, anycodings_tensorflow2.0 dropout will be disabled when I call anycodings_tensorflow2.0 model.evaluate(...).,Yes, dropout is always disabled at anycodings_python inference (evaluate/predict).,Please find the link to the anycodings_python documentation anycodings_python below. https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/keras/layers/Dropout

I am wondering if in the following model, anycodings_tensorflow2.0 dropout will be disabled when I call anycodings_tensorflow2.0 model.evaluate(...).

layers = [tf.keras.layers.Dense(size, activation = 'relu')
   for size in (20, 40, 20)
]
layers.insert(1, tf.keras.layers.Dropout(0.2))
layers.append(tf.keras.layers.Dense(1, activation = "sigmoid"))
model = tf.keras.models.Sequential(layers)
model.compile(
   optimizer = tf.keras.optimizers.Adam(learning_rate = 0.0001),
   loss = tf.keras.losses.BinaryCrossentropy())
model.fit(...)
model.evaluate(...) # == > will dropout be deactivated here ?

As per the documentation:

Call arguments:
   inputs: Input tensor(of any rank).
training: Python boolean indicating whether the layer should behave in
   training mode(adding dropout) or in inference mode(doing nothing).
""
"

Suggestion : 3

The Dropout layer randomly sets input units to 0 with a frequency of rate at each step during training time, which helps prevent overfitting. Inputs not set to 0 are scaled up by 1/(1 - rate) such that the sum over all inputs is unchanged.,Note that the Dropout layer only applies when training is set to True such that no values are dropped during inference. When using model.fit, training will be appropriately set to True automatically, and in other contexts, you can set the kwarg explicitly to True when calling the layer.,(This is in contrast to setting trainable=False for a Dropout layer. trainable does not affect the layer's behavior, as Dropout does not have any variables/weights that can be frozen during training.), tf.test OverviewBenchmarkTestCaseTestCase.failureExceptionassert_equal_graph_defbenchmark_configcompute_gradientcreate_local_clusterdisable_with_predicategpu_device_nameis_built_with_cudais_built_with_gpu_supportis_built_with_rocmis_built_with_xlais_gpu_availablemainwith_eager_op_as_function

View aliases

Compat aliases for migration

See Migration guide for more details.

tf.compat.v1.keras.layers.Dropout

tf.keras.layers.Dropout(
   rate, noise_shape = None, seed = None, ** kwargs
)

(This is in contrast to setting trainable=False for a Dropout layer. trainable does not affect the layer's behavior, as Dropout does not have any variables/weights that can be frozen during training.)

tf.random.set_seed(0)
layer = tf.keras.layers.Dropout(.2, input_shape = (2, ))
data = np.arange(10).reshape(5, 2).astype(np.float32)
print(data)[[0. 1.]
   [2. 3.]
   [4. 5.]
   [6. 7.]
   [8. 9.]]
outputs = layer(data, training = True)
print(outputs)
tf.Tensor(
   [
      [0. 1.25]
      [2.5 3.75]
      [5. 6.25]
      [7.5 8.75]
      [10. 0.]
   ], shape = (5, 2), dtype = float32)

Suggestion : 4

In terms of keras implementation, does that mean, we have to modify the line model.add(Dropout(0.5, input_shape=(20,))) after we loading the training weight.,That is correct - dropout should be applied during training (drop inputs with probability p) but there also needs to be a corresponding component of scaling the weights at test time as outlined in the referenced paper,Thank you for your reply @unrealwill. I am new to keras so sorry if I misunderstand something. I still feel there is something unusual when running model.predict or model.evaluate when using dropout. Please see below:,In this post, author mentioned that “Finally, if the training has finished, you’d use the complete network for testing (or in other words, you set the dropout probability to 0).”

model = Sequential()
model.add(Dropout(0.5, input_shape = (20, )))
model.add(Dense(64, init = 'uniform'))
def dropped_inputs():
   return K.dropout(x, self.p, noise_shape, seed = self.seed)
import keras
import numpy as np

X = np.array(
   [
      [2, 1],
      [4, 2]
   ])
y = np.array(
   [
      [5],
      [10]
   ]
)

# Works as expected without dropout
model = keras.models.Sequential()
model.add(keras.layers.Dense(input_dim = 2, output_dim = 1))
model.compile(keras.optimizers.SGD(), loss = 'MSE')
model.fit(X, y, nb_epoch = 10000, verbose = 0)
model.evaluate(X, y) # => ~0

# With dropout
model = keras.models.Sequential()
model.add(keras.layers.Dense(input_dim = 2, output_dim = 1))
model.add(keras.layers.Dropout(0.5))
model.compile(keras.optimizers.SGD(), loss = 'MSE')
model.fit(X, y, nb_epoch = 10000, verbose = 0)
model.evaluate(X, y) # => converges to MSE of 15.625

model.predict(X) # => array([
   [2.5],
   #[5.]
], dtype = float32)
import keras
import numpy as np

X = np.array(
   [
      [2, 1],
      [4, 2]
   ])
y = np.array(
   [
      [5],
      [10]
   ]
)

# Works as expected without dropout
model = keras.models.Sequential()
model.add(keras.layers.Dense(input_dim = 2, output_dim = 1))
model.compile(keras.optimizers.SGD(), loss = 'MSE')
model.fit(X, y, nb_epoch = 10000, verbose = 0)
print model.evaluate(X, y) # => ~0

# With dropout
model = keras.models.Sequential()
model.add(keras.layers.Dense(input_dim = 2, output_dim = 100))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(1))
model.compile(keras.optimizers.adam(), loss = 'MSE')
model.fit(X, y, nb_epoch = 100000, verbose = 0)
print model.evaluate(X, y) # => converges to MSE of 15.625

print model.predict(X) # => array([
   [4.91],
   #[9.96]
], dtype = float32)
import numpy as np
import tensorflow as tf
import keras.backend as K

class Dropout_permanent(Layer):
   def __init__(self, rate, ** kwargs):
   super(Dropout_permanent, self).__init__( ** kwargs)
self.rate = min(1., max(0., rate))
self.supports_masking = True

def call(self, inputs, training = None):
   if 0. < self.rate < 1.:
   retain_prob = 1. - self.rate

def dropped_inputs():
   return tf.nn.dropout(inputs, retain_prob, None, seed = np.random.randint(10e6))

return K.in_train_phase(dropped_inputs, dropped_inputs, training = training)

return inputs

def get_config(self):
   config = {
      'rate': self.rate
   }
base_config = super(Dropout_permanent, self).get_config()
return dict(list(base_config.items()) + list(config.items()))

def compute_output_shape(self, input_shape):
   return input_shape