【问题标题】:How can I add user defined activation function in CNN model instead of builtin function in keras?如何在 CNN 模型中添加用户定义的激活函数而不是 keras 中的内置函数?
【发布时间】:2021-03-16 18:32:09
【问题描述】:

而不是给sigmoid(x) = 1 / (1 + exp(-x))的sigmoid 我想要一个激活函数,比如mish(x)=x * tanh(softplus(x)) 我想把它用作 conv_layer1 = Conv3D(filters=8, kernel_size=(3, 3, 5), activation='mish')(input_layer)这样的

【问题讨论】:

    标签: python tensorflow keras conv-neural-network activation-function


    【解决方案1】:

    你可能需要这个

    # custom activation function 
    def mish(x):
        return tf.keras.layers.Lambda(lambda x: x*tf.tanh(tf.math.log(1+tf.exp(x))))(x)
    
    Dense(hidden_units, activation=mish)
    

    【讨论】:

      【解决方案2】:

      您可以创建一个函数并将其作为可调用对象传递给您的模型,在参数activation 下。函数如下:

      def mish(inputs):
          x = tf.nn.softplus(inputs)
          x = tf.nn.tanh(x)
          x = tf.multiply(x, inputs)
          return x
      

      您可以将其作为activation 放在您的某一层中:

      model = tf.keras.Sequential([
                  Conv2D(filters=16, kernel_size=(3, 3), strides=(1, 1), 
                         input_shape=(28, 28, 1), activation='relu'),
                  MaxPool2D(pool_size=(2, 2)),
                  Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), 
                         activation='relu'),
                  MaxPool2D(pool_size=(2, 2)),
                  Flatten(),
                  Dense(64, activation=mish), # here
                  Dropout(5e-1),
                  Dense(10, activation='softmax')
      ])
      

      这是培训:

      import tensorflow as tf
      from tensorflow import keras
      import numpy as np
      
      (xtrain, ytrain), (xtest, ytest) = keras.datasets.mnist.load_data()
      
      xtrain = np.float32(xtrain/255)
      xtest = np.float32(xtest/255)
      
      ytrain = np.int32(ytrain)
      ytest = np.int32(ytest)
      
      def pre_process(inputs, targets):
          inputs = tf.expand_dims(inputs, -1)
          targets = tf.one_hot(targets, depth=10)
          return tf.divide(inputs, 255), targets
      
      train_data = tf.data.Dataset.from_tensor_slices((xtrain, ytrain)).\
          take(10_000).shuffle(10_000).batch(8).map(pre_process)
      test_data = tf.data.Dataset.from_tensor_slices((xtest, ytest)).\
          take(1_000).shuffle(1_000).batch(8).map(pre_process)
      
      def mish(inputs):
          x = tf.nn.softplus(inputs)
          x = tf.nn.tanh(x)
          x = tf.multiply(x, inputs)
          return x
      
      model = tf.keras.Sequential([
                  tf.keras.layers.Conv2D(filters=16, kernel_size=(3, 3), strides=(1, 1), 
                         input_shape=(28, 28, 1), activation='relu'),
                  tf.keras.layers.MaxPool2D(pool_size=(2, 2)),
                  tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), strides=(1, 1), 
                         activation='relu'),
                  tf.keras.layers.MaxPool2D(pool_size=(2, 2)),
                  tf.keras.layers.Flatten(),
                  tf.keras.layers.Dense(64, activation=mish), 
                  tf.keras.layers.Dropout(5e-1),
                  tf.keras.layers.Dense(10, activation='softmax')])
      
      model.compile(loss='categorical_crossentropy', optimizer='adam')
      
      history = model.fit(train_data, validation_data=test_data, epochs=10)
      

      【讨论】:

      • 我喜欢您的回答的一个原因是全面性。惊人的。 -)
      • 谢谢。我能够测试你的答案,它也有效。
      【解决方案3】:

      Mish 已经在 TensorFlow Addons 中可用。因此,您不需要将其定义为自定义层。访问此页面了解更多详情 - https://www.tensorflow.org/addons/api_docs/python/tfa/activations/mish

      【讨论】:

        猜你喜欢
        • 2019-01-16
        • 1970-01-01
        • 1970-01-01
        • 2020-09-13
        • 2020-05-29
        • 1970-01-01
        • 1970-01-01
        • 2020-06-21
        • 2018-08-30
        相关资源
        最近更新 更多