tf.nn.dynamic_rnn詳解

函數(shù)原型

tf.nn.dynamic_rnn(

? ? cell,

? ? inputs,

? ? sequence_length=None,

? ? initial_state=None,

? ? dtype=None,

? ? parallel_iterations=None,

? ? swap_memory=False,

? ? time_major=False,

? ? scope=None


參數(shù)講解:

cell: RNNCell的一個實例.

inputs: RNN輸入.

如果time_major == False(默認), 則是一個shape為[batch_size, max_time, input_size]的Tensor,或者這些元素的嵌套元組疏哗。

如果time_major == True,則是一個shape為[max_time, batch_size, input_size]的Tensor,或這些元素的嵌套元組。

sequence_length: (可選)大小為[batch_size],數(shù)據(jù)的類型是int32/int64向量吗氏。如果當前時間步的index超過該序列的實際長度時雷逆,則該時間步不進行計算,RNN的state復制上一個時間步的膀哲,同時該時間步的輸出全部為零。

initial_state: (可選)RNN的初始state(狀態(tài))捂齐。如果cell.state_size(一層的RNNCell)是一個整數(shù)缩抡,那么它必須是一個具有適當類型和形狀的張量[batch_size包颁,cell.state_size]。如果cell.state_size是一個元組(多層的RNNCell,如MultiRNNCell)蘑险,那么它應該是一個張量元組岳悟,每個元素的形狀為[batch_size,s] for s in cell.state_size呵俏。

time_major: inputs 和outputs 張量的形狀格式滔灶。如果為True,則這些張量都應該是(都會是)[max_time, batch_size, depth]麻车。如果為false斗这,則這些張量都應該是(都會是)[batch_size,max_time, depth]赁咙。time_major=true說明輸入和輸出tensor的第一維是max_time。否則為batch_size序目。

使用time_major =True更有效,因為它避免了RNN計算開始和結束時的轉置.但是,大多數(shù)TensorFlow數(shù)據(jù)都是batch-major,因此默認情況下,此函數(shù)接受輸入并以batch-major形式發(fā)出輸出.

返回值:

一對(outputs, state),其中:

outputs: RNN輸出Tensor.

如果time_major == False(默認),這將是shape為[batch_size, max_time, cell.output_size]的Tensor.

如果time_major == True,這將是shape為[max_time, batch_size, cell.output_size]的Tensor.

state: 最終的狀態(tài).

一般情況下state的形狀為 [batch_size, cell.output_size ]

如果cell是LSTMCells,則state將是包含每個單元格的LSTMStateTuple的元組猿涨,state的形狀為[2,batch_size, cell.output_size ]

實列講解

import tensorflow as tf

import numpy as np

n_steps = 2

n_inputs = 3

n_neurons = 5? ? # 也就是hidden_size

X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])

basic_cell = tf.contrib.rnn.BasicRNNCell(num_units=n_neurons)

seq_length = tf.placeholder(tf.int32, [None])

outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sequence_length=seq_length)

init = tf.global_variables_initializer()

X_batch = np.array([

? ? ? ? # step 0? ? step 1

? ? ? ? [[0, 1, 2], [9, 8, 7]], # instance 1

? ? ? ? [[3, 4, 5], [0, 0, 0]], # instance 2

? ? ? ? [[6, 7, 8], [6, 5, 4]], # instance 3

? ? ? ? [[9, 0, 1], [3, 2, 1]], # instance 4

? ? ])

seq_length_batch = np.array([2, 1, 2, 2])? ? #規(guī)定每個樣本的timestep的大小澡绩,如[3, 4, 5], [0, 0, 0]就只保留[3, 4, 5]的部分

with tf.Session() as sess:

? ? init.run()

? ? outputs_val, states_val = sess.run(

? ? ? ? [outputs, states], feed_dict={X: X_batch, seq_length: seq_length_batch})

? ? print("outputs_val.shape:", outputs_val.shape, "states_val.shape:", states_val.shape)

? ? print("outputs_val:", outputs_val, "states_val:", states_val)

輸出

outputs_val.shape: (4, 2, 5) states_val.shape: (4, 5)

outputs_val:? ? ? #對應states_val中的部分用刪除線劃出俺附,后面都是這種形式

[[[ 0.53073734, -0.61281306步鉴, -0.5437517 璃哟,? 0.7320347,? -0.6109526 ]

? [ 0.99996936 随闪, 0.99990636 ,-0.9867181 撮奏,? 0.99726075 当宴,-0.99999976]]

[[ 0.9931584 ,? 0.5877845 定拟, -0.9100412 逗嫡,? 0.988892 ,? -0.9982337 ]

? [ 0.? ? 驱证,? ? ? 0.? ? ?,? ? ?0.? ? 逆瑞,? ? ? 0.? ? ? ,? ? 0.? ? ? ? ]]

[[ 0.99992317 哈肖, 0.96815354 ,-0.985101? 淤井,? 0.9995968 摊趾, -0.9999936 ]

? [ 0.99948144 , 0.9998127? -漩绵,0.57493806 , 0.91015154 -止吐,0.99998355]]

[[ 0.99999255? 侨糟,0.9998929 ,? 0.26732785,? 0.36024097 颤芬,-0.99991137]

? [ 0.98875254?,0.9922327 汰具,? 0.6505734? 菱魔,0.4732064? ,-0.9957567 ]]]

states_val:

[[ 0.99996936聚蝶,? 0.99990636, -0.9867181 碘勉,? 0.99726075 验靡,-0.99999976]

[ 0.9931584? ,0.5877845? 胜嗓,-0.9100412,? ?0.988892 怔锌,? -0.9982337 ]

[ 0.99948144? 孙技,0.9998127 , -0.57493806亚情,? 0.91015154哈雏, -0.99998355]

[ 0.98875254 , 0.9922327土浸,? ?0.6505734 黄伊,? 0.4732064 派殷, -0.9957567 ]]

上面代碼搭建的RNN網絡如下圖所示

上圖中:橢圓表示tensor毡惜,矩形表示RNN cell。

outputs是最后一層的輸出经伙,即 [batch_size帕膜,step,n_neurons] =?[4垮刹,2危纫,5]?

states是每一層的最后一個step的輸出乌庶,即三個結構為 [batch_size契耿,n_neurons] =?[4,5] 的tensor

繼續(xù)觀察數(shù)據(jù)搪桂,states中的最后一個array踢械,正好是outputs的最后那個step的輸出

首先tf.nn.dynamic_rnn()的time_major是默認的false,故輸入X應該是一個[batch_size撵术,step话瞧,input_size]=[4,2划滋,3] 的tensor处坪,注意我們這里調用的是BasicRNNCell架专,只有一層循環(huán)網絡,outputs是最后一層每個step的輸出,它的結構是[batch_size睛低,step钱雷,n_neurons]=[4吹零,2,5] 灿椅,states是每一層的最后那個step的輸出套蒂,由于本例中钞支,我們的循環(huán)網絡只有一個隱藏層骨坑,所以它就代表這一層的最后那個step的輸出撼嗓,因此它和step的大小是沒有關系的礁遣,我們的X有4個樣本組成,隱層神經元個數(shù)為n_neurons是5,因此states的結構就是[batch_size厦画,n_neurons]=[4排嫌,5] ,最后我們觀察數(shù)據(jù),states的每條數(shù)據(jù)正好就是outputs的最后一個step的輸出。

下面我們繼續(xù)講解多個隱藏層的情況劝评,這里是三個隱藏層晃听,注意我們這里仍然是調用BasicRNNCell

import tensorflow as tf

import numpy as np

n_steps = 2

n_inputs = 3

n_neurons = 5

n_layers = 3

X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])

seq_length = tf.placeholder(tf.int32, [None])

layers = [tf.contrib.rnn.BasicRNNCell(num_units=n_neurons,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? activation=tf.nn.relu)

? ? ? ? ? for layer in range(n_layers)]

multi_layer_cell = tf.contrib.rnn.MultiRNNCell(layers)

outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32, sequence_length=seq_length)

init = tf.global_variables_initializer()

X_batch = np.array([

? ? ? ? # step 0? ? step 1

? ? ? ? [[0, 1, 2], [9, 8, 7]], # instance 1

? ? ? ? [[3, 4, 5], [0, 0, 0]], # instance 2 (padded with zero vectors)

? ? ? ? [[6, 7, 8], [6, 5, 4]], # instance 3

? ? ? ? [[9, 0, 1], [3, 2, 1]], # instance 4

? ? ])

seq_length_batch = np.array([2, 1, 2, 2])

with tf.Session() as sess:

? ? init.run()

? ? outputs_val, states_val = sess.run(

? ? ? ? [outputs, states], feed_dict={X: X_batch, seq_length: seq_length_batch})

? ? print("outputs_val.shape:", outputs, "states_val.shape:", states)

? ? print("outputs_val:", outputs_val, "states_val:", states_val)

輸出

outputs_val.shape:

Tensor("rnn/transpose_1:0", shape=(?, 2, 5), dtype=float32)

states_val.shape:

(<tf.Tensor 'rnn/while/Exit_3:0' shape=(?, 5) dtype=float32>,

<tf.Tensor 'rnn/while/Exit_4:0' shape=(?, 5) dtype=float32>,

<tf.Tensor 'rnn/while/Exit_5:0' shape=(?, 5) dtype=float32>)

outputs_val:

[[[0.? ?见秤,? ? ? 0.? ? ?,? ? 0.? ?羞酗,? ? ? 0.? ?撤师,? ? ? 0.? ? ? ? ]

? [0.? ? 铡羡,? ? ?0.18740742夭委, 0.? ? 杏死,? ? ?0.2997518 , 0.? ? ? ? ]]

[[0.? ? ? 玄括,? ?0.07222144 哪雕,0.? ? ,? ? ?0.11551574 硼讽,0.? ? ? ? ]

? [0.? ?法瑟,? ? ? 0.? ?赐纱,? ? ? 0.? ? ,? ? ?0.? ? 效五,? ? ?0.? ? ? ? ]]

[[0.? ? ,? ? ?0.13463384戒劫, 0.? ? ,? ? ?0.21534224疯攒, 0.? ? ? ? ]

? [0.03702604敬尺, 0.18443246 ,0.? ? ,? ? ?0.34539366 概而,0.? ? ? ? ]]

[[0.? 破镰,? ? ? 0.54511094 源譬,0.? ?,? ? ? 0.8718864 , 0.? ? ? ? ]

? [0.5382122厚脉,? 0.? ?,? ? ? 0.04396425鸯匹, 0.4040263 蟋滴, 0.? ? ? ? ]]]

states_val:

(array([[0.? ? ? ? , 0.83723307, 0.? ? ? ? , 0.? ? ? ? , 2.8518028 ],

? ? ? [0.? ? ? ? , 0.1996038 , 0.? ? ? ? , 0.? ? ? ? , 1.5456247 ],

? ? ? [0.? ? ? ? , 1.1372368 , 0.? ? ? ? , 0.? ? ? ? , 0.832613? ],

? ? ? [0.? ? ? ? , 0.7904129 , 2.4675028 , 0.? ? ? ? , 0.36980057]],

? ? ? dtype=float32),

? array([[0.6524607 , 0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? ],

? ? ? [0.25143963, 0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? ],

? ? ? [0.5010576 , 0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? ],

? ? ? [0.? ? ? ? , 0.3166597 , 0.4545995 , 0.? ? ? ? , 0.? ? ? ? ]],

? ? ? dtype=float32),

? array([[0.? ? ? ? , 0.18740742, 0.? ? ? ? , 0.2997518 , 0.? ? ? ? ],

? ? ? [0.? ? ? ? , 0.07222144, 0.? ? ? ? , 0.11551574, 0.? ? ? ? ],

? ? ? [0.03702604, 0.18443246, 0.? ? ? ? , 0.34539366, 0.? ? ? ? ],

? ? ? [0.5382122 , 0.? ? ? ? , 0.04396425, 0.4040263 , 0.? ? ? ? ]],

? ? ? dtype=float32))


多層的RNN網絡如下圖所示

我們說過涩馆,outputs是最后一層的輸出,即 [batch_size,step,n_neurons]=[4划乖,2仰美,5]?

states是每一層的最后一個step的輸出,即三個結構為 [batch_size诉字,n_neurons]=[4,5]的tensor繼續(xù)觀察數(shù)據(jù),states中的最后一個array漠趁,正好是outputs的最后那個step的輸出字币。

下面我們繼續(xù)講當由BasicLSTMCell構造單元工廠的時候翩活,只講多層的情況利耍,我們只需要將上面的 BasicRNNCell替換成BasicLSTMCell就行了,打印信息如下:

outputs_val.shape:

Tensor("rnn/transpose_1:0", shape=(?, 2, 5), dtype=float32)

states_val.shape:

(LSTMStateTuple(c=<tf.Tensor 'rnn/while/Exit_3:0' shape=(?, 5) dtype=float32>,

? ? ? ? ? ? ? ? h=<tf.Tensor 'rnn/while/Exit_4:0' shape=(?, 5) dtype=float32>),

LSTMStateTuple(c=<tf.Tensor 'rnn/while/Exit_5:0' shape=(?, 5) dtype=float32>,

? ? ? ? ? ? ? h=<tf.Tensor 'rnn/while/Exit_6:0' shape=(?, 5) dtype=float32>),

LSTMStateTuple(c=<tf.Tensor 'rnn/while/Exit_7:0' shape=(?, 5) dtype=float32>,

? ? ? ? ? ? ? h=<tf.Tensor 'rnn/while/Exit_8:0' shape=(?, 5) dtype=float32>))

outputs_val:

[[[1.2949290e-04 ,0.0000000e+0扰肌,0 2.7623639e-04钻趋, 0.0000000e+00失仁, 0.0000000e+00]

? [9.4675866e-05 ,0.0000000e+00 片部,2.0214770e-04档悠, 0.0000000e+00, 0.0000000e+00]]

[[4.3100454e-06 ,4.2123037e-07 啦吧,1.4312843e-06 授滓,0.0000000e+00, 0.0000000e+00]

? [0.0000000e+00, 0.0000000e+00 胃碾,0.0000000e+00 ,0.0000000e+00峦朗, 0.0000000e+00]]

[[0.0000000e+00 ,0.0000000e+00, 0.0000000e+00逞怨, 0.0000000e+00 者疤,0.0000000e+00]

? [0.0000000e+00, 0.0000000e+00 叠赦,0.0000000e+00驹马, 0.0000000e+00 ,0.0000000e+00]]

[[0.0000000e+00 除秀,0.0000000e+00糯累, 0.0000000e+00, 0.0000000e+00 册踩,0.0000000e+00]

? [0.0000000e+00 泳姐,0.0000000e+00, 0.0000000e+00暂吉, 0.0000000e+00 胖秒,0.0000000e+00]]]

states_val:

(LSTMStateTuple(

c=array([[0.? ? ? ? , 0.? ? ? ? , 0.04676079, 0.04284539, 0.? ? ? ? ],

? ? ? [0.? ? ? ? , 0.? ? ? ? , 0.0115245 , 0.? ? ? ? , 0.? ? ? ? ],

? ? ? [0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? ],

? ? ? [0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? ]],

? ? ? dtype=float32),

h=array([[0.? ? ? ? , 0.? ? ? ? , 0.00035096, 0.04284406, 0.? ? ? ? ],

? ? ? [0.? ? ? ? , 0.? ? ? ? , 0.00142574, 0.? ? ? ? , 0.? ? ? ? ],

? ? ? [0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? ],

? ? ? [0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? , 0.? ? ? ? ]],

? ? ? dtype=float32)),

LSTMStateTuple(

c=array([[0.0000000e+00, 1.0477135e-02, 4.9871090e-03, 8.2785974e-04,

? ? ? ? 0.0000000e+00],

? ? ? [0.0000000e+00, 2.3306280e-04, 0.0000000e+00, 9.9445322e-05,

? ? ? ? 5.9535629e-05],

? ? ? [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,

? ? ? ? 0.0000000e+00],

? ? ? [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,

? ? ? ? 0.0000000e+00]], dtype=float32),

h=array([[0.00000000e+00, 5.23016974e-03, 2.47756205e-03, 4.11730434e-04,

? ? ? ? 0.00000000e+00],

? ? ? [0.00000000e+00, 1.16522635e-04, 0.00000000e+00, 4.97301044e-05,

? ? ? ? 2.97713632e-05],

? ? ? [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,

? ? ? ? 0.00000000e+00],

? ? ? [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,

? ? ? ? 0.00000000e+00]], dtype=float32)),

LSTMStateTuple(

c=array([[1.8937115e-04, 0.0000000e+00, 4.0442235e-04, 0.0000000e+00,

? ? ? ? 0.0000000e+00],

? ? ? [8.6200516e-06, 8.4243663e-07, 2.8625946e-06, 0.0000000e+00,

? ? ? ? 0.0000000e+00],

? ? ? [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,

? ? ? ? 0.0000000e+00],

? ? ? [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,

? ? ? ? 0.0000000e+00]], dtype=float32),

h=array([[9.4675866e-05, 0.0000000e+00, 2.0214770e-04, 0.0000000e+00,

? ? ? ? 0.0000000e+00],

? ? ? [4.3100454e-06, 4.2123037e-07, 1.4312843e-06, 0.0000000e+00,

? ? ? ? 0.0000000e+00],

? ? ? [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,

? ? ? ? 0.0000000e+00],

? ? ? [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00,

? ? ? ? 0.0000000e+00]], dtype=float32)))

LSTM的網絡結構如下圖:

一個LSTM cell有兩個狀態(tài)Ct和ht ,而不是像一個RNN cell一樣只有ht?

關于LSTM的講解可以看博客:LSTM理論知識講解

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?LSTM模型與前向反向傳播算法 - 劉建平Pinard - 博客園

在tensorflow中,將一個LSTM cell的Ct 和ht 合在一起慕的,稱為LSTMStateTuple阎肝。

因此我們的states包含三個LSTMStateTuple,每一個LSTMStateTuple表示每一層的最后一個step的輸出肮街,這個輸出有兩個信息风题,一個是ht 表示短期記憶信息,一個是Ct 表示長期記憶信息嫉父。維度都是[batch_size沛硅,n_neurons] = [4,5]绕辖,states的最后一個LSTMStateTuple中的ht 就是outputs的最后一個step的輸出摇肌。


先總結一下,num_units這個參數(shù)的大小就是LSTM輸出結果的維度仪际。例如num_units=128围小, 那么LSTM網絡最后輸出就是一個128維的向量。

我們先換個角度舉個例子弟头,最后再用公式來說明吩抓。

假設在我們的訓練數(shù)據(jù)中,每一個樣本 x 是 28*28 維的一個矩陣赴恨,那么將這個樣本的每一行當成一個輸入疹娶,通過28個時間步驟展開LSTM,在每一個LSTM單元伦连,我們輸入一行維度為28的向量雨饺,如下圖所示钳垮。

那么,對每一個LSTM單元额港,參數(shù) num_units=128 的話饺窿,就是每一個單元的輸出為 128*1 的向量,在展開的網絡維度來看移斩,如下圖所示肚医,對于每一個輸入28維的向量,LSTM單元都把它映射到128維的維度向瓷, 在下一個LSTM單元時肠套,LSTM會接收上一個128維的輸出,和新的28維的輸入猖任,處理之后再映射成一個新的128維的向量輸出你稚,就這么一直處理下去,知道網絡中最后一個LSTM單元朱躺,輸出一個128維的向量刁赖。

從LSTM的公式的角度看是什么原理呢?我們先看一下LSTM的結構和公式:

參數(shù) num_units=128 的話长搀,


所以最后LSTM單元輸出的h就是 128?1的向量宇弛。



參考鏈接:

https://blog.csdn.net/notHeadache/article/details/81164264

Tensorflow一些常用基本概念與函數(shù) - 吾知 - 博客園

https://blog.csdn.net/u010960155/article/details/81707498

https://blog.csdn.net/mch2869253130/article/details/89280203


LSTM案例

tensorflow下用LSTM網絡進行時間序列預測

用LSTM做時間序列預測的思路

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盈滴,隨后出現(xiàn)的幾起案子涯肩,更是在濱河造成了極大的恐慌轿钠,老刑警劉巖巢钓,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疗垛,居然都是意外死亡症汹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門贷腕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來背镇,“玉大人,你說我怎么就攤上這事泽裳÷髡叮” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵涮总,是天一觀的道長胸囱。 經常有香客問我,道長瀑梗,這世上最難降的妖魔是什么烹笔? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任裳扯,我火速辦了婚禮,結果婚禮上谤职,老公的妹妹穿的比我還像新娘饰豺。我一直安慰自己,他們只是感情好允蜈,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布冤吨。 她就那樣靜靜地躺著,像睡著了一般饶套。 火紅的嫁衣襯著肌膚如雪锅很。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天凤跑,我揣著相機與錄音爆安,去河邊找鬼。 笑死仔引,一個胖子當著我的面吹牛扔仓,可吹牛的內容都是我干的。 我是一名探鬼主播咖耘,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼翘簇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了儿倒?” 一聲冷哼從身側響起版保,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夫否,沒想到半個月后彻犁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡凰慈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年汞幢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片微谓。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡森篷,死狀恐怖,靈堂內的尸體忽然破棺而出豺型,到底是詐尸還是另有隱情仲智,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布姻氨,位于F島的核電站钓辆,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜岩馍,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一碉咆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛀恩,春花似錦疫铜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至顽馋,卻和暖如春谓厘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寸谜。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工竟稳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熊痴。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓他爸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親果善。 傳聞我的和親對象是個殘疾皇子诊笤,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內容