fully_connected与linear

1、tf.contrib.layers.fully_connected与tf.contrib.layers.linear的区别

tf.contrib.layers.fully_connected与tf.contrib.layers.linear实现一致,使用tf.contrib.layers.fully_connected一般将激活函数选项至None,因为线性变换不需要非线性变换,与此同时,tf.contrib.layers.fully_connected可以加上bias和正则项。

2、tf.contrib.layers.fully_connected简介与实例

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)

3、tf.contrib.layers.linear简介与实例

目前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]]

4、参考文档

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博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值