- 循环神经网络中
1.1 前戏
输入向量维度为:[batch, timesteps,sequences] , 假设为[100, 20,10],
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import TimeDistributed
from keras.layers import LSTM
batch=100
timesteps=20
sequences=10
output_nodes=5
model=Sequential()
model.add(LSTM(output_nodes,input_shape=(timesteps,sequences),,return_sequences=False)) ##注意,这里的return_sequences为false
print(model.summary())
在循环神经网络中,每一个时间步都会输出一个output_nodes大小的向量,即当输入为[100,20,10]时候,输出为[100,20,5], 但是当去return_sequences=false时,就会只显示最后一个时间步的输出,即为[100, -1.5],省略中间的一个维度,为[100,5],而keras的batchs在显示中为None,只需要在model.fit中注明batchs为多少就好。
model.add(LSTM(output_nodes,input_shape=(timesteps,sequences),return_sequences=True)) #当return_sequences=True时
1.2 饭前清汤
上面讲到当return_sequences为True时,每一步都会返回一个output_nodes大小的向量,
而TimeDistributed就用在这个时候。
如在经过时间序列后,我们想进行全连接,输出节点为1,
代码如下:
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import TimeDistributed
from keras.layers import LSTM
batch=100
timesteps=20
sequences=10
output_nodes=5
model=Sequential()
model.add(LSTM(output_nodes,input_shape=(timesteps,sequences),,return_sequences=True))
model.add(TimeDistributed(Dense(1)))
print(model.summary())
此时的全连接为:对每个时间步的生成值,即节点数5,进行全连接,即 [1,5]*[5,1]=1,共计20个时间步,因此输出维度为 [20,1].
也就是 对每个时间步的数据都做一个相同的操作,比较方便保持数据的维度。