最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

keras在構(gòu)建LSTM模型時(shí)對(duì)變長(zhǎng)序列的處理操作

 更新時(shí)間:2020年06月29日 09:30:53   作者:xinfeng2005  
這篇文章主要介紹了keras在構(gòu)建LSTM模型時(shí)對(duì)變長(zhǎng)序列的處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

我就廢話不多說(shuō)了,大家還是直接看代碼吧~

print(np.shape(X))#(1920, 45, 20)
X=sequence.pad_sequences(X, maxlen=100, padding='post')
print(np.shape(X))#(1920, 100, 20)

model = Sequential()
model.add(Masking(mask_value=0,input_shape=(100,20)))
model.add(LSTM(128,dropout_W=0.5,dropout_U=0.5))
model.add(Dense(13,activation='softmax'))
model.compile(loss='categorical_crossentropy',
       optimizer='adam',
       metrics=['accuracy'])

# 用于保存驗(yàn)證集誤差最小的參數(shù),當(dāng)驗(yàn)證集誤差減少時(shí),保存下來(lái)
checkpointer = ModelCheckpoint(filepath="keras_rnn.hdf5", verbose=1, save_best_only=True, )
history = LossHistory()
result = model.fit(X, Y, batch_size=10,
          nb_epoch=500, verbose=1, validation_data=(testX, testY),
          callbacks=[checkpointer, history])

model.save('keras_rnn_epochend.hdf5')

補(bǔ)充知識(shí):RNN(LSTM)數(shù)據(jù)形式及Padding操作處理變長(zhǎng)時(shí)序序列dynamic_rnn

Summary

RNN

樣本一樣,計(jì)算的狀態(tài)值和輸出結(jié)構(gòu)一致,也即是說(shuō)只要當(dāng)前時(shí)刻的輸入值也前一狀態(tài)值一樣,那么其當(dāng)前狀態(tài)值和當(dāng)前輸出結(jié)果一致,因?yàn)樵诋?dāng)前這一輪訓(xùn)練中權(quán)重參數(shù)和偏置均未更新

RNN的最終狀態(tài)值與最后一個(gè)時(shí)刻的輸出值一致

輸入數(shù)據(jù)要求格式為,shape=(batch_size, step_time_size, input_size),那么,state的shape=(batch_size, state_size);output的shape=(batch_size, step_time_size, state_size),并且最后一個(gè)有效輸出(有效序列長(zhǎng)度,不包括padding的部分)與狀態(tài)值會(huì)一樣

LSTM

LSTM與RNN基本一致,不同在于其狀態(tài)有兩個(gè)c_state和h_state,它們的shape一樣,輸出值output的最后一個(gè)有效輸出與h_state一致

用變長(zhǎng)RNN訓(xùn)練,要求其輸入格式仍然要求為shape=(batch_size, step_time_size, input_size),但可指定每一個(gè)批次中各個(gè)樣本的有效序列長(zhǎng)度,這樣在有效長(zhǎng)度內(nèi)其狀態(tài)值和輸出值原理不變,但超過(guò)有效長(zhǎng)度的部分的狀態(tài)值將不會(huì)發(fā)生改變,而輸出值都將是shape=(state_size,)的零向量(注:RNN也是這個(gè)原理)

需要說(shuō)明的是,不是因?yàn)闊o(wú)效序列長(zhǎng)度部分全padding為0而引起輸出全為0,狀態(tài)不變,因?yàn)檩敵鲋岛蜖顟B(tài)值得計(jì)算不僅依賴當(dāng)前時(shí)刻的輸入值,也依賴于上一時(shí)刻的狀態(tài)值。其內(nèi)部原理是利用一個(gè)mask matrix矩陣標(biāo)記有效部分和無(wú)效部分,這樣在無(wú)效部分就不用計(jì)算了,也就是說(shuō),這一部分不會(huì)造成反向傳播時(shí)對(duì)參數(shù)的更新。當(dāng)然,如果padding不是零,那么padding的這部分輸出和狀態(tài)同樣與padding為零的結(jié)果是一樣的

'''
#樣本數(shù)據(jù)為(batch_size,time_step_size, input_size[embedding_size])的形式,其中samples=4,timesteps=3,features=3,其中第二個(gè)、第四個(gè)樣本是只有一個(gè)時(shí)間步長(zhǎng)和二個(gè)時(shí)間步長(zhǎng)的,這里自動(dòng)補(bǔ)零
'''
import pandas as pd
import numpy as np
import tensorflow as tf

train_X = np.array([[[0, 1, 2], [9, 8, 7], [3,6,8]], 
          [[3, 4, 5], [0, 10, 110], [0,0,0]], 
          [[6, 7, 8], [6, 5, 4], [1,7,4]], 
          [[9, 0, 1], [3, 7, 4], [0,0,0]],
          [[9, 0, 1], [3, 3, 4], [0,0,0]]
          ])
          
sequence_length = [3, 1, 3, 2, 2]

train_X.shape, train_X[:,2:3,:].reshape(5, 3)
tf.reset_default_graph()

x = tf.placeholder(tf.float32, shape=(None, 3, 3)) # 輸入數(shù)據(jù)只需能夠迭代并符合要求shape即可,list也行,shape不指定表示沒有shape約束,任意shape均可
rnn_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=6) # state_size[hidden_size]
lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=6) # state_size[hidden_size]
outputs1, state1 = tf.nn.dynamic_rnn(rnn_cell, x, dtype=tf.float32, sequence_length=sequence_length)
outputs2, state2 = tf.nn.dynamic_rnn(lstm_cell, x, dtype=tf.float32, sequence_length=sequence_length)

with tf.Session() as sess:
  sess.run(tf.global_variables_initializer()) # 初始化rnn_cell中參數(shù)變量
  outputs1, state1 = sess.run((outputs1, state1), feed_dict={x: train_X})
  outputs2, state2 = sess.run([outputs2, state2], feed_dict={x: train_X})
  print(outputs1.shape, state1.shape) # (4, 3, 5)->(batch_size, time_step_size, state_size), (4, 5)->(batch_size, state_size)
  print(outputs2.shape) # state2為L(zhǎng)STMStateTuple(c_state, h_state)
  print("---------output1<rnn>state1-----------")
  print(outputs1) # 可以看出output1的最后一個(gè)時(shí)刻的輸出即為state1, 即output1[:,-1,:]與state1相等
  print(state1)
  print(np.all(outputs1[:,-1,:] == state1))
  print("---------output2<lstm>state2-----------")
  print(outputs2) # 可以看出output2的最后一個(gè)時(shí)刻的輸出即為L(zhǎng)STMStateTuple中的h
  print(state2)
  print(np.all(outputs2[:,-1,:] == state2[1]))

再來(lái)懟懟dynamic_rnn中數(shù)據(jù)序列長(zhǎng)度tricks

思路樣例代碼

from collections import Counter
import numpy as np

origin_data = np.array([[1, 2, 3],
            [3, 0, 2],
            [1, 1, 4],
            [2, 1, 2],
            [0, 1, 1],
            [2, 0, 3]
            ])
# 按照指定列索引進(jìn)行分組(看作RNN中一個(gè)樣本序列),如下為按照第二列分組的結(jié)果
# [[[1, 2, 3], [0, 0, 0], [0, 0, 0]],
# [[3, 0, 2], [2, 0, 3], [0, 0, 0]],
# [[1, 1, 4], [2, 1, 2], [0, 1, 1]]]

# 第一步,將原始數(shù)據(jù)按照某列序列化使之成為一個(gè)序列數(shù)據(jù)
def groupby(a, col_index): # 未加入索引越界判斷
  max_len = max(Counter(a[:, col_index]).values())
  for i in set(a[:, col_index]):
    d[i] = []
  for sample in a:
    d[sample[col_index]].append(list(sample))
#   for key in d:
#     d[key].extend([[0]*a.shape[1] for _ in range(max_len-len(d[key]))])
  return list(d.values()), [len(_) for _ in d.values()]

samples, sizes = groupby(origin_data, 2)
# 第二步,根據(jù)當(dāng)前這一批次的中最大序列長(zhǎng)度max(sizes)作為padding標(biāo)準(zhǔn)(不同批次的樣本序列長(zhǎng)度可以不一樣,但同一批次要求一樣(包括padding的部分)),當(dāng)然也可以一次性將所有樣本(不按照批量)按照最大序列長(zhǎng)度padding也行,可能空間浪費(fèi)
paddig_samples = np.zeros([len(samples), max(sizes), 3])
for seq_index, seq in enumerate(samples):
  paddig_samples[seq_index, :len(seq), :] = seq
paddig_samples

以上這篇keras在構(gòu)建LSTM模型時(shí)對(duì)變長(zhǎng)序列的處理操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python格式化字符串f-string簡(jiǎn)介

    Python格式化字符串f-string簡(jiǎn)介

    f-string,亦稱為格式化字符串常量(formatted?string?literals),是Python3.6新引入的一種字符串格式化方法,這篇文章主要介紹了Python格式化字符串f-string概覽,需要的朋友可以參考下
    2022-12-12
  • Python中深淺拷貝的區(qū)別詳細(xì)分析

    Python中深淺拷貝的區(qū)別詳細(xì)分析

    深拷貝和淺拷貝都是對(duì)原對(duì)象的拷貝,都會(huì)生成一個(gè)看起來(lái)相同的對(duì)象,下面這篇文章主要給大家介紹了關(guān)于Python中深淺拷貝的區(qū)別的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Python腳本導(dǎo)出為exe程序的方法

    Python腳本導(dǎo)出為exe程序的方法

    這篇文章主要介紹了如何把Python腳本導(dǎo)出為exe程序的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python3 模塊、包調(diào)用&路徑詳解

    Python3 模塊、包調(diào)用&路徑詳解

    下面小編就為大家?guī)?lái)一篇Python3 模塊、包調(diào)用&路徑詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Python中字符串對(duì)齊方法介紹

    Python中字符串對(duì)齊方法介紹

    這篇文章主要介紹了Python中字符串對(duì)齊方法介紹,本文介紹Python字符串內(nèi)置方法ljust、rjust、center的用法,需要的朋友可以參考下
    2015-05-05
  • Python 文件操作的詳解及實(shí)例

    Python 文件操作的詳解及實(shí)例

    這篇文章主要介紹了Python 文件操作的詳解及實(shí)例的相關(guān)資料,希望通過(guò)本文大家能夠理解掌握Python 文件操作的知識(shí),需要的朋友可以參考下
    2017-09-09
  • django框架創(chuàng)建應(yīng)用操作示例

    django框架創(chuàng)建應(yīng)用操作示例

    這篇文章主要介紹了django框架創(chuàng)建應(yīng)用操作,結(jié)合實(shí)例形式分析了Django框架的安裝、創(chuàng)建項(xiàng)目、創(chuàng)建數(shù)據(jù)庫(kù)及創(chuàng)建應(yīng)用相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • Python數(shù)組拼接np.concatenate實(shí)現(xiàn)過(guò)程

    Python數(shù)組拼接np.concatenate實(shí)現(xiàn)過(guò)程

    這篇文章主要介紹了Python數(shù)組拼接np.concatenate實(shí)現(xiàn)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 在Python中字典按值排序的實(shí)現(xiàn)方法

    在Python中字典按值排序的實(shí)現(xiàn)方法

    這篇文章主要介紹了在Python中字典按值排序的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • python正則表達(dá)式函數(shù)match()和search()的區(qū)別

    python正則表達(dá)式函數(shù)match()和search()的區(qū)別

    match()和search()都是python中的正則匹配函數(shù),那這兩個(gè)函數(shù)有何區(qū)別呢?本文詳細(xì)介紹了這2個(gè)函數(shù)的區(qū)別
    2021-10-10

最新評(píng)論

临高县| 兰坪| 台安县| 聊城市| 乌兰浩特市| 陇川县| 高淳县| 昌吉市| 新宾| 塘沽区| 涡阳县| 陆良县| 衡水市| 遵义市| 晋城| 临城县| 汤原县| 宜章县| 金堂县| 蒙自县| 定西市| 古浪县| 乡城县| 新密市| 伊春市| 南丰县| 耒阳市| 长兴县| 临泉县| 珲春市| 隆尧县| 德钦县| 南丰县| 松江区| 石家庄市| 逊克县| 腾冲县| 隆尧县| 廊坊市| 会理县| 萍乡市|