開(kāi)始使用 Keras 函數(shù)式 API


開(kāi)始使用 Keras 函數(shù)式 API

Keras 函數(shù)式 API 是定義復(fù)雜模型(如多輸出模型栈戳、有向無(wú)環(huán)圖,或具有共享層的模型)的方法难裆。

這部分文檔假設(shè)你已經(jīng)對(duì) Sequential 順序模型比較熟悉子檀。

讓我們先從一些簡(jiǎn)單的例子開(kāi)始。


例一:全連接網(wǎng)絡(luò)

Sequential 模型可能是實(shí)現(xiàn)這種網(wǎng)絡(luò)的一個(gè)更好選擇乃戈,但這個(gè)例子能夠幫助我們進(jìn)行一些簡(jiǎn)單的理解褂痰。

  • 網(wǎng)絡(luò)層的實(shí)例是可調(diào)用的,它以張量為參數(shù)症虑,并且返回一個(gè)張量
  • 輸入和輸出均為張量,它們都可以用來(lái)定義一個(gè)模型(Model
  • 這樣的模型同 Keras 的 Sequential 模型一樣匪蝙,都可以被訓(xùn)練
from keras.layers import Input, Dense
from keras.models import Model

# 這部分返回一個(gè)張量
inputs = Input(shape=(784,))

# 層的實(shí)例是可調(diào)用的逛球,它以張量為參數(shù),并且返回一個(gè)張量
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)

# 這部分創(chuàng)建了一個(gè)包含輸入層和三個(gè)全連接層的模型
model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(data, labels)  # 開(kāi)始訓(xùn)練


所有的模型都可調(diào)用屋厘,就像網(wǎng)絡(luò)層一樣

利用函數(shù)式 API汗洒,可以輕易地重用訓(xùn)練好的模型:可以將任何模型看作是一個(gè)層,然后通過(guò)傳遞一個(gè)張量來(lái)調(diào)用它世杀。注意瞻坝,在調(diào)用模型時(shí),您不僅重用模型的結(jié)構(gòu)浮创,還重用了它的權(quán)重斩披。

x = Input(shape=(784,))
# 這是可行的,并且返回上面定義的 10-way softmax乡话。
y = model(x)

這種方式能允許我們快速創(chuàng)建可以處理序列輸入的模型绑青。只需一行代碼,你就將圖像分類模型轉(zhuǎn)換為視頻分類模型邪乍。

from keras.layers import TimeDistributed

# 輸入張量是 20 個(gè)時(shí)間步的序列榜配,
# 每一個(gè)時(shí)間為一個(gè) 784 維的向量
input_sequences = Input(shape=(20, 784))

# 這部分將我們之前定義的模型應(yīng)用于輸入序列中的每個(gè)時(shí)間步。
# 之前定義的模型的輸出是一個(gè) 10-way softmax睛驳,
# 因而下面的層的輸出將是維度為 10 的 20 個(gè)向量的序列淫茵。
processed_sequences = TimeDistributed(model)(input_sequences)


多輸入多輸出模型

以下是函數(shù)式 API 的一個(gè)很好的例子:具有多個(gè)輸入和輸出的模型匙瘪。函數(shù)式 API 使處理大量交織的數(shù)據(jù)流變得容易。

來(lái)考慮下面的模型驻啤。我們?cè)噲D預(yù)測(cè) Twitter 上的一條新聞標(biāo)題有多少轉(zhuǎn)發(fā)和點(diǎn)贊數(shù)骑冗。模型的主要輸入將是新聞標(biāo)題本身,即一系列詞語(yǔ)遥倦,但是為了增添趣味袒哥,我們的模型還添加了其他的輔助輸入來(lái)接收額外的數(shù)據(jù),例如新聞標(biāo)題的發(fā)布的時(shí)間等却紧。 該模型也將通過(guò)兩個(gè)損失函數(shù)進(jìn)行監(jiān)督學(xué)習(xí)断凶。較早地在模型中使用主損失函數(shù)飘弧,是深度學(xué)習(xí)模型的一個(gè)良好正則方法次伶。

模型結(jié)構(gòu)如下圖所示:

multi-input-multi-output-graph

讓我們用函數(shù)式 API 來(lái)實(shí)現(xiàn)它。

主要輸入接收新聞標(biāo)題本身柱彻,即一個(gè)整數(shù)序列(每個(gè)整數(shù)編碼一個(gè)詞)瘤载。 這些整數(shù)在 1 到 10,000 之間(10,000 個(gè)詞的詞匯表),且序列長(zhǎng)度為 100 個(gè)詞挎狸。

from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Model

# 標(biāo)題輸入:接收一個(gè)含有 100 個(gè)整數(shù)的序列锨匆,每個(gè)整數(shù)在 1 到 10000 之間。
# 注意我們可以通過(guò)傳遞一個(gè) "name" 參數(shù)來(lái)命名任何層侥蒙。
main_input = Input(shape=(100,), dtype='int32', name='main_input')

# Embedding 層將輸入序列編碼為一個(gè)稠密向量的序列,
# 每個(gè)向量維度為 512。
x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)

# LSTM 層把向量序列轉(zhuǎn)換成單個(gè)向量,
# 它包含整個(gè)序列的上下文信息
lstm_out = LSTM(32)(x)

在這里炬丸,我們插入輔助損失,使得即使在模型主損失很高的情況下首启,LSTM 層和 Embedding 層都能被平穩(wěn)地訓(xùn)練毅桃。

auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)

此時(shí),我們將輔助輸入數(shù)據(jù)與 LSTM 層的輸出連接起來(lái),輸入到模型中:

auxiliary_input = Input(shape=(5,), name='aux_input')
x = keras.layers.concatenate([lstm_out, auxiliary_input])

# 堆疊多個(gè)全連接網(wǎng)絡(luò)層
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)

# 最后添加主要的邏輯回歸層
main_output = Dense(1, activation='sigmoid', name='main_output')(x)

然后定義一個(gè)具有兩個(gè)輸入和兩個(gè)輸出的模型:

model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])

現(xiàn)在編譯模型,并給輔助損失分配一個(gè) 0.2 的權(quán)重膀估。如果要為不同的輸出指定不同的 loss_weightsloss,可以使用列表或字典针肥。 在這里具则,我們給 loss 參數(shù)傳遞單個(gè)損失函數(shù)低斋,這個(gè)損失將用于所有的輸出匪凡。

model.compile(optimizer='rmsprop', loss='binary_crossentropy',
              loss_weights=[1., 0.2])

我們可以通過(guò)傳遞輸入數(shù)組和目標(biāo)數(shù)組的列表來(lái)訓(xùn)練模型:

model.fit([headline_data, additional_data], [labels, labels],
          epochs=50, batch_size=32)

由于輸入和輸出均被命名了(在定義時(shí)傳遞了一個(gè) name 參數(shù)),我們也可以通過(guò)以下方式編譯模型:

model.compile(optimizer='rmsprop',
              loss={'main_output': 'binary_crossentropy', 'aux_output': 'binary_crossentropy'},
              loss_weights={'main_output': 1., 'aux_output': 0.2})

# 然后使用以下方式訓(xùn)練:
model.fit({'main_input': headline_data, 'aux_input': additional_data},
          {'main_output': labels, 'aux_output': labels},
          epochs=50, batch_size=32)


共享網(wǎng)絡(luò)層

函數(shù)式 API 的另一個(gè)用途是使用共享網(wǎng)絡(luò)層的模型买猖。我們來(lái)看看共享層唧龄。

來(lái)考慮推特推文數(shù)據(jù)集讽挟。我們想要建立一個(gè)模型來(lái)分辨兩條推文是否來(lái)自同一個(gè)人(例如胖烛,通過(guò)推文的相似性來(lái)對(duì)用戶進(jìn)行比較)众旗。

實(shí)現(xiàn)這個(gè)目標(biāo)的一種方法是建立一個(gè)模型,將兩條推文編碼成兩個(gè)向量利朵,連接向量著洼,然后添加邏輯回歸層年碘;這將輸出兩條推文來(lái)自同一作者的概率埃难。模型將接收一對(duì)對(duì)正負(fù)表示的推特?cái)?shù)據(jù)。

由于這個(gè)問(wèn)題是對(duì)稱的,編碼第一條推文的機(jī)制應(yīng)該被完全重用來(lái)編碼第二條推文(權(quán)重及其他全部)川梅。這里我們使用一個(gè)共享的 LSTM 層來(lái)編碼推文。

讓我們使用函數(shù)式 API 來(lái)構(gòu)建它。首先我們將一條推特轉(zhuǎn)換為一個(gè)尺寸為 (280, 256) 的矩陣怨酝,即每條推特 280 字符,每個(gè)字符為 256 維的 one-hot 編碼向量 (取 256 個(gè)常用字符)盛险。

import keras
from keras.layers import Input, LSTM, Dense
from keras.models import Model

tweet_a = Input(shape=(280, 256))
tweet_b = Input(shape=(280, 256))

要在不同的輸入上共享同一個(gè)層鹤啡,只需實(shí)例化該層一次祟牲,然后根據(jù)需要傳入你想要的輸入即可:

# 這一層可以輸入一個(gè)矩陣慎颗,并返回一個(gè) 64 維的向量
shared_lstm = LSTM(64)

# 當(dāng)我們重用相同的圖層實(shí)例多次傲宜,圖層的權(quán)重也會(huì)被重用 (它其實(shí)就是同一層)
encoded_a = shared_lstm(tweet_a)
encoded_b = shared_lstm(tweet_b)

# 然后再連接兩個(gè)向量:
merged_vector = keras.layers.concatenate([encoded_a, encoded_b], axis=-1)

# 再在上面添加一個(gè)邏輯回歸層
predictions = Dense(1, activation='sigmoid')(merged_vector)

# 定義一個(gè)連接推特輸入和預(yù)測(cè)的可訓(xùn)練的模型
model = Model(inputs=[tweet_a, tweet_b], outputs=predictions)

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])
model.fit([data_a, data_b], labels, epochs=10)

讓我們暫停一會(huì)报嵌,看看如何讀取共享層的輸出或輸出尺寸。


層「節(jié)點(diǎn)」的概念

每當(dāng)你在某個(gè)輸入上調(diào)用一個(gè)層時(shí),都將創(chuàng)建一個(gè)新的張量(層的輸出)营搅,并且為該層添加一個(gè)「節(jié)點(diǎn)」,將輸入張量連接到輸出張量休蟹。當(dāng)多次調(diào)用同一個(gè)圖層時(shí),該圖層將擁有多個(gè)節(jié)點(diǎn)索引 (0, 1, 2...)盈魁。

在之前版本的 Keras 中赤套,可以通過(guò) layer.get_output() 來(lái)獲得層實(shí)例的輸出張量车柠,或者通過(guò) layer.output_shape 來(lái)獲取其輸出形狀∪芡剩現(xiàn)在你依然可以這么做(除了 get_output() 已經(jīng)被 output 屬性替代)。但是如果一個(gè)層與多個(gè)輸入連接呢?

只要一個(gè)層僅僅連接到一個(gè)輸入,就不會(huì)有困惑,.output 會(huì)返回層的唯一輸出:

a = Input(shape=(280, 256))

lstm = LSTM(32)
encoded_a = lstm(a)

assert lstm.output == encoded_a

但是如果該層有多個(gè)輸入,那就會(huì)出現(xiàn)問(wèn)題:

a = Input(shape=(280, 256))
b = Input(shape=(280, 256))

lstm = LSTM(32)
encoded_a = lstm(a)
encoded_b = lstm(b)

lstm.output

>> AttributeError: Layer lstm_1 has multiple inbound nodes,
hence the notion of "layer output" is ill-defined.
Use `get_output_at(node_index)` instead.

好吧,通過(guò)下面的方法可以解決:

assert lstm.get_output_at(0) == encoded_a
assert lstm.get_output_at(1) == encoded_b

夠簡(jiǎn)單蠕嫁,對(duì)吧迟赃?

input_shapeoutput_shape 這兩個(gè)屬性也是如此:只要該層只有一個(gè)節(jié)點(diǎn)酌媒,或者只要所有節(jié)點(diǎn)具有相同的輸入/輸出尺寸雨席,那么「層輸出/輸入尺寸」的概念就被很好地定義,并且將由 layer.output_shape / layer.input_shape 返回。但是比如說(shuō),如果將一個(gè) Conv2D 層先應(yīng)用于尺寸為 (32,32辟汰,3) 的輸入,再應(yīng)用于尺寸為 (64, 64, 3) 的輸入扶踊,那么這個(gè)層就會(huì)有多個(gè)輸入/輸出尺寸分井,你將不得不通過(guò)指定它們所屬節(jié)點(diǎn)的索引來(lái)獲取它們:

a = Input(shape=(32, 32, 3))
b = Input(shape=(64, 64, 3))

conv = Conv2D(16, (3, 3), padding='same')
conved_a = conv(a)

# 到目前為止只有一個(gè)輸入瘫辩,以下可行:
assert conv.input_shape == (None, 32, 32, 3)

conved_b = conv(b)
# 現(xiàn)在 `.input_shape` 屬性不可行弧械,但是這樣可以:
assert conv.get_input_shape_at(0) == (None, 32, 32, 3)
assert conv.get_input_shape_at(1) == (None, 64, 64, 3)


更多的例子

代碼示例仍然是起步的最佳方式,所以這里還有更多的例子葫慎。

Inception 模型

有關(guān) Inception 結(jié)構(gòu)的更多信息柄沮,請(qǐng)參閱 Going Deeper with Convolutions

from keras.layers import Conv2D, MaxPooling2D, Input

input_img = Input(shape=(256, 256, 3))

tower_1 = Conv2D(64, (1, 1), padding='same', activation='relu')(input_img)
tower_1 = Conv2D(64, (3, 3), padding='same', activation='relu')(tower_1)

tower_2 = Conv2D(64, (1, 1), padding='same', activation='relu')(input_img)
tower_2 = Conv2D(64, (5, 5), padding='same', activation='relu')(tower_2)

tower_3 = MaxPooling2D((3, 3), strides=(1, 1), padding='same')(input_img)
tower_3 = Conv2D(64, (1, 1), padding='same', activation='relu')(tower_3)

output = keras.layers.concatenate([tower_1, tower_2, tower_3], axis=1)

卷積層上的殘差連接

有關(guān)殘差網(wǎng)絡(luò) (Residual Network) 的更多信息纬纪,請(qǐng)參閱 Deep Residual Learning for Image Recognition问畅。

from keras.layers import Conv2D, Input

# 輸入張量為 3 通道 256x256 圖像
x = Input(shape=(256, 256, 3))
# 3 輸出通道(與輸入通道相同)的 3x3 卷積核
y = Conv2D(3, (3, 3), padding='same')(x)
# 返回 x + y
z = keras.layers.add([x, y])

共享視覺(jué)模型

該模型在兩個(gè)輸入上重復(fù)使用同一個(gè)圖像處理模塊灯变,以判斷兩個(gè) MNIST 數(shù)字是否為相同的數(shù)字。

from keras.layers import Conv2D, MaxPooling2D, Input, Dense, Flatten
from keras.models import Model

# 首先蔬咬,定義視覺(jué)模型
digit_input = Input(shape=(27, 27, 1))
x = Conv2D(64, (3, 3))(digit_input)
x = Conv2D(64, (3, 3))(x)
x = MaxPooling2D((2, 2))(x)
out = Flatten()(x)

vision_model = Model(digit_input, out)

# 然后,定義區(qū)分?jǐn)?shù)字的模型
digit_a = Input(shape=(27, 27, 1))
digit_b = Input(shape=(27, 27, 1))

# 視覺(jué)模型將被共享,包括權(quán)重和其他所有
out_a = vision_model(digit_a)
out_b = vision_model(digit_b)

concatenated = keras.layers.concatenate([out_a, out_b])
out = Dense(1, activation='sigmoid')(concatenated)

classification_model = Model([digit_a, digit_b], out)

視覺(jué)問(wèn)答模型

當(dāng)被問(wèn)及關(guān)于圖片的自然語(yǔ)言問(wèn)題時(shí)微酬,該模型可以選擇正確的單詞作答。

它通過(guò)將問(wèn)題和圖像編碼成向量比吭,然后連接兩者,在上面訓(xùn)練一個(gè)邏輯回歸涕癣,來(lái)從詞匯表中挑選一個(gè)可能的單詞作答氢惋。

from keras.layers import Conv2D, MaxPooling2D, Flatten
from keras.layers import Input, LSTM, Embedding, Dense
from keras.models import Model, Sequential

# 首先来屠,讓我們用 Sequential 來(lái)定義一個(gè)視覺(jué)模型嫂粟。
# 這個(gè)模型會(huì)把一張圖像編碼為向量。
vision_model = Sequential()
vision_model.add(Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=(224, 224, 3)))
vision_model.add(Conv2D(64, (3, 3), activation='relu'))
vision_model.add(MaxPooling2D((2, 2)))
vision_model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
vision_model.add(Conv2D(128, (3, 3), activation='relu'))
vision_model.add(MaxPooling2D((2, 2)))
vision_model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
vision_model.add(Conv2D(256, (3, 3), activation='relu'))
vision_model.add(Conv2D(256, (3, 3), activation='relu'))
vision_model.add(MaxPooling2D((2, 2)))
vision_model.add(Flatten())

# 現(xiàn)在讓我們用視覺(jué)模型來(lái)得到一個(gè)輸出張量:
image_input = Input(shape=(224, 224, 3))
encoded_image = vision_model(image_input)

# 接下來(lái),定義一個(gè)語(yǔ)言模型來(lái)將問(wèn)題編碼成一個(gè)向量。
# 每個(gè)問(wèn)題最長(zhǎng) 100 個(gè)詞庐冯,詞的索引從 1 到 9999.
question_input = Input(shape=(100,), dtype='int32')
embedded_question = Embedding(input_dim=10000, output_dim=256, input_length=100)(question_input)
encoded_question = LSTM(256)(embedded_question)

# 連接問(wèn)題向量和圖像向量:
merged = keras.layers.concatenate([encoded_question, encoded_image])

# 然后在上面訓(xùn)練一個(gè) 1000 詞的邏輯回歸模型:
output = Dense(1000, activation='softmax')(merged)

# 最終模型:
vqa_model = Model(inputs=[image_input, question_input], outputs=output)

# 下一步就是在真實(shí)數(shù)據(jù)上訓(xùn)練模型墨林。

視頻問(wèn)答模型

現(xiàn)在我們已經(jīng)訓(xùn)練了圖像問(wèn)答模型,我們可以很快地將它轉(zhuǎn)換為視頻問(wèn)答模型鲸睛。在適當(dāng)?shù)挠?xùn)練下,你可以給它展示一小段視頻(例如 100 幀的人體動(dòng)作)刽虹,然后問(wèn)它一個(gè)關(guān)于這段視頻的問(wèn)題(例如胖缤,「這個(gè)人在做什么運(yùn)動(dòng)?」 -> 「足球」)阀圾。

from keras.layers import TimeDistributed

video_input = Input(shape=(100, 224, 224, 3))
# 這是基于之前定義的視覺(jué)模型(權(quán)重被重用)構(gòu)建的視頻編碼
encoded_frame_sequence = TimeDistributed(vision_model)(video_input)  # 輸出為向量的序列
encoded_video = LSTM(256)(encoded_frame_sequence)  # 輸出為一個(gè)向量

# 這是問(wèn)題編碼器的模型級(jí)表示哪廓,重復(fù)使用與之前相同的權(quán)重:
question_encoder = Model(inputs=question_input, outputs=encoded_question)

# 讓我們用它來(lái)編碼這個(gè)問(wèn)題:
video_question_input = Input(shape=(100,), dtype='int32')
encoded_video_question = question_encoder(video_question_input)

# 這就是我們的視頻問(wèn)答模式:
merged = keras.layers.concatenate([encoded_video, encoded_video_question])
output = Dense(1000, activation='softmax')(merged)
video_qa_model = Model(inputs=[video_input, video_question_input], outputs=output)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市初烘,隨后出現(xiàn)的幾起案子涡真,更是在濱河造成了極大的恐慌分俯,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哆料,死亡現(xiàn)場(chǎng)離奇詭異缸剪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)东亦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門杏节,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人典阵,你說(shuō)我怎么就攤上這事奋渔。” “怎么了壮啊?”我有些...
    開(kāi)封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵嫉鲸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我歹啼,道長(zhǎng)玄渗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任染突,我火速辦了婚禮捻爷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘份企。我一直安慰自己也榄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布司志。 她就那樣靜靜地躺著甜紫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骂远。 梳的紋絲不亂的頭發(fā)上囚霸,一...
    開(kāi)封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音激才,去河邊找鬼拓型。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瘸恼,可吹牛的內(nèi)容都是我干的劣挫。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼东帅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼压固!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起靠闭,我...
    開(kāi)封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤帐我,失蹤者是張志新(化名)和其女友劉穎坎炼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拦键,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谣光,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矿咕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抢肛。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖碳柱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情熬芜,我是刑警寧澤莲镣,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站涎拉,受9級(jí)特大地震影響瑞侮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鼓拧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一半火、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧季俩,春花似錦钮糖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至酪我,卻和暖如春消痛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背都哭。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工秩伞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人欺矫。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓纱新,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親汇陆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怒炸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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