tensorflow - Keras 中的动态激活函数
问题描述
我正在开展一个研究项目,该项目涉及用多项式激活替换某些 ReLu 激活。我继承的代码是使用带有 TensorFlow 后端的 Keras——我对此几乎没有经验。
本质上,我正在构建一个普通的 ResNet 图,我需要逐渐用自定义函数替换一些 ReLus。换句话说,我的自定义激活需要执行以下操作:
def activation(x)
approx = .1992 + .5002*x + .1997*x**2
relu = tf.nn.relu(x)
diff = (TOTAL_EPOCHS - CURRENT_EPOCH) / TOTAL_EPOCHS
return (1-diff)*approx + diff*relu
我遇到的问题是弄清楚如何使用 keras 和 model.fit 通过当前时代使函数动态化。我尝试了一些事情,比如定义一个自定义层、传递一个计数器变量,以及尝试使用 tensorflow 的全局 step 变量,但每次尝试都会遇到烦人的错误。我想知道是否有一种我忽略的简单方法可以做到这一点?看起来这应该是微不足道的,但我只是缺乏框架的经验。
解决方案
您可以使用keras.callbacks.Callback
keras 和model.fit
. 这是一个使激活函数的返回值等于当前时期的示例。从 MSE 值可以很快看出当前 epoch 参与了激活函数的计算。
from keras.models import Model
from keras.layers import Activation,Input
from keras.utils.generic_utils import get_custom_objects
import keras.backend as K
from keras.callbacks import Callback
class MonitorCallback(Callback):
def __init__(self, CURRENT_EPOCH):
self.parm = CURRENT_EPOCH
def on_epoch_begin(self, epoch, logs=None):
K.set_value(self.parm, epoch)
CURRENT_EPOCH = K.variable(0)
TOTAL_EPOCHS = 8
def custom_activation(x):
return CURRENT_EPOCH
num_input = Input(shape=(1,))
get_custom_objects().update({'custom_activation': Activation(custom_activation)})
output = Activation(custom_activation)(num_input)
model = Model(num_input,output)
model.compile(optimizer='rmsprop',loss='mse',metrics=['mse'])
model.fit(x=[1],y=[2],epochs=TOTAL_EPOCHS,callbacks=[MonitorCallback(CURRENT_EPOCH)])
# print
Using TensorFlow backend.
Epoch 1/8
1/1 [==============================] - 2s 2s/step - loss: 4.0000 - mean_squared_error: 4.0000
Epoch 2/8
1/1 [==============================] - 0s 2ms/step - loss: 1.0000 - mean_squared_error: 1.0000
Epoch 3/8
1/1 [==============================] - 0s 2ms/step - loss: 0.0000e+00 - mean_squared_error: 0.0000e+00
Epoch 4/8
1/1 [==============================] - 0s 2ms/step - loss: 1.0000 - mean_squared_error: 1.0000
Epoch 5/8
1/1 [==============================] - 0s 3ms/step - loss: 4.0000 - mean_squared_error: 4.0000
Epoch 6/8
1/1 [==============================] - 0s 3ms/step - loss: 9.0000 - mean_squared_error: 9.0000
Epoch 7/8
1/1 [==============================] - 0s 3ms/step - loss: 16.0000 - mean_squared_error: 16.0000
Epoch 8/8
1/1 [==============================] - 0s 3ms/step - loss: 25.0000 - mean_squared_error: 25.0000
请记住,纪元从零开始计数keras.callbacks.Callback
。您可以尝试用custom_activation
您的激活函数替换。
推荐阅读
- reactjs - React 测试用例在测试库中失败
- c# - 如何使用 bool 来判断玩家是否跳过
- python - 使用 pip 构建 CMake 扩展
- javascript - writeFile 输出问题。没有显示我期望看到的内容
- php - 我无法在 godady 托管服务器上运行命令“composer require classiebit/addchat-laravel-pro”
- java - 可选登录 Spring + JWT
- typescript - 回调参数的条件类型
- ios - AVPlayer 没有播放本地保存的视频文件
- javascript - React Native setState 根本不工作(功能组件),甚至不同步
- c# - 在c#中将可空字符串转换为可空int