深度学习入门——全连接层

文章介绍了全连接层的概念,每个节点都与上一层所有节点相连,用于综合特征。在TensorFlow中使用`tf.keras.layers.Dense`构建全连接层,并展示了如何通过`build`方法自动创建权重和偏差。文中还提到了多层神经网络的构建,通过`Sequential`模型展示了如何堆叠多个Dense层,并分析了各层的参数数量。
摘要由CSDN通过智能技术生成

(注,所有涉及的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
可以仔细看一下输出结果,最后几行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值