Python⾥对于shape()的理解
Python⾥对于shape()的理解
(1)shape()含义
在笔者debug深度学习相关代码的时候,很容易出现shape()这样形式的东西,⽤来告知输出数据的形式,由于shape()⾥出现的数字数量不同,还经常有shape(?,64,512)这样的数据存在,因此上⽹查了⼀些信息,作出⽐较通俗易懂的解释:
import numpy as np
a = np.array([[[1,2,3],[4,5,6]]])
print(a.shape)
(1,2,3)
表⽰该数组有1个,是2⾏3列的数组。每⼀个shape⾥的数字对应数组中的⼀对中括号,第⼀个数字1表⽰最外层的中括号。以此类推,数字2表⽰第⼆层中括号,数字3表⽰最⾥层的中括号。如果定义array时去掉了最外层的括号那么输出的shape为(2, 3)。
(2)区分⼀维数组和⼆维数组
有⼏个中括号就为⼏维数组
因此在上⽂中,有三对中括号,是3维数组,shape()中有3个数。
a = np.array([1,2])    #a.shape值(2,),意思是⼀维数组,数组中有2个元素。
b = np.array([[1],[2]]) #b.shape值是(2,1),意思是⼀个⼆维数组,每⾏有1个元素。
c = np.array([[1,2]])  #c.shape值是(1,2),意思是⼀个⼆维数组,每⾏有2个元素。
(3)shape()中“?”的含义
⽽在debug相关程序时,可能会出现shape(?,2,3)这便代表数组每⼀个都是2⾏3列的,前⾯这个“?”便代表批处理个数,若为1则有1个,为2则有两个,但是在debug的时候不知道有⼏个,所以以“?”的形式显⽰。
(4)shape()中有四个数,第⼀个数表⽰时间序列(批处理数)
dels import Input,Model
from keras.layers import Dense,Conv2D,TimeDistributed
input_ =Input(shape=(12,32,32,3))
out =TimeDistributed(Conv2D(filters=32,kernel_size=(3,3),padding='same'))(input_)
model =Model(inputs=input_,outputs=out)
model.summary()
⽽这⾥,shape()中有四个数。第⼀个12代表就是时间序列,32,32,3指的是⾼,宽,通道数。卷积操作使⽤TimeDistributed就相当与这12个时间序列共享⼀个卷积层参数信息,⽆论时间序列值为多少,参数总量还是⼀定的。此处⼀共有896个参数,卷积核weights有3×3×3×32=864个,卷积核bias有32个。
附TimeDistributed解释
关于TimeDistributed有⼀个⽐较通俗的⽰例解释:
考虑⼀批32个样本,其中每个样本是⼀个由16个维度组成的10个向量的序列。该层的批输⼊形状然后(32, 10, 16)。
可以这么理解,输⼊数据是⼀个特征⽅程,X1+X2+…+X10=Y,从矩阵的⾓度看,拿出未知数,就是10个向量,每个向量有16个维度,这16个维度是评价Y的16个特征⽅向。
TimeDistributed层的作⽤就是把Dense层应⽤到这10个具体的向量上,对每⼀个向量进⾏了⼀个Dense操作,假设是下⾯这段代码:model = Sequential()model.add(TimeDistributed(Dense(8), input_shape=(10, 16)))
输出还是10个向量,但是输出的维度由16变成了8,也就是(32,10,8)。
python 定义数组
TimeDistributed层给予了模型⼀种⼀对多,多对多的能⼒,增加了模型的维度。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。