一文學(xué)會(huì)用 Tensorflow 搭建神經(jīng)網(wǎng)絡(luò)


cs224d-Day 6: 快速入門(mén) Tensorflow

本文是學(xué)習(xí)這個(gè)視頻課程系列的筆記,課程鏈接是 youtube 上的,
講的很好,淺顯易懂,入門(mén)首選, 而且在github有代碼,
想看視頻的也可以去他的優(yōu)酷里的頻道找。

Tensorflow 官網(wǎng)


神經(jīng)網(wǎng)絡(luò)是一種數(shù)學(xué)模型,是存在于計(jì)算機(jī)的神經(jīng)系統(tǒng),由大量的神經(jīng)元相連接并進(jìn)行計(jì)算,在外界信息的基礎(chǔ)上,改變內(nèi)部的結(jié)構(gòu),常用來(lái)對(duì)輸入和輸出間復(fù)雜的關(guān)系進(jìn)行建模。

神經(jīng)網(wǎng)絡(luò)由大量的節(jié)點(diǎn)和之間的聯(lián)系構(gòu)成,負(fù)責(zé)傳遞信息和加工信息,神經(jīng)元也可以通過(guò)訓(xùn)練而被強(qiáng)化。

這個(gè)圖就是一個(gè)神經(jīng)網(wǎng)絡(luò)系統(tǒng),它由很多層構(gòu)成。輸入層就是負(fù)責(zé)接收信息,比如說(shuō)一只貓的圖片。輸出層就是計(jì)算機(jī)對(duì)這個(gè)輸入信息的認(rèn)知,它是不是貓。隱藏層就是對(duì)輸入信息的加工處理。

神經(jīng)網(wǎng)絡(luò)是如何被訓(xùn)練的,首先它需要很多數(shù)據(jù)。比如他要判斷一張圖片是不是貓。就要輸入上千萬(wàn)張的帶有標(biāo)簽的貓貓狗狗的圖片,然后再訓(xùn)練上千萬(wàn)次。

神經(jīng)網(wǎng)絡(luò)訓(xùn)練的結(jié)果有對(duì)的也有錯(cuò)的,如果是錯(cuò)誤的結(jié)果,將被當(dāng)做非常寶貴的經(jīng)驗(yàn),那么是如何從經(jīng)驗(yàn)中學(xué)習(xí)的呢?就是對(duì)比正確答案和錯(cuò)誤答案之間的區(qū)別,然后把這個(gè)區(qū)別反向的傳遞回去,對(duì)每個(gè)相應(yīng)的神經(jīng)元進(jìn)行一點(diǎn)點(diǎn)的改變。那么下一次在訓(xùn)練的時(shí)候就可以用已經(jīng)改進(jìn)一點(diǎn)點(diǎn)的神經(jīng)元去得到稍微準(zhǔn)確一點(diǎn)的結(jié)果。

神經(jīng)網(wǎng)絡(luò)是如何訓(xùn)練的呢?每個(gè)神經(jīng)元都有屬于它的激活函數(shù),用這些函數(shù)給計(jì)算機(jī)一個(gè)刺激行為。

在第一次給計(jì)算機(jī)看貓的圖片的時(shí)候,只有部分的神經(jīng)元被激活,被激活的神經(jīng)元所傳遞的信息是對(duì)輸出結(jié)果最有價(jià)值的信息。如果輸出的結(jié)果被判定為是狗,也就是說(shuō)是錯(cuò)誤的了,那么就會(huì)修改神經(jīng)元,一些容易被激活的神經(jīng)元會(huì)變得遲鈍,另外一些神經(jīng)元會(huì)變得敏感。這樣一次次的訓(xùn)練下去,所有神經(jīng)元的參數(shù)都在被改變,它們變得對(duì)真正重要的信息更為敏感。

**Tensorflow **是谷歌開(kāi)發(fā)的深度學(xué)習(xí)系統(tǒng),用它可以很快速地入門(mén)神經(jīng)網(wǎng)絡(luò)。

它可以做分類(lèi),也可以做擬合問(wèn)題,就是要把這個(gè)模式給模擬出來(lái)。

這是一個(gè)基本的神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),有輸入層,隱藏層,和輸出層。
每一層點(diǎn)開(kāi)都有它相應(yīng)的內(nèi)容,函數(shù)和功能。

那我們要做的就是要建立一個(gè)這樣的結(jié)構(gòu),然后把數(shù)據(jù)喂進(jìn)去。
把數(shù)據(jù)放進(jìn)去后它就可以自己運(yùn)行,TensorFlow 翻譯過(guò)來(lái)就是向量在里面飛。

這個(gè)動(dòng)圖的解釋就是,在輸入層輸入數(shù)據(jù),然后數(shù)據(jù)飛到隱藏層飛到輸出層,用梯度下降處理,梯度下降會(huì)對(duì)幾個(gè)參數(shù)進(jìn)行更新和完善,更新后的參數(shù)再次跑到隱藏層去學(xué)習(xí),這樣一直循環(huán)直到結(jié)果收斂。

tensors_flowing.gif

今天一口氣把整個(gè)系列都學(xué)完了,先來(lái)一段完整的代碼,然后解釋重要的知識(shí)點(diǎn)!


1. 搭建神經(jīng)網(wǎng)絡(luò)基本流程

定義添加神經(jīng)層的函數(shù)

1.訓(xùn)練的數(shù)據(jù)
2.定義節(jié)點(diǎn)準(zhǔn)備接收數(shù)據(jù)
3.定義神經(jīng)層:隱藏層和預(yù)測(cè)層
4.定義 loss 表達(dá)式
5.選擇 optimizer 使 loss 達(dá)到最小

然后對(duì)所有變量進(jìn)行初始化,通過(guò) sess.run optimizer,迭代 1000 次進(jìn)行學(xué)習(xí):

import tensorflow as tf
import numpy as np

# 添加層
def add_layer(inputs, in_size, out_size, activation_function=None):
   # add one more layer and return the output of this layer
   Weights = tf.Variable(tf.random_normal([in_size, out_size]))
   biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
   Wx_plus_b = tf.matmul(inputs, Weights) + biases
   if activation_function is None:
       outputs = Wx_plus_b
   else:
       outputs = activation_function(Wx_plus_b)
   return outputs

# 1.訓(xùn)練的數(shù)據(jù)
# Make up some real data 
x_data = np.linspace(-1,1,300)[:, np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape)
y_data = np.square(x_data) - 0.5 + noise

# 2.定義節(jié)點(diǎn)準(zhǔn)備接收數(shù)據(jù)
# define placeholder for inputs to network  
xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])

# 3.定義神經(jīng)層:隱藏層和預(yù)測(cè)層
# add hidden layer 輸入值是 xs,在隱藏層有 10 個(gè)神經(jīng)元   
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
# add output layer 輸入值是隱藏層 l1,在預(yù)測(cè)層輸出 1 個(gè)結(jié)果
prediction = add_layer(l1, 10, 1, activation_function=None)

# 4.定義 loss 表達(dá)式
# the error between prediciton and real data    
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
                    reduction_indices=[1]))

# 5.選擇 optimizer 使 loss 達(dá)到最小                   
# 這一行定義了用什么方式去減少 loss,學(xué)習(xí)率是 0.1       
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)


# important step 對(duì)所有變量進(jìn)行初始化
init = tf.initialize_all_variables()
sess = tf.Session()
# 上面定義的都沒(méi)有運(yùn)算,直到 sess.run 才會(huì)開(kāi)始運(yùn)算
sess.run(init)

# 迭代 1000 次學(xué)習(xí),sess.run optimizer
for i in range(1000):
   # training train_step 和 loss 都是由 placeholder 定義的運(yùn)算,所以這里要用 feed 傳入?yún)?shù)
   sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
   if i % 50 == 0:
       # to see the step improvement
       print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))


2. 主要步驟的解釋?zhuān)?/h3>
  • 之前寫(xiě)過(guò)一篇文章 TensorFlow 入門(mén) 講了 tensorflow 的安裝,這里使用時(shí)直接導(dǎo)入:
import tensorflow as tf
import numpy as np
  • 導(dǎo)入或者隨機(jī)定義訓(xùn)練的數(shù)據(jù) x 和 y:
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data*0.1 + 0.3
  • 先定義出參數(shù) Weights,biases,擬合公式 y,誤差公式 loss:
Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
biases = tf.Variable(tf.zeros([1]))
y = Weights*x_data + biases
loss = tf.reduce_mean(tf.square(y-y_data))
  • 選擇 Gradient Descent 這個(gè)最基本的 Optimizer:
optimizer = tf.train.GradientDescentOptimizer(0.5)
  • 神經(jīng)網(wǎng)絡(luò)的 key idea,就是讓 loss 達(dá)到最小:
train = optimizer.minimize(loss)
  • 前面是定義,在運(yùn)行模型前先要初始化所有變量:
init = tf.initialize_all_variables()
  • 接下來(lái)把結(jié)構(gòu)激活,sesseion像一個(gè)指針指向要處理的地方:
sess = tf.Session()
  • init 就被激活了,不要忘記激活:
sess.run(init) 
  • 訓(xùn)練201步:
for step in range(201):
  • 要訓(xùn)練 train,也就是 optimizer:
sess.run(train)
  • 每 20 步打印一下結(jié)果,sess.run 指向 Weights,biases 并被輸出:
if step % 20 == 0:
print(step, sess.run(Weights), sess.run(biases))

所以關(guān)鍵的就是 y,loss,optimizer 是如何定義的。


3. TensorFlow 基本概念及代碼:

TensorFlow 入門(mén) 也提到了幾個(gè)基本概念,這里是幾個(gè)常見(jiàn)的用法。

  • Session

矩陣乘法:tf.matmul

product = tf.matmul(matrix1, matrix2) # matrix multiply np.dot(m1, m2)

定義 Session,它是個(gè)對(duì)象,注意大寫(xiě):

sess = tf.Session()

result 要去 sess.run 那里取結(jié)果:

result = sess.run(product)
  • Variable

用 tf.Variable 定義變量,與python不同的是,必須先定義它是一個(gè)變量,它才是一個(gè)變量,初始值為0,還可以給它一個(gè)名字 counter:

state = tf.Variable(0, name='counter')

將 new_value 加載到 state 上,counter就被更新:

update = tf.assign(state, new_value)

如果有變量就一定要做初始化:

init = tf.initialize_all_variables() # must have if define variable
  • placeholder:

要給節(jié)點(diǎn)輸入數(shù)據(jù)時(shí)用 placeholder,在 TensorFlow 中用placeholder 來(lái)描述等待輸入的節(jié)點(diǎn),只需要指定類(lèi)型即可,然后在執(zhí)行節(jié)點(diǎn)的時(shí)候用一個(gè)字典來(lái)“喂”這些節(jié)點(diǎn)。相當(dāng)于先把變量 hold 住,然后每次從外部傳入data,注意 placeholder 和 feed_dict 是綁定用的。

這里簡(jiǎn)單提一下 feed 機(jī)制, 給 feed 提供數(shù)據(jù),作為 run()
調(diào)用的參數(shù), feed 只在調(diào)用它的方法內(nèi)有效, 方法結(jié)束, feed 就會(huì)消失。


import tensorflow as tf

input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
ouput = tf.mul(input1, input2)

with tf.Session() as sess:
 print(sess.run(ouput, feed_dict={input1: [7.], input2: [2.]}))

4. 神經(jīng)網(wǎng)絡(luò)基本概念

  • 激勵(lì)函數(shù):

例如一個(gè)神經(jīng)元對(duì)貓的眼睛敏感,那當(dāng)它看到貓的眼睛的時(shí)候,就被激勵(lì)了,相應(yīng)的參數(shù)就會(huì)被調(diào)優(yōu),它的貢獻(xiàn)就會(huì)越大。

下面是幾種常見(jiàn)的激活函數(shù):
x軸表示傳遞過(guò)來(lái)的值,y軸表示它傳遞出去的值:

激勵(lì)函數(shù)在預(yù)測(cè)層,判斷哪些值要被送到預(yù)測(cè)結(jié)果那里:

TensorFlow 常用的 activation function

  • 添加神經(jīng)層:

輸入?yún)?shù)有 inputs, in_size, out_size, 和 activation_function

import tensorflow as tf

def add_layer(inputs, in_size, out_size,  activation_function=None):

  Weights = tf.Variable(tf.random_normal([in_size, out_size]))
  biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
  Wx_plus_b = tf.matmul(inputs, Weights) + biases

  if activation_function is None:
    outputs = Wx_plus_b
  else:
    outputs = activation_function(Wx_plus_b)

return outputs
  • 分類(lèi)問(wèn)題的 loss 函數(shù) cross_entropy :
# the error between prediction and real data
# loss 函數(shù)用 cross entropy
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction),
                                              reduction_indices=[1]))       # loss
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
  • overfitting:

下面第三個(gè)圖就是 overfitting,就是過(guò)度準(zhǔn)確地?cái)M合了歷史數(shù)據(jù),而對(duì)新數(shù)據(jù)預(yù)測(cè)時(shí)就會(huì)有很大誤差:

Tensorflow 有一個(gè)很好的工具, 叫做dropout, 只需要給予它一個(gè)不被 drop 掉的百分比,就能很好地降低 overfitting。

dropout 是指在深度學(xué)習(xí)網(wǎng)絡(luò)的訓(xùn)練過(guò)程中,按照一定的概率將一部分神經(jīng)網(wǎng)絡(luò)單元暫時(shí)從網(wǎng)絡(luò)中丟棄,相當(dāng)于從原始的網(wǎng)絡(luò)中找到一個(gè)更瘦的網(wǎng)絡(luò),這篇博客中講的非常詳細(xì)

代碼實(shí)現(xiàn)就是在 add layer 函數(shù)里加上 dropout, keep_prob 就是保持多少不被 drop,在迭代時(shí)在 sess.run 中被 feed:

def add_layer(inputs, in_size, out_size, layer_name, activation_function=None, ):
    # add one more layer and return the output of this layer
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, )
    Wx_plus_b = tf.matmul(inputs, Weights) + biases
    
    # here to dropout
    # 在 Wx_plus_b 上drop掉一定比例
    # keep_prob 保持多少不被drop,在迭代時(shí)在 sess.run 中 feed
    Wx_plus_b = tf.nn.dropout(Wx_plus_b, keep_prob)
    
    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b, )
    tf.histogram_summary(layer_name + '/outputs', outputs)  
    return outputs

5. 可視化 Tensorboard

Tensorflow 自帶 tensorboard ,可以自動(dòng)顯示我們所建造的神經(jīng)網(wǎng)絡(luò)流程圖:

就是用 with tf.name_scope 定義各個(gè)框架,注意看代碼注釋中的區(qū)別:

import tensorflow as tf


def add_layer(inputs, in_size, out_size, activation_function=None):
    # add one more layer and return the output of this layer
    # 區(qū)別:大框架,定義層 layer,里面有 小部件
    with tf.name_scope('layer'):
        # 區(qū)別:小部件
        with tf.name_scope('weights'):
            Weights = tf.Variable(tf.random_normal([in_size, out_size]), name='W')
        with tf.name_scope('biases'):
            biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, name='b')
        with tf.name_scope('Wx_plus_b'):
            Wx_plus_b = tf.add(tf.matmul(inputs, Weights), biases)
        if activation_function is None:
            outputs = Wx_plus_b
        else:
            outputs = activation_function(Wx_plus_b, )
        return outputs


# define placeholder for inputs to network
# 區(qū)別:大框架,里面有 inputs x,y
with tf.name_scope('inputs'):
    xs = tf.placeholder(tf.float32, [None, 1], name='x_input')
    ys = tf.placeholder(tf.float32, [None, 1], name='y_input')

# add hidden layer
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
# add output layer
prediction = add_layer(l1, 10, 1, activation_function=None)

# the error between prediciton and real data
# 區(qū)別:定義框架 loss
with tf.name_scope('loss'):
    loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
                                        reduction_indices=[1]))

# 區(qū)別:定義框架 train
with tf.name_scope('train'):
    train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

sess = tf.Session()

# 區(qū)別:sess.graph 把所有框架加載到一個(gè)文件中放到文件夾"logs/"里 
# 接著打開(kāi)terminal,進(jìn)入你存放的文件夾地址上一層,運(yùn)行命令 tensorboard --logdir='logs/'
# 會(huì)返回一個(gè)地址,然后用瀏覽器打開(kāi)這個(gè)地址,在 graph 標(biāo)簽欄下打開(kāi)
writer = tf.train.SummaryWriter("logs/", sess.graph)
# important step
sess.run(tf.initialize_all_variables())

運(yùn)行完上面代碼后,打開(kāi) terminal,進(jìn)入你存放的文件夾地址上一層,運(yùn)行命令 tensorboard --logdir='logs/' 后會(huì)返回一個(gè)地址,然后用瀏覽器打開(kāi)這個(gè)地址,點(diǎn)擊 graph 標(biāo)簽欄下就可以看到流程圖了:


6. 保存和加載

訓(xùn)練好了一個(gè)神經(jīng)網(wǎng)絡(luò)后,可以保存起來(lái)下次使用時(shí)再次加載:

import tensorflow as tf
import numpy as np

## Save to file
# remember to define the same dtype and shape when restore
W = tf.Variable([[1,2,3],[3,4,5]], dtype=tf.float32, name='weights')
b = tf.Variable([[1,2,3]], dtype=tf.float32, name='biases')

init= tf.initialize_all_variables()

saver = tf.train.Saver()

# 用 saver 將所有的 variable 保存到定義的路徑
with tf.Session() as sess:
   sess.run(init)
   save_path = saver.save(sess, "my_net/save_net.ckpt")
   print("Save to path: ", save_path)


################################################

# restore variables
# redefine the same shape and same type for your variables
W = tf.Variable(np.arange(6).reshape((2, 3)), dtype=tf.float32, name="weights")
b = tf.Variable(np.arange(3).reshape((1, 3)), dtype=tf.float32, name="biases")

# not need init step

saver = tf.train.Saver()
# 用 saver 從路徑中將 save_net.ckpt 保存的 W 和 b restore 進(jìn)來(lái)
with tf.Session() as sess:
    saver.restore(sess, "my_net/save_net.ckpt")
    print("weights:", sess.run(W))
    print("biases:", sess.run(b))

tensorflow 現(xiàn)在只能保存 variables,還不能保存整個(gè)神經(jīng)網(wǎng)絡(luò)的框架,所以再使用的時(shí)候,需要重新定義框架,然后把 variables 放進(jìn)去學(xué)習(xí)。


[cs224d]

Day 1. 深度學(xué)習(xí)與自然語(yǔ)言處理 主要概念一覽
Day 2. TensorFlow 入門(mén)
Day 3. word2vec 模型思想和代碼實(shí)現(xiàn)
Day 4. 怎樣做情感分析
Day 5. CS224d-Day 5: RNN快速入門(mén)
Day 6. 一文學(xué)會(huì)用 Tensorflow 搭建神經(jīng)網(wǎng)絡(luò)
Day 7. 用深度神經(jīng)網(wǎng)絡(luò)處理NER命名實(shí)體識(shí)別問(wèn)題
Day 8. 用 RNN 訓(xùn)練語(yǔ)言模型生成文本
Day 9. RNN與機(jī)器翻譯
Day 10. 用 Recursive Neural Networks 得到分析樹(shù)
Day 11. RNN的高級(jí)應(yīng)用


ok, 搞定快速入門(mén),明天寫(xiě)用 RNN 做命名實(shí)體識(shí)別。

我是 不會(huì)停的蝸牛 Alice
85后全職主婦
喜歡人工智能,行動(dòng)派
創(chuàng)造力,思考力,學(xué)習(xí)力提升修煉進(jìn)行中
歡迎您的喜歡,關(guān)注和評(píng)論!


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,382評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,038評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,853評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,616評(píng)論 6 408
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,112評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,355評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,869評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,727評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,928評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,165評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,570評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,813評(píng)論 1 282
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,585評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,892評(píng)論 2 372

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