def conv1d_weightnorm(inputs, layer_idx, out_dim, kernel_size, padding="SAME", dropout=1.0, var_scope_name="conv_layer"): #padding should take attention
with tf.variable_scope("conv_layer_"+str(layer_idx)):
in_dim = int(inputs.get_shape()[-1])
V = tf.get_variable('V', shape=[kernel_size, in_dim, out_dim], dtype=tf.float32, initializer=tf.random_normal_initializer(mean=0, stddev=tf.sqrt(4.0*dropout/(kernel_size*in_dim))), trainable=True)
V_norm = tf.norm(V.initialized_value(), axis=[0,1]) # V shape is M*N*k, V_norm shape is k
g = tf.get_variable('g', dtype=tf.float32, initializer=V_norm, trainable=True)
b = tf.get_variable('b', shape=[out_dim], dtype=tf.float32, initializer=tf.zeros_initializer(), trainable=True)
# use weight normalization (Salimans & Kingma, 2016)
W = tf.reshape(g, [1,1,out_dim])*tf.nn.l2_normalize(V,[0,1])
inputs = tf.nn.bias_add(tf.nn.conv1d(value=inputs, filters=W, stride=1, padding=padding), b)
return inputs
评论列表
文章目录