Dense(self.latent_dim, kernel_constraint=max_norm(0.5))(en_conv)
我想把上面的tensoflow代码转换成pytorch,但是我不理解kernel_constraint=max_norm(0.5)。我如何转换它?
一种可能的方法是通过您可以在模型中作为自定义层使用的自定义层来完成。内核约束与您在简单的Dense层中初始化值所做的相同。
Sample:具有初始权值的密集层,可以使用tf.zero()或tf.ones()或随机函数或tf.constant(),但模型训练结果并不总是在单点收敛。要找到可能性,你需要从特定的初始化,但运行时,你可以从训练值开始。
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
: Simply Dense
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
class SimpleDense(tf.keras.layers.Layer):
def __init__(self, units=32):
super(SimpleDense, self).__init__()
self.units = units
def build(self, input_shape):
self.w = self.add_weight(shape=(input_shape[-1], self.units),
initializer='random_normal',
trainable=True)
self.b = self.add_weight(shape=(self.units,),
initializer='random_normal',
trainable=True)
def call(self, inputs):
return tf.matmul(inputs, self.w) + self.b
样本:作为问题要求,密集层具有MaxNorm约束的初始化器。
import tensorflow as tf
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
None
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
physical_devices = tf.config.experimental.list_physical_devices('GPU')
assert len(physical_devices) > 0, "Not enough GPU hardware devices available"
config = tf.config.experimental.set_memory_growth(physical_devices[0], True)
print(physical_devices)
print(config)
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
: Class / Funtions
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
class MaxNorm(tf.keras.layers.Layer):
def __init__(self, max_value=2, axis=1):
super(MaxNorm, self).__init__()
# self.units = units
self._out_shape = None
self.max_value = max_value
self.axis = axis
def build(self, input_shape):
self._out_shape = input_shape
def call(self, inputs):
temp = tf.keras.layers.Dense(inputs.shape[1], kernel_constraint=tf.keras.constraints.MaxNorm(max_value=self.max_value, axis=self.axis), activation=None)( inputs )
return temp
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
: Tasks
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
temp = tf.constant([[ 0.00346701, -0.00676209, -0.00109781, -0.0005832 , 0.00047849, 0.00311204, 0.00843922, -0.00400238, 0.00127922, -0.0026469 ,
-0.00232184, -0.00686269, 0.00021552, -0.0039388 , 0.00753652,
-0.00405236, -0.0008759 , 0.00275771, 0.00144688, -0.00361056,
-0.0036177 , 0.00778807, -0.00116923, 0.00012773, 0.00276652,
0.00438983, -0.00769166, -0.00432891, -0.00211244, -0.00594028,
0.01009954, 0.00581804, -0.0062736 , -0.00921499, 0.00710281,
0.00022364, 0.00051054, -0.00204145, 0.00928543, -0.00129213,
-0.00209933, -0.00212295, -0.00452125, -0.00601313, -0.00239222,
0.00663724, 0.00228883, 0.00359715, 0.00090024, 0.01166699,
-0.00281386, -0.00791688, 0.00055902, 0.00070648, 0.00052972,
0.00249906, 0.00491098, 0.00528313, -0.01159694, -0.00370812,
-0.00950641, 0.00408999, 0.00800613, 0.0014898 ]], dtype=tf.float32)
layer = MaxNorm(max_value=2)
print( layer( temp )[0][tf.math.argmax(layer( temp )[0]).numpy()] )
layer = MaxNorm(max_value=4)
print( layer( temp )[0][tf.math.argmax(layer( temp )[0]).numpy()] )
layer = MaxNorm(max_value=10)
print( layer( temp )[0][tf.math.argmax(layer( temp )[0]).numpy()] )
Output:自定义修改的新层创建,一种证明答案是从接近零的初始值或您知道结果的方法。从0开始,你关注的变化较少,但没有一个0,你在过程的量级上做得最多。
tf.Tensor(-0.8576179, shape=(), dtype=float32)
tf.Tensor(0.6010429, shape=(), dtype=float32)
tf.Tensor(2.2286513, shape=(), dtype=float32)