1 作用
注意此处Tensorflow版本是2.0+。
由于本人是Pytorch用户,对Tensorflow不是很熟悉,在读到用tf写的代码时就很是麻烦。如图所示,遇到了如下代码:
h = Dense(units=adj_dim, activation=None)(dec_in)
Dense层就是全连接层,对于层方式的初始化的时候,layers.Dense(units,activation)函数一般只需要指定输出节点数Units和激活函数类型即可。输入节点数将根据第一次运算时输入的shape确定,同时输入、输出节点自动创建并初始化权值w和偏置向量b。
下面是Dense的接口
Dense(units,
activation=None,
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None, bias_constraint=None)
units, 代表该层的输出维度
activation=None, 激活函数.但是默认 liner
use_bias=True, 是否使用b 直线 y=ax+b 中的 b
此处没有写 iuput 的情况, 通常会有两种写法:
1 : Dense(units,input_shape())
2 : Dense(units)(x) #这里的 x 是以张量.
D
e
n
s
e
(
n
)
(
x
)
:
=
R
e
L
U
(
W
x
+
b
)
Dense \ (n) \ (x):=ReLU(Wx+b)
Dense (n) (x):=ReLU(Wx+b)
W 是权重函数, Dense() 会随机给 W 一个初始值。所以这里跟Pytorch的nn.linear()一样。
2 例子
# 使用第一种方法进行初始化
# 作为 Sequential 模型的第一层,需要指定输入维度。可以为 input_shape=(16,) 或者 input_dim=16,这两者是等价的。
model = Sequential()
model.add(Dense(32, input_shape=(16,)))
# 现在模型就会以尺寸为 (*, 16) 的数组作为输入,
# 其输出数组的尺寸为 (*, 32)
# 在第一层之后,就不再需要指定输入的尺寸了:
model.add(Dense(32))
3 与torch.nn.Linear的区别
# Pytorch实现
trd = torch.nn.Linear(in_features = 3, out_features = 30)
y = trd(torch.ones(5, 3))
print(y.size())
# torch.Size([5, 30])
# Tensorflow实现
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(30, input_shape=(5,), activation=None))
————————————————————————————————————
tfd = tf.keras.layers.Dense(30, input_shape=(3,), activation=None)
x = tfd(tf.ones(shape=(5, 3)))
print(x.shape)
# (5, 30)
上面Tensorflow的实现方式相同,但是我存在疑惑
4 参考文献
[1]dense层、激活函数、输出层设计
[2]Dense(units, activation=None,)初步
[3]深入理解 keras 中 Dense 层参数
[4]tensorflow - Tensorflow 的 tf.keras.layers.Dense 和 PyTorch 的 torch.nn.Linear 的区别?