tf.contrib.layers.fully_connected与tf.contrib.layers.linear实现一致,使用tf.contrib.layers.fully_connected一般将激活函数选项至None,因为线性变换不需要非线性变换,与此同时,tf.contrib.layers.fully_connected可以加上bias和正则项。
fully_connected创建一个名为的变量weights,表示一个完全连接的权重矩阵,乘以它inputs产生一个 Tensor隐藏单位。如果normalizer_fn提供了数据(例如 batch_norm),则应用它。否则,如果normalizer_fn为None且使用了biases_initializer,biases则将创建变量并添加隐藏单位。
如果activation_fn不是None,它也会应用于隐藏单位。
fully_connected(inputs,
num_outputs,
activation_fn=nn.relu,
normalizer_fn=None,
normalizer_params=None,
weights_initializer=initializers.xavier_initializer(),
weights_regularizer=None,
biases_initializer=init_ops.zeros_initializer(),
biases_regularizer=None,
reuse=None,
variables_collections=None,
outputs_collections=None,
trainable=True,
scope=None)
inputs:至少为二阶张量和最后一个维度的静态值; 即[batch_size, depth],[None, None, None, channels]。
num_outputs:整数或长整数,图层中的输出单位数。
activation_fn:激活功能。默认值是ReLU功能。将其明确设置为“无”以跳过它并保持线性激活。
normalizer_fn:使用标准化功能代替biases。如果 normalizer_fn提供biases_initializer,biases_regularizer则忽略并且biases不创建也不添加。没有规范化器功能,默认设置为“无”
normalizer_params:规范化函数参数。
weights_initializer:权重的初始化程序。
weights_regularizer:可选的权重正则化器。
biases_initializer:偏见的初始化程序。如果没有跳过偏见。
biases_regularizer:偏见的可选正则化器。
reuse:是否应重用图层及其变量。必须给出能够重用层范围的能力。
variables_collections:所有变量的集合的可选列表或包含每个变量的不同集合列表的字典。
outputs_collections:用于添加输出的集合。
trainable:如果True还将变量添加到图表集合中 GraphKeys.TRAINABLE_VARIABLES(请参阅tf.Variable)。
scope:variable_scope的可选范围。
weighted_sum_from_feature_columns看到的其他同学实现的线性函数,直接从input_features_columns和features中进行计算。并通过tf.contrib.layers.apply_regularization进行正则化。
linear_logits, collections_linear_weights, linear_bias = \
layers.weighted_sum_from_feature_columns(
columns_to_tensors=features,
feature_columns=feature_columns,
num_outputs=1,
weight_collections=None,
scope=None) # wide_scope
linear_logit = linear_logits + linear_bias
weights_list = list(map(lambda x: x[0], collections_linear_weights.values()))
tf.contrib.layers.apply_regularization(tf.contrib.layers.l2_regularizer(float(l2_reg_linear)),
weights_list=weights_list)
tf.contrib.layers.fully_connected使用参考
以wide&deep的wide部分实现为例,如下所示:
dense_input_list = [tf.contrib.layers.input_from_feature_columns(columns_to_tensors=features, feature_columns=[feat]) for feat in feature_columns]
dense_input = concat_fun(dense_input_list)
linear_logit = tf.contrib.layers.fully_connected(dense_input, 1, activation_fn=None, weights_initializer=tf.contrib.layers.xavier_initializer(),
weights_regularizer=tf.contrib.layers.l2_regularizer(float(l2_reg_linear)),
biases_initializer=tf.zeros_initializer(),
biases_regularizer=tf.contrib.layers.l2_regularizer(float(l2_reg_linear)),
trainable=True)
concat_fun将dense特征拼接起来
def concat_fun(inputs, axis=-1):
if len(inputs) == 1:
return inputs[0]
else:
return tf.keras.layers.Concatenate(axis=axis)(inputs)
目前tf.contrib.layers.linear已经被替换为tf.contrib.layers.fully_connected函数。
函数输入
tf.contrib.layers.linear(
inputs, num_outputs, *, activation_fn=None, normalizer_fn=None,
normalizer_params=None, weights_initializer=._initializer,
weights_regularizer=None,
biases_initializer=,
biases_regularizer=None, reuse=None, variables_collections=None,
outputs_collections=None, trainable=True, scope=None
)
tf.contrib.layers.linear - TensorFlow 1.15 - W3cubDocs (来源,看上去和fully_connected一致)
import tensorflow as tf
x = tf.get_variable('x', shape=[2,3], initializer=tf.constant_initializer(1))
y1 = tf.contrib.layers.fully_connected(x,2,weights_initializer=tf.contrib.layers.xavier_initializer(seed=1)) #默认为rule激活函数,所以输出会是0
y2 = tf.contrib.layers.linear(x,2,weights_initializer=tf.contrib.layers.xavier_initializer(seed=1))
y3 = tf.contrib.layers.fully_connected(x,2,weights_initializer=tf.contrib.layers.xavier_initializer(seed=1), activation_fn=None) #activation_fn=None等价于线性函数
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(y1))
print(sess.run(y2))
print(sess.run(y3))
输出
[[-0. -0.]
[-0. -0.]]
[[-0.8214258 -0.12572539]
[-0.8214258 -0.12572539]]
[[-0.8214258 -0.12572539]
[-0.8214258 -0.12572539]]
tf.contrib.layers.fully_connected和tf.contrib.layers.linear_得克特的博客-CSDN博客 (fully_connected与linear比较)
tf.contrib.layers.xavier_initializer函数用法_麻木的程序猿的博客-CSDN博客
tensorflow/layers.py at r1.8 · tensorflow/tensorflow · GitHub (tf.contrib.layers的一些具体实现)
Tensorflow API tf.contrib.layers.linear() 用法_LeeTioN的博客-CSDN博客