(注,所有涉及的PPT内容都是龙良曲老师的课程PPT,不做完整资料提供,只为了助于我本人理解内容,代码都经过运行,可直接复制)
全连接层
定义:是每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来
注意这里是所有结点
在图中,可以看到h和x都有上标和下标,上标表示的是层数,下标表示的是维度,下面一张图可以更好的解释
如果光看上面这个图,分辨什么是Input,output,hidden,在我的理解中,x列为input输入,后面两列为hidden,最后一列为output
当然这个图上其实省略了一部分东西,就是能够到下一层的w和b(权值和偏差)
import os
import tensorflow as tf
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
x = tf.random.normal([4,784])
net = tf.keras.layers.Dense(512)
out = net(x)
out.shape #TensorShape([4, 512])
net.kernel.shape, net.bias.shape # (TensorShape([784, 512]), TensorShape([512]))
在该段代码中,tf.keras为tf中函数的实现,不是另一种keras(懂得都懂,不懂的就只要认为tf.keras是一种tf的实现就可以了)
那么,可以看到,这段代码中其实并没有定义kernel和bias,为什么却可以直接输出shape?
是因为调用net时,系统会自动确认有没有w和b,如果没有就会再自动确定w和b(主打的就是一个全自动)
784的层被压缩到512层
net = tf.keras.layers.Dense(10)
net.bias # 'Dense' object has no attribute 'bias'
net.get_weights()
net.weights # []
net.build(input_shape=(None,4))
net.kernel.shape,net.bias.shape #(TensorShape([4, 10]), TensorShape([10]))
net.build(input_shape=(None,20))
net.kernel.shape,net.bias.shape #(TensorShape([20, 10]), TensorShape([10]))
net.build(input_shape=(2,4))
net.kernel
#<tf.Variable 'kernel:0' shape=(4, 10) dtype=float32, numpy=
# array([[-0.27297658, -0.56637937, -0.6423682 , 0.3151765 , -0.5206606 ,
# -0.59281474, -0.07496881, 0.4384246 , 0.24524117, -0.43156406],
# [ 0.43493354, 0.61763835, 0.61765206, 0.35572875, 0.0232994 ,
# -0.5675372 , -0.5731538 , 0.06793886, -0.32332522, -0.39860728],
# [ 0.35741138, -0.1107778 , -0.54712534, 0.32999784, 0.04952174,
# 0.37667942, 0.33548272, 0.3382321 , -0.47734433, -0.603971 ],
# [-0.39565 , 0.02626199, -0.2048145 , 0.3179518 , -0.63503313,
# -0.5582318 , -0.35639077, -0.3697264 , -0.12877542, 0.017685 ]],
# dtype=float32)>
net.build会创建w和b,并且net.build可以被重复创建
在这里,其实还只是一层一层的,那么多层嵌套呢?
x = tf.random.normal([2,3])
model = keras.Sequential([
keras.layers.Dense(2,activation='relu'),
keras.layers.Dense(2,activation='relu'),
keras.layers.Dense(2)
])
model.build(input_shape=[None,3])
model.summary()
for p in model.trainable_variables:
print(p.name,p.shape)
# Model: "sequential"
# _________________________________________________________________
# Layer (type) Output Shape Param #
# =================================================================
# dense_6 (Dense) (None, 2) 8 这里的8时2*3+2
# _________________________________________________________________
# dense_7 (Dense) (None, 2) 6 6=2*2+2
# _________________________________________________________________
# dense_8 (Dense) (None, 2) 6 6=2*2+2
# =================================================================
# Total params: 20
# Trainable params: 20
# Non-trainable params: 0
# _________________________________________________________________
# dense_6/kernel:0 (3, 2)
# dense_6/bias:0 (2,)
# dense_7/kernel:0 (2, 2)
# dense_7/bias:0 (2,)
# dense_8/kernel:0 (2, 2)
# dense_8/bias:0 (2,)
对了,运行这个代码,不要忘了先运行
import tensorflow as tf
from tensorflow import keras
for p in model.trainable_variables:
print(p.name,p.shape)这个代码,输出的其实是w1,b1,w2,b2,w3,b3
可以仔细看一下输出结果,最后几行