TensorFlow

TF高级别API TF.Learn    http://tflearn.org/

从零开始学TF-Learn 

https://blog.csdn.net/u013745804/article/details/78285166

https://blog.csdn.net/u013745804/article/details/78291425


TensorFlow入门

TensorFlow是Google公司2015年11月开源的第二代深度学习框架,是第一代框架DistBelief的改进版本.

TensorFlow支持python和c/c++语言, 可以在cpu或gpu上进行运算, 支持使用virtualenv或docker打包发布.

TensorFlow并不是一个纯粹的神经网络框架, 而是使用数据流图进行数值分析的框架.

TensorFlow使用有向图(graph)表示一个计算任务.图的节点称为ops(operations)表示对数据的处理,图的边flow 描述数据的流向.

该框架计算过程就是处理tensor组成的流. 这也是TensorFlow名称的来源.

TensorFlow使用tensor表示数据. tensor意为张量即高维数组,在python中使用numpy.ndarray表示.

TensorFlow使用Session执行图, 使用Variable维护状态.tf.constant是只能输出的ops, 常用作数据源.


在TensorFlow的世界里,变量的定义和初始化是分开的,所有关于图变量的赋值和计算都要通过tf.Session的run来进行。想要将所有图变量进行集体初始化时应该使用tf.global_variables_initializer


用TensorFlow实现一个简单神经网络

Neural Network Demo powered by tensorflow

import tensorflow as tf

import numpy as np

def make_layer(inputs, in_size, out_size,activate=None):

  weights = tf.Variable(tf.random_normal([in_size, out_size]))

    basis= tf.Variable(tf.zeros([1, out_size]) + 0.1)

  result = tf.matmul(inputs, weights) + basis

    ifactivate is None:

      return result

    else:

      return activate(result)

class BPNeuralNetwork:

    def__init__(self):

      self.input_layer = None

      self.label_layer = None

      self.loss = None

      self.optimizer = None

      self.layers = []

    def train(self, cases, labels, limit=100, learn_rate=0.05):

        #build network

      self.input_layer = tf.placeholder(tf.float32, [None, 2])

      self.label_layer = tf.placeholder(tf.float32, [None, 1])

      self.layers.append(make_layer(self.input_layer, 2, 10,activate=tf.nn.relu))

      self.layers.append(make_layer(self.layers[0], 10, 2, activate=None))

      self.loss = tf.reduce_mean(tf.reduce_sum(tf.square((self.label_layer -self.layers[1])), reduction_indices=[1]))

      self.optimizer =tf.train.GradientDescentOptimizer(learn_rate).minimize(self.loss)

        # do training

      self.session.run(tf.initialize_all_variables())

      for i in range(limit):

          self.session.run(self.optimizer, feed_dict={self.input_layer: cases,self.label_layer: labels})

    defpredict(self, case):

      return self.session.run(self.layers[-1], feed_dict={self.input_layer:case})

    deftest(self):

      x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])

      y_data = np.array([[0, 1, 1, 0]]).transpose()

      test_data = np.array([[0, 1]])

      self.train(x_data, y_data)

      print self.predict(test_data)

def main():

    withtf.Session() as session:

      model = BPNeuralNetwork()

      model.session = session

      model.test()


TensorFlow的reduce_sum()函数


调用reduce_sum(arg1, arg2)时,参数arg1即为要求和的数据,arg2有两个取值分别为0和1,通常用reduction_indices=[0]或reduction_indices=[1]来传递参数。从上图可以看出,当arg2 = 0时,是纵向对矩阵求和,原来矩阵有几列就得到几个值;相似地,当arg2 = 1时,是横向对矩阵求和;当省略arg2参数时,默认对矩阵所有元素进行求和。

看到这里,函数名的前缀为什么是reduce_其实也就很容易理解了,reduce就是“对矩阵降维”的含义,下划线后面的部分就是降维的方式,在reduce_sum()中就是按照求和的方式对矩阵降维。那么其他reduce前缀的函数也举一反三了,比如reduce_mean()就是按照某个维度求平均值,等等。


E:\Anaconda3\lib\site-packages\h5py\__init__.py:36:FutureWarning: Conversion of the second argument of issubdtype from `float` to`np.floating` is deprecated. In future, it will be treated as `np.float64 ==np.dtype(float).type`. from ._conv import register_converters as_register_converters

anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包,Anaconda的下载文件比较大(约515 MB),如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版(仅包含conda和 Python)。

安装TensorFlow

基于 Anaconda 的安装

Anaconda 是一个集成许多第三方科学计算库的Python 科学计算环境,Anaconda使用 conda 作为自己的包管理工具,同时具有自己的计算环境,类似Virtualenv.

和Virtualenv 一样,不同 Python 工程需要的依赖包,conda 将他们存储在不同的地方。 TensorFlow 上安装的 Anaconda 不会对之前安装的 Python 包进行覆盖.

- 安装Anaconda

- 建立一个 conda 计算环境

- 激活环境,使用conda 安装TensorFlow

- 安装成功后,每次使用TensorFlow 的时候需要激活conda 环境

安装Anaconda :

参考 Anaconda 的下载页面的指导

建立一个 conda 计算环境名字叫tensorflow:

激活tensorflow环境,然后使用其中的 pip 安装 TensorFlow. 当使用easy_install使用--ignore-installed标记防止错误的产生。


ValueError: Cannot feed value of shape (200,)

for Tensor 'Placeholder_32:0', which has shape '(?, 1)'

I am new to tensorflow. This code isjust for a simple neural network. I think the problem maybe is from:

x_data =np.linspace(-0.5,0.5,200)[:np..newaxis]

I tried to write without [:np.newaxis], but it looks like the same.


1 Answer

Thedefined placeholders (both x and y) are 2-dimensional, so you should reshape the inputarrays to rank 2. Try to add this:

x_data = x_data.reshape([-1,1])

y_data = y_data.reshape([-1,1])


Tensorflow: You must feed a value for placeholder tensor'inputs/y_input' with dtype float and shape

从字面理解是:你必须给占位符y_input喂入一个向量值即赋值


交叉熵(Cross Entropy)是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的差异性信息,将交叉熵引入计算语言学消岐领域,采用语句的真实语义作为交叉熵的训练集的先验信息,将机器翻译的语义作为测试集后验信息。计算两者的交叉熵,并以交叉熵指导对歧义的辨识和消除。实例表明,该方法简洁有效


tf.reduce_mean

一,tensorflow中有一类在tensor的某一维度上求值的函数。如:

求最大值tf.reduce_max(input_tensor, reduction_indices=None,keep_dims=False, name=None)

求平均值tf.reduce_mean(input_tensor, reduction_indices=None,keep_dims=False, name=None)

举例说明:

# 'x' is [[1., 2.]

          [3., 4.]]

x是一个2维数组,分别调用reduce_*函数如下:

首先求平均值:

tf.reduce_mean(x) ==> 2.5 #如果不指定第二个参数,那么就在所有的元素中取平均值

tf.reduce_mean(x, 0) ==> [2., 3.]

#指定第二个参数为0,则第一维的元素取平均值,即每一列求平均值

tf.reduce_mean(x, 1) ==> [1.5,3.5]  #指定第二个参数为1,则第二维的元素取平均值,即每一行求平均值  同理,还可用tf.reduce_max()求最大值等。


tf.argmax 返回张量在某一维度上最大值的索引值

图片发自简书App


图片发自简书App


图片发自简书App








Colaboratory可以让你在浏览器中运行 TensorFlow 程序

Colaboratory是一种数据分析工具,可将文字、代码和代码输出内容合并到一个协作文档中。

借助 Colaboratory,您只需点击一下鼠标,即可在浏览器中执行 TensorFlow 代码。

Colaboratory 包含很多已被广泛使用的库(例如 matplotlib),因而能够简化数据的可视化过程。

Colaboratory 可与 Google Cloud BigQuery 结合使用。

要运行此程序,请执行以下操作

点击代码块中的任意位置(例如,点击字词 import)。

点击代码块左上角的右向三角图标,或按 ⌘/Ctrl+Enter 键。

程序需要几秒钟才会运行。

整个程序仅包含一个代码块。不过,大部分练习都会包含多个代码块,在这种情况下,您应按从上到下的顺序逐个运行代码块

不按顺序运行代码块通常会导致错误。

实用的键盘快捷键

/Ctrl+mb在当前选择的单元格下方创建一个空白代码单元格

/Ctrl+mi中断单元格的运行

/Ctrl+mh显示所有键盘快捷键列表

要查看关于任何 TensorFlow API 方法的文档,请将光标放置在其左括号的正后方,然后按Tab键:


广播

在数学中,您只能对形状相同的张量执行元素级运算(例如,相加等于)。不过,在 TensorFlow 中,您可以对张量执行传统意义上不可行的运算。TensorFlow支持广播(一种借鉴自 Numpy 的概念)。利用广播,元素级运算中的较小数组会增大到与较大数组具有相同的形状。

张量变形

由于张量加法和矩阵乘法均对运算数施加了限制条件,TensorFlow编程者肯定会频繁改变张量的形状。

您可以使用 tf.reshape 方法改变张量的形状。 例如,您可以将 8x2 张量变形为 2x8 张量或 4x4 张量

变量、初始化和赋值

到目前为止,我们执行的所有运算都是针对静态值(tf.constant)进行的;调用 eval() 始终返回同一结果。在TensorFlow 中可以定义 Variable 对象,它的值是可以更改的。

创建变量时,您可以明确设置一个初始值,也可以使用初始化程序


张量处理器(英语:tensor processing unit,缩写:TPU)是Google机器学习定制的专用芯片(ASIC),专为Google的深度学习框架TensorFlow而设计。

图形处理器(GPU)相比,TPU采用低精度(8位)计算,以降低每步操作使用的晶体管数量。降低精度对于深度学习的准确度影响很小,但却可以大幅降低功耗、加快运算速度。同时,TPU使用了脉动阵列(英语:Systolic array)的设计,用来优化矩阵乘法卷积运算,减少I/O操作。此外,TPU还采用了更大的片上内存,以此减少对DRAM的访问,从而更大程度地提升性能。


Google在2016年的Google I/O年会上首次公布了TPU。不过在此之前TPU已在Google内部的一些项目中使用了一年多,如Google街景服务RankBrain(英语:RankBrain)以及其旗下DeepMind公司的围棋软件AlphaGo等都用到了TPU。[2][3]而在2017年的Google

I/O年会上,Google又公布了第二代TPU,并将其部署在Google云平台之上。第二代TPU的浮点运算能力高达每秒180万亿次。

第一代

第一代的TPU使用8-bit矩阵乘法引擎,透过PCIe 3.0与CISC指令操作。晶片为28nm制程,die ≤ 331 mm2,700 Mhz,功耗在28至40瓦。

第二代

第二代于2017年五月发表。

第三代

第三代于2018年五月发表。


TensorFlow DNN for regression


from __future__ import absolute_import

from __future__ import division

from __future__ import print_function


import tensorflow as tf

from tensorflow.contrib import learn

import matplotlib.pyplot as plt


from sklearn.pipeline import Pipeline

from sklearn import datasets, linear_model

from sklearn import cross_validation

import numpy as np


boston = learn.datasets.load_dataset('boston')

x, y = boston.data, boston.target

X_train, X_test, Y_train, Y_test = cross_validation.train_test_split(

x, y, test_size=0.2, random_state=42)


total_len = X_train.shape[0]


# Parameters

learning_rate = 0.001

training_epochs = 500

batch_size = 10

display_step = 1

dropout_rate = 0.9

# Network Parameters

n_hidden_1 = 32 # 1st layer number of features

n_hidden_2 = 200 # 2nd layer number of features

n_hidden_3 = 200

n_hidden_4 = 256

n_input = X_train.shape[1]

n_classes = 1


# tf Graph input

x = tf.placeholder("float", [None,13])

y = tf.placeholder("float", [None])


# Create model

def multilayer_perceptron(x, weights, biases):

    #Hidden layer with RELU activation

  layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1'])

  layer_1 = tf.nn.relu(layer_1)


    #Hidden layer with RELU activation

  layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2'])

  layer_2 = tf.nn.relu(layer_2)


    #Hidden layer with RELU activation

  layer_3 = tf.add(tf.matmul(layer_2, weights['h3']), biases['b3'])

  layer_3 = tf.nn.relu(layer_3)


    #Hidden layer with RELU activation

  layer_4 = tf.add(tf.matmul(layer_3, weights['h4']), biases['b4'])

  layer_4 = tf.nn.relu(layer_4)


    #Output layer with linear activation

  out_layer = tf.matmul(layer_4, weights['out']) + biases['out']

  return out_layer


# Store layers weight & bias

weights = {

    'h1':tf.Variable(tf.random_normal([n_input, n_hidden_1], 0, 0.1)),

    'h2':tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2], 0, 0.1)),

    'h3':tf.Variable(tf.random_normal([n_hidden_2, n_hidden_3], 0, 0.1)),

    'h4':tf.Variable(tf.random_normal([n_hidden_3, n_hidden_4], 0, 0.1)),

  'out': tf.Variable(tf.random_normal([n_hidden_4, n_classes], 0, 0.1))

}

biases = {

    'b1':tf.Variable(tf.random_normal([n_hidden_1], 0, 0.1)),

    'b2':tf.Variable(tf.random_normal([n_hidden_2], 0, 0.1)),

    'b3':tf.Variable(tf.random_normal([n_hidden_3], 0, 0.1)),

    'b4':tf.Variable(tf.random_normal([n_hidden_4], 0, 0.1)),

  'out': tf.Variable(tf.random_normal([n_classes], 0, 0.1))

}


# Construct model

pred = multilayer_perceptron(x, weights,biases)


# Define loss and optimizer

cost = tf.reduce_mean(tf.square(pred-y))

optimizer =tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)


# Launch the graph

with tf.Session() as sess:

  sess.run(tf.initialize_all_variables())


    #Training cycle

    forepoch in range(training_epochs):

      avg_cost = 0.

      total_batch = int(total_len/batch_size)

        #Loop over all batches

      for i in range(total_batch-1):

          batch_x = X_train[i*batch_size:(i+1)*batch_size]

          batch_y = Y_train[i*batch_size:(i+1)*batch_size]

          # Run optimization op (backprop) and cost op (to get loss value)

          _, c, p = sess.run([optimizer, cost, pred], feed_dict={x: batch_x,

                                                        y:batch_y})

          # Compute average loss

          avg_cost += c / total_batch


        #sample prediction

      label_value = batch_y

      estimate = p

      err = label_value-estimate

        print ("num batch:", total_batch)


        #Display logs per epoch step

      if epoch % display_step == 0:

          print ("Epoch:", '%04d' % (epoch+1), "cost=", \

              "{:.9f}".format(avg_cost))

          print ("[*]----------------------------")

          for i in xrange(3):

              print ("label value:", label_value[i], \

                    "estimatedvalue:", estimate[i])

          print ("[*]============================")


    print("Optimization Finished!")


    #Test model

  correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))

    #Calculate accuracy

  accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float"))

    print("Accuracy:", accuracy.eval({x: X_test, y: Y_test}))


TensorFlow回归

在运行到 loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(output,Y))

时,报错:

ValueError: Only call sigmoid_cross_entropy_with_logitswith named arguments (labels=…, logits=…, …)

应该改为

loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=output,logits=Y))


tensorflowtf.random_normaltf.truncated_normal的区别

1、tf.truncated_normal使用方法

tf.truncated_normal(shape, mean=0.0, stddev=1.0,dtype=tf.float32, seed=None, name=None)

从截断的正态分布中输出随机值。生成的值服从具有指定平均值和标准偏差的正态分布,如果生成的值大于平均值2个标准偏差的值则丢弃重新选择。

在正态分布的曲线中,横轴区间(μ-σ,μ+σ)内的面积为68.268949%。横轴区间(μ-2σ,μ+2σ)内的面积为95.449974%。横轴区间(μ-3σ,μ+3σ)内的面积为99.730020%。

X落在(μ-3σ,μ+3σ)以外的概率小于千分之三,在实际问题中常认为相应的事件是不会发生的,基本上可以把区间(μ-3σ,μ+3σ)看作是随机变量X实际可能的取值区间,这称之为正态分布的“3σ”原则。在tf.truncated_normal中如果x的取值在区间(μ-2σ,μ+2σ)之外则重新进行选择。这样保证了生成的值都在均值附近。

参数:

shape:一维的张量,也是输出的张量。

mean:正态分布的均值。

stddev:正态分布的标准差。

dtype:输出的类型。

seed:一个整数,当设置之后,每次生成的随机数都一样。

name:操作的名字


2、tf.random_normal使用方法


tf.random_normal(shape, mean=0.0, stddev=1.0,

dtype=tf.float32, seed=None, name=None)

从正态分布中输出随机值。参数:

shape:一维的张量,也是输出的张量。

mean:正态分布的均值。

stddev:正态分布的标准差。

dtype:输出的类型。

seed:一个整数,当设置之后,每次生成的随机数都一样。

name:操作的名字。

代码

a = tf.Variable(tf.random_normal([2,2],seed=1))

b = tf.Variable(tf.truncated_normal([2,2],seed=2))

init = tf.global_variables_initializer()

with tf.Session() as sess:

sess.run(init)

print(sess.run(a))

print(sess.run(b))

输出:

[[-0.81131822  1.48459876]

[ 0.06532937 -2.44270396]]

[[-0.85811085 -0.19662298]

[ 0.13895047 -1.22127688]]


tf.cast TensorFlow中的类型转换函数 cast(x, dtype, name=None) #将x的数据格式转换成dtype


tensorflow中的图上的节点称之为operations或者ops。我们可以使用 graph.get_operations()命令来获取图中的operations.

tf.matrix_solve(matrix, rhs, adjoint=None, name=None)

求解tf.matrix_solve(matrix,rhs, adjoint=None, name=None) matrix为方阵 shape为[M,M], rhs的shape为[M,K],output为[M,K]


Tensorflow:AttributeError: 'module' object has no attribute 'mul'

tensorflow 版本为1.0.1后,

将tf.mul替换为tf.multiply后,错误问题解决。


Tensorflow中随机数生成种子tf.set_random_seed()

Tensorflow中的随机数生成种子是在数据流图资源上运作的。每一个数据流图中,我们可以执行针对随机数生成种子应用不同的操作(operation)。事实上,随机数生成种子作为random系列函数的参数之一,可在相应的参数列表进行设置,这就是op-level的操作。与之对应的是graph-level的操作tf.set_random_seed(),它管理着同一数据流图下的资源。

tensorflow中设置随机种子,可分为两类,图级seed和操作级seed, 情况1:当没有设置图级seed和操作级seed时,生成的随机数是随机的 情况2:当设置操作级seed时,生成的随机数是同一组随机数,没有设置操作级seed的操作,生成的随机数是随机的 情况3:当设置图级seed,将会生成同一组随机数,如果设置操作级seed又和情况2相同

tf.random_normal()函数

用于从服从指定正太分布的数值中取出指定个数的值。

tf.random_normal(shape,mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)

  shape: 输出张量的形状,必选

  mean: 正态分布的均值,默认为0

  stddev: 正态分布的标准差,默认为1.0

  dtype: 输出的类型,默认为tf.float32

  seed: 随机数种子,是一个整数,当设置之后,每次生成的随机数都一样

  name: 操作的名称


tf.random_uniform 函数

从均匀分布中输出随机值。

生成的值在该 [minval,

maxval) 范围内遵循均匀分布。下限 minval 包含在范围内,而上限 maxval 被排除在外。

对于浮点数,默认范围是 [0, 1)。对于整数,至少 maxval 必须明确地指定。

在整数情况下,随机整数稍有偏差,除非 maxval -

minval 是 2 的精确幂。对于maxval - minval的值,偏差很小,明显小于输出(2**32 或者 2**64)的范围。

参数:

shape:一维整数张量或 Python 数组。输出张量的形状。

minval:dtype 类型的 0-D 张量或 Python 值;生成的随机值范围的下限;默认为0。

maxval:dtype 类型的 0-D 张量或 Python 值。要生成的随机值范围的上限。如果 dtype 是浮点,则默认为1 。

dtype:输出的类型:float16、float32、float64、int32、orint64。

seed:一个 Python 整数。用于为分布创建一个随机种子。查看 tf.set_random_seed 行为。

name:操作的名称(可选)。

返回:

用于填充随机均匀值的指定形状的张量。

可能引发的异常:

ValueError:如果 dtype 是整数并且 maxval 没有被指定。


TensorFlow四舍五入:tf.round函数

tf.round 函数

round(x,name=None)

定义在:tensorflow/python/ops/math_ops.py

请参阅指南:数学函数>基本数学函数

将张量的值四舍五入为最接近的整数,元素。

均匀的舍入。也被称为banker四舍五入。如果要根据当前系统舍入模式进行舍入,请使用tf ::

cint。例如:

x = tf.constant([0.9, 2.5, 2.3, 1.5, -4.5])

tf.round(x)  # [1.0, 2.0, 2.0, 2.0, -4.0 ]

参数:

x:一个Tensor,类型必须为float32或float64。

name:操作的名称(可选)。

返回:

tf.round函数返回一个与x具有相同的形状和类型的Tensor。

tf.round(x,name=None) 舍入最接近的整数

# ‘a’ is [0.9, 2.5, 2.3, -4.4]

tf.round(a) ==> [ 1.0, 3.0, 2.0, -4.0 ]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容