[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6FgLmduo-1651546929799)(https://i 《大厂前端面试题解析+Web核心总结学习笔记+企业项目实战源码+最新高清讲解视频》无偿开源 徽信搜索公众号【编程进阶路】 mg-blog.csdnimg.cn/20201208160045815.png#pic_center)]
可以看到,类的偏置成员 bias 初始化为全 0,这也是偏置𝒃的默认初始化方案。
[](()4.5.3 矩阵
矩阵也是非常常见的张量类型,比如全连接层的批量输入
,其中b表示输入样本的个数,即 batch size, d i n d_in din表示输入特征的长度。
比如特征长度为 4,一共包含 2 个样本的输入可以表示为矩阵:
x = tf.random.normal([2,4])
令全连接层的输出节点数为 3,则它的权值张量 W 的 shape 为[4,3]:
x = tf.random.normal([2, 4])
w = tf.ones([4, 3]) # 定义w张量
b = tf.zeros([3]) # 定义b张量
o = x @ w + b # x@w+b运算 @ 等价于tf.matmul表示矩阵相乘
print(o)
下面解释几行代码
- o = x @ w + b
@ 等价于tf.matmul表示矩阵相乘
其中 X,W 张量均是矩阵。x@w+b 网络层称为线性层,在 TensorFlow 中可以通过 Dense类直接实现,Dense 层也称为全连接层。
写到此处解释一下全连接层
最后的两列小圆球就是两个全连接层,在最后一层卷积结束后,进行了最后一次池化,输出了20个12_12的图像,然后通过了一个全连接层变成了1_100的向量。
我们通过 Dense 类创建输入 4 个节点,输出 3 个节点的网络层,可以通过全连接层的 kernel 成员名查看其权值矩阵 W:
import tensorflow as tf
from tensorflow_core.python import keras
from tensorflow.keras import layers
fc=layers.Dense(3) #定义全连接层的输出节点为3
fc.build(input_shape=(2,4)) #定义全连接层的输入节点为4
print(“fc.kernel:”,fc.kernel)
[](()4.5.4 3 维张量
三维的张量一个典型应用是表示序列信号,它的格式是
-
b表示序列信号的数量
-
sequence len 表示序列信号在时间维度上的采样点数
-
feature len 表示每个点的特征长度。
如图 4.3 所示。为了能够方便字符串被神经网络处理,一般将单词通过嵌入层(Embedding Layer)编码为固定长度的向量,比如“a”编码为某个长度 3 的向量,那么 2 个等长(单词数为 5)的句子序列可以表示为 shape 为[2,5,3]的 3 维张量,其中 2 表示句子个数,5 表示单词数量,3 表示单词向量的长度
import tensorflow as tf
from tensorflow_core.python import keras
from tensorflow.keras import layers
(x_train, y_train), (x_test, y_test) = keras.datasets.imdb.load_data(num_words=10000) # 自动加载 IMDB 电影评价数据集
x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=80) # 将句子填充、截断为等长 80 个单词的句子
print(x_train.shape)
embedding = layers.Embedding(10000, 100) # 创建词向量 Embedding 层类
out = embedding(x_train) # 将数字编码的单词转换为词向量
print(out.shape)
可以看到,经过 Embedding 层编码后,句子张量的 shape 变为[25000,80,100],其中 100 表示每个单词编码为长度 100 的向量
对于特征长度为 1 的序列信号,比如商品价格在 60 天内即可表示商品的价格,因此 2 件商品的价格变化趋势可以使用 shape 为[2,60]的张量表示。为了方便统一格式,也将价格变化趋势表达为 shape 为 [2,60,1]的张量,其中的 1 表示特征长度为 1
[](()4.5.5 4 维张量
4 维张量在卷积神经网络中应用的非常广泛,它用于保存特征图(Feature maps)数据,格式一般定义为 [ b , h , w , c ] [b,h,w,c] [b,h,w,c]
-
b表示输入的数量
-
h/w:特征图的宽高
-
c:特征图的通道数
import tensorflow as tf
from tensorflow_core.python import keras
from tensorflow.keras import layers
x = tf.random.normal([4, 32, 32, 3]) # 创建32*32的彩色图片,个数为4
layer = layers.Conv2D(16, kernel_size=3) # 创建卷积神经网络
out = layer(x) # 前向计算
print(out.shape) # 计算输出大小
print(layer.kernel.shape) # 卷积核张量也是 4 维张量,可以通过 kernel 成员变量访问
[](()4.6 索引与切片
通过索引与切片操作可以提取张量的部分数据,使用频率非常高。
[](()4.6.1 索引
import tensorflow as tf
from tensorflow_core.python import keras
from tensorflow.keras import layers
import numpy as np
x = tf.random.normal([4, 32, 32, 3])
print(“第一张图片的数据”, x[0])
print(“第一张图片的第二行数据:”, x[0][1])
print(“第一张图片的第二行第三列的像素:”, x[0][1][2])
print(“取第 3 张图片,第 2 行,第 1 列的像素,B 通道(第 2 个通道)颜色强度值:”, x[2][1][0][1])
当张量的维度数较高时,使用[𝑗][𝑘]…[𝑙]的方式书写不方便,可以采用[𝑗,𝑘,…,𝑙]的方式索引,它们是等价的。
print(“取第 2 张图片,第 10 行,第 3 列:”,x[1,9,2])
[](()4.6.2 切片
通过start : end:step切片方式可以方便地提取一段数据
-
start 为开始读取位置的索引
-
end 为结束读取位置的索引(不包含 end 位)
-
step 为读取步长
以 shape 为[4,32,32,3]的图片张量为例:
print(“读取第 2,3 张图片:”,x[1:3])
如 x[0,::]表示读取第 1 张图片的所有行,其中::表示在行维度上读取所有行,它等于x[0]的写法
print(“读取第 1 张图片的所有行:”, x[0,::])
我们来总结start : end:step切片的简写方式,其中从第一个元素读取时 start 可以省略,即 start=0 是可以省略,取到最后一个元素时 end 可以省略,步长为 1 时 step 可以省略,简写方式总结如表格 4.1:
特别地,step 可以为负数,考虑最特殊的一种例子,step = −1时,start : end:−1表示从 start 开始,逆序读取至 end 结束(不包含 end),索引号end<=start
x = tf.range(9)
print(“x:”, x)
print(“x[8:0:-1]”, x[8:0:-1])
print(“逆序取全部元素:”,x[::-1])
print(“逆序间隔采样:”,x[::-2])
当张量的维度数量较多时,不需要采样的维度一般用单冒号:表示采样所有元素,此时有可能出现大量的:出现
我们继续考虑[4,32,32,3]的图片张量,当需要读取 G 通道上的数据时,前面所有维度全部提取,此时需要写为:
import tensorflow as tf
from tensorflow_core.python import keras
from tensorflow.keras import layers
import numpy as np
x = tf.random.normal([4, 32, 32, 3])
print(x[:, :, :, 1])
为了避免出现像x[:,:,:,1]这样出现过多冒号的情况,可以使用⋯符号表示取多个维度上所有的数据,其中维度的数量需根据规则自动推断:当切片方式出现⋯符号时,⋯符号,左边的维度将自动对齐到最左边,⋯符号右边的维度将自动对齐到最右边,此时系统再自动推断⋯符号代表的维度数量,它的切片方式总结如