Tensorflow 2.0 seq2seq 預(yù)測(cè)sin曲線

在本實(shí)驗(yàn)中構(gòu)造了一系列正弦曲線的變形:
X=np.sin(T, dtype=np.float32)0.01np.random.rand()(T+np.random.rand()10)+np.random.rand()*10
樣子的話,大概是:

image.png

預(yù)測(cè)的任務(wù)是伶授,已知某條線前N個(gè)數(shù)(N為400到1600之間的隨機(jī)數(shù))嬉探,預(yù)測(cè)接下來(lái)的200個(gè)數(shù)臼寄。也就是我們要處理一個(gè)變長(zhǎng)的輸入伪朽,這就需要用到ragedtensor。
這里面的主要知識(shí)點(diǎn)可以被概括為:

  1. Raged tensor的使用铭乾。這里采用了from_tensor方法構(gòu)造出了一個(gè)Raged tensor來(lái)存儲(chǔ)一系列長(zhǎng)度不一致的序列剪廉。
  2. 利用karas處理變長(zhǎng)序列。由于karas中的LSTM是更高級(jí)的API炕檩,因此可以直接對(duì)Raged tensor進(jìn)行處理斗蒋。
  3. Seq2seq框架。這里采用的是tensorflow_addons中的seq2seq框架笛质,由于此框架本身對(duì)文本處理的支持比較多泉沾,在應(yīng)對(duì)我們的(相對(duì)簡(jiǎn)單的)實(shí)數(shù)序列的案例中,反而需要進(jìn)行一些定制经瓷。主要是對(duì)sampler的定制爆哑。
  4. Earlystop機(jī)制。直接采用karas的earlystop即可舆吮。

預(yù)測(cè)效果:


image.png

完整代碼

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

T=np.arange(2000)*0.05
X=np.sin(T, dtype=np.float32)*0.01*np.random.rand()*(T+np.random.rand()*10)+np.random.rand()*10
plt.plot(X)

batch_size = 32
max_time = 200
hidden_size = 128

YLEN=max_time

def generateTrain(records=32):
    trainXs=[]
    trainYs=[]
    XLens=[]
    YLens=[]
    for i in range(records):
        X=(np.sin(T)*0.01*np.random.rand()*(T+np.random.rand()*10)+np.random.rand()*10).astype(np.float32)
        xi=X[:1800].copy()
        sepre=np.random.randint(400,1600)
        xi[sepre::]=0
        yi=X[sepre:sepre+YLEN].copy()
        trainXs.append(np.expand_dims(xi,axis=0))
        trainYs.append(np.expand_dims(yi,axis=0))
        XLens.append(sepre)
        YLens.append(YLEN)
    trainX=np.concatenate(trainXs,axis=0)
    trainY=np.concatenate(trainYs,axis=0)
    seqLen=np.array(XLens)
    outLen=np.array(YLens)
    return (trainX,trainY,seqLen,outLen)

def generateTest():
    X=(np.sin(T)*0.01*np.random.rand()*(T+np.random.rand()*10)+np.random.rand()*10).astype(np.float32)
    xi=X[:1800].copy()
    yi=X[1800:1800+YLEN].copy()
    testX=np.expand_dims(xi, axis=0)
    testY=np.expand_dims(yi, axis=0)
    seqLen_test=np.array([1800])
    outLen_test=np.array([YLEN])
    return (testX,testY,seqLen_test,outLen_test)

def gen_raged_train():
    while True:
        trainX,trainY,seqLen,_ = generateTrain()
        raged_train_x = tf.RaggedTensor.from_tensor(trainX, lengths=seqLen)
        raged_train_x = tf.expand_dims(raged_train_x, -1)
        tensor_train_y = tf.convert_to_tensor(trainY)
        yield raged_train_x,tensor_train_y
    
dataset = tf.data.Dataset.from_generator(
     gen_raged_train,
     output_signature=(
         tf.RaggedTensorSpec(shape=(batch_size, None, 1), dtype=tf.float32, ragged_rank=1),
         tf.TensorSpec(shape=(batch_size, 200,), dtype=tf.float32))
)

import tensorflow_addons as tfa
import tensorflow as tf

inputs = tf.keras.layers.Input(shape=[None, 1], ragged=True)

encoding, state_h, state_c = tf.keras.layers.LSTM(hidden_size, return_state=True)(inputs)

encoder_state = [state_h, state_c]

decoder_cell = tf.keras.layers.LSTMCell(hidden_size)

sample_fn = lambda x: x

end_fn = lambda x:False

sampler = tfa.seq2seq.InferenceSampler(sample_fn = sample_fn, sample_shape=[hidden_size],sample_dtype=tf.float32,end_fn=end_fn)

decoder = tfa.seq2seq.BasicDecoder(decoder_cell, sampler, maximum_iterations=200)

input_lengths = tf.fill([batch_size], max_time)

initial_state = decoder_cell.get_initial_state(encoding)

output, state, lengths = decoder(
    tf.convert_to_tensor(encoding), initial_state=initial_state)

logits = output.rnn_output

output_layer = tf.keras.layers.Dense(1)

out_seq = tf.squeeze(output_layer(logits))

print(out_seq.shape)

model = tf.keras.Model(inputs=inputs, outputs=out_seq)

model.compile(optimizer="Adam", loss="mse", metrics=["mse", "mae", "mape"])

early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=100)

model.fit(dataset.take(128),validation_data=val_data, epochs=1024,callbacks=[early_stop])

model.save('saved_model/my_model')

plt.figure()
plt.plot(X)
plt.plot([np.nan]*2000+model.predict(np.expand_dims(X,0)).tolist())
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末揭朝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子色冀,更是在濱河造成了極大的恐慌潭袱,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锋恬,死亡現(xiàn)場(chǎng)離奇詭異屯换,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)与学,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門彤悔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人索守,你說(shuō)我怎么就攤上這事晕窑。” “怎么了卵佛?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵杨赤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我截汪,道長(zhǎng)疾牲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任衙解,我火速辦了婚禮阳柔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚓峦。我一直安慰自己盔沫,他們只是感情好医咨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著架诞,像睡著了一般拟淮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谴忧,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天很泊,我揣著相機(jī)與錄音,去河邊找鬼沾谓。 笑死委造,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的均驶。 我是一名探鬼主播昏兆,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼妇穴!你這毒婦竟也來(lái)了爬虱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤腾它,失蹤者是張志新(化名)和其女友劉穎跑筝,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞒滴,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡曲梗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妓忍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虏两。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖世剖,靈堂內(nèi)的尸體忽然破棺而出定罢,到底是詐尸還是另有隱情,我是刑警寧澤搁廓,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布引颈,位于F島的核電站耕皮,受9級(jí)特大地震影響境蜕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凌停,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一粱年、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罚拟,春花似錦台诗、人聲如沸完箩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弊知。三九已至,卻和暖如春粱快,著一層夾襖步出監(jiān)牢的瞬間秩彤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工事哭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漫雷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓鳍咱,卻偏偏與公主長(zhǎng)得像降盹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谤辜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容