离弦的博客

我若为王,舍我其谁


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

tensorflow学习1

发表于 2018-08-07 | 分类于 tensorflow |

Python安装

下载及安装Anaconda开发工具

  • 找到Anaconda官网,https://www.anaconda.com/download/
阅读全文 »

ImportError:libcudnn.so.5

发表于 2018-07-30 | 分类于 linux |

在运行GPU版的tensorflow时,遇到ImportError: libcudnn.so.5: cannot open shared object file: No such file or directory。我安装的tensorflow-gpu=1.2

阅读全文 »

语言模型

发表于 2018-07-27 | 分类于 ner |

1 Introduction

在实际应用中,我们经常需要解决这样一类问题:如何计算一个橘子的概率?如:

  • 机器翻译:P(high winds tonite) >P(large winds tonite)
  • 拼写纠错:P(about fifteen minutes from) > P(about fifteen minutes from)
  • 语言识别:P(I saw a van) >>P(eyes awe of an)
  • 音字转换:P(你现在在干什么|nixianzaiganshenme)>P(你西安在干什么|nixianzaiganshenme)
  • 自动文摘、问答系统……

以上问题的形式化表示如下:
$$
p(S)=p(w_1,w_2,w_3,w_4,…,w_n)\\=p(w_1)p(w_2|w_1)p(w3|w_1,w_2)…p(w_n|w_1,w_2,…,w_{n-1})
$$
$p(S)$被称为语言模型,即用来计算一个句子概率的模型。

阅读全文 »

在linux上 anaconda3和anaconda2共存的解决办法

发表于 2018-07-10 | 分类于 liunx |

​ 因为需要,有时候用到Python2有时候用到Python3, ,本人之前装的是anaconda3,由于合作伙伴用的是Python2 ,为此为了考虑兼容性,经过三个小时的折腾结合网上的资源整理如下,安装环境是linux2。先根据Ubuntukylin16.04.2安装anaconda3,然后将anaconda2安装到anaconda3的envs文件夹下作为虚拟环境用于切换。

​ 因为在线安装anaconda是很慢的,这里用离线安装方法。请自行到官网下载安装包。(https://www.anaconda.com/download/#linux)

阅读全文 »

Transfer learning for sequence tagging with hierarchical recurrent networks笔记

发表于 2018-07-10 | 分类于 ner |

转载自-李虹磊 基于迁移学习和深度神经网络的序列标注方法

论文题目:Transfer learning for sequence tagging with hierarchical recurrent networks

论文作者:Zhilin Yang, Ruslan Salakhutdinov, William W. Cohen

School of Computer Science Carnegie Mellon University

论文出处:Published as a conference paper at ICLR 2017

摘要

​ 本文利用迁移学习的思想和神经网络模型来解决序列标注问题。使用有大量已标注数据集的任务作为源数据领域,来提升只有少量标注数据的目标任务的性能。本文从跨域、跨应用和跨语言三个迁移设置来验证迁移学习用于深度层级循环神经网络中的性能。实验表明,在深度层级神经网络的基础上使用迁移学习的思想可以显著提高序列标注的性能。

阅读全文 »

Multi-Task Cross-Lingual Sequence Tagging from Scratch笔记

发表于 2018-07-10 | 分类于 ner |

介绍

​ 论文提出了一个深度层叠循环神经网络的序列标注模型,这个模型是任务独立的,语言独立的,以及没有特征工程。论文探索了两种类型的联合训练,在多任务联合训练中,同种语言多个任务连个训练——英文的词性标注和实体识别。在跨语言联合训练中,模型训练同一个任务在不同的语言上——英文和西班牙语中的实体识别。论文表明多任务和跨语言的联合训练可以在不同场景提高性能。

阅读全文 »

Contextual String Embeddings for Sequence Labeling笔记

发表于 2018-07-08 | 分类于 ner |

介绍

​ 使用递归神经网络进行语言建模的最新进展表明基于字符的语言建模是可行的。这篇论文提出利用一个预训练的字符语言模型的内部状态,以产生一种新型的字嵌入,称之为上下文字符串向量。我们提出的embedding有明显的优点:(1)在没有任何明确的词汇概念的情况下进行训练,从根本上将单词作为字符序列建模。(2)由其周围语境上下文化,这意味着相同的单词的embedding将根据其不同的语境的不同而不同。我们对先前的embedding进行比较评估,发现我们的embedding对于下游任务非常有用。在四个经典序列标记任务中,我们始终优于当前最优的结果。

阅读全文 »

Deep contextualized word representations论文笔记

发表于 2018-07-08 | 分类于 ner |

介绍

​ 预训练的词向量是很多神经语言理解模型的关键部分,然而学习高质量的表示是很有挑战性的。一个好的词向量应该包含:(1)能够建模词的复杂字符特征(比如语法和语义),(2)能够在不同语境有不同反映(如多义词)。这篇论文中,引入一种新类型的深度上下文词表示,可以应对这些挑战,并且可以容易与当前存在的模型进行整合,有效提升了一系列有挑战的语言理解问题的最优性能。

阅读全文 »

Semi-supervised sequence tagging with bidirectional language models笔记

发表于 2018-07-06 | 分类于 ner |

介绍

​ 对于NLP任务,从无标签文本中学习预训练的embedding已经是神经网络的一个标准部分。在这篇论文中,提出了将一个双向的语言模型的context embedding引入序列标注任务中,在NER和chunking两个标准数据集上进行了实验,证明了与其他的某些使用迁移学习和使用附加标注数据和特定任务字典的联合学习相比,效果都要好,超过了以往所有的模型。

贡献

  • 主要贡献是表明在LM embedding中捕获的上下文敏感表示在监督序列标记设置中是有用的。

  • 双向的LM embedding比前向的LM embedding效果要好。

阅读全文 »

CNN卷积神经网络对MNIST数据分类

发表于 2018-05-17 |

​ Convolutional Neural Networks (CNN) 是神经网络处理图片信息的一大利器. 因为利用卷积神经网络在图像和语音识别方面能够给出更优预测结果, 这一种技术也被广泛的传播可应用. 卷积神经网络最常被应用的方面是计算机的图像识别, 不过因为不断地创新, 它也被应用在视频分析, 自然语言处理, 药物发现, 等等. 近期最火的 Alpha Go, 让计算机看懂围棋, 同样也是有运用到这门技术。

​ 这里将建立一个卷积神经网络,它可以把MNIST手写字符的识别准确率提高到99%,读者可能需要一些卷积神经网络的基础知识才能更好地理解本节的内容。

​ 程序的开头依旧是导入Tensorflow:

1
2
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

​ 接下来载入MNIST数据集,并建立占位符。占位符x的含义为训练图像,y_为对应训练图像的标签。

1
2
3
4
5
# 读入数据
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# x为训练图像的占位符、y_为训练图像标签的占位符
x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, [None, 10])

​ 由于要使用的是卷积神经网络对图像进行分类,所以不能再使用784维的向量表示输入的x,而是将其还原为28*28的图片形式。[-1,28,28,1]中的-1表示形状第一维的大小是根据x自动确定的。

1
2
# 将单张图片从784维向量重新还原为28x28的矩阵图片
x_image = tf.reshape(x, [-1, 28, 28, 1])

​ x_image就是输入的训练图像,接下来。我们堆训练图像进行卷积操作,第一层卷积的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)


def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)

def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding="SAME")


def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding="SAME")
# 第一层卷积层
W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)

​ 先定义四个函数,函数weight_variable可以返回一个给定形状的变量并自动以截断正态分布初始化,bias_variable同样返回一个给定形状的变量,初始化时所有值是0.1,可分别用这两个函数创建卷积的核与偏置。h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)是真正进行卷积运算,卷积计算后选用ReLU作为激活函数。h_pool1 = max_pool_2x2(h_conv1)是调用函数max_pool_2x2(h_conv1)进行一次池化操作。卷积、激活函数、池化,可以说是一个卷积层的“标配”,通常一个卷积层都会包含这三个步骤,有时会去掉最后的池化操作。

​ tf.truncated_normal(shape, mean, stddev) :shape表示生成张量的维度,mean是均值,stddev是标准差。这个函数产生正太分布,均值和标准差自己设定。这是一个截断的产生正太分布的函数,就是说产生正太分布的值如果与均值的差值大于两倍的标准差,那就重新生成。和一般的正太分布的产生随机数据比起来,这个函数产生的随机数与均值的差距不会超过两倍的标准差,但是一般的别的函数是可能的。

​ 对第一个卷积操作后产生的h_pool1再做一次卷积计算,使用的代码与上面类似。

1
2
3
4
5
6
# 第二层卷积层
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)

h_pool2 = max_pool_2x2(h_conv2)

两层卷积之后是全连接层:

1
2
3
4
5
6
7
8
# 全连接层,输出为1024维的向量
W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
# 使用Dropout,keep_prob是一个占位符,训练时为0.5,测试时为1
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

​ 在全连接中加入了Dropout,它是防止神经网络过拟合的一种手段。在每一步训练时,以一定的概率“去掉”网络中的某些连接,但这种去除不是永久性的,只是在当前步骤中去除,并且每一步去除的连接都是随机选择的。在这个程序中,选择的Dropout概率是0.5,也就是说训练每一个连接都有50%的概率被去除。在测试时保留所有连接。

​ 最后,在加入一层全连接层,把上一步得到的h_fc1_drop转换为10个类别的打分。

1
2
3
4
# 把1024维的向量转换成10维,对应10个类别
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2

​ y_conv相当于Softmax模型中的Logit,当然可以使用Softmax函数将其转换为10个类别的概率,在定义交叉熵损失。但其实Tensorflow提供了一个更直接的cross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))函数,它可以直接对Logit定义交叉熵损失,写法为

1
2
3
4
5
# 我们不采用先Softmax再计算交叉熵的方法,而是直接用tf.nn.softmax_cross_entropy_with_logits直接计算
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
# 同样定义train_step
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

定义测试的准确率

1
2
3
# 定义测试的准确率
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

​ 在验证集上计算模型准确率并输出,方便监控训练的进度,也可以据此调整模型的参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建Session和变量初始化
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())

# 训练20000步
for i in range(20000):
batch = mnist.train.next_batch(50)
# 每100步报告一次在验证集上的准确度
if i % 100 == 0:
train_accuracy = accuracy.eval(feed_dict={
x: batch[0], y_: batch[1], keep_prob: 1.0})
print("step %d, training accuracy %g" % (i, train_accuracy))
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

​ 训练结束后,打印在全体测试集上的准确率:

1
2
3
# 训练结束后报告在测试集上的准确度
print("test accuracy %g" % accuracy.eval(feed_dict={
x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

​ 得到的准确率结果应该在99%左右。与Softmax回归模型相比,使用两层卷积神经网络模型借助了卷积的威力,准确率非常大的提升。

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import os

def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)


def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)

def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding="SAME")


def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding="SAME")

if __name__ == "__main__":
# 读入数据
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# x为训练图像的占位符、y_为训练图像标签的占位符
x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, [None, 10])
# 将单张图片从784维向量重新还原为28x28的矩阵图片
x_image = tf.reshape(x, [-1, 28, 28, 1])
# print(x_image.shape)
# os._exit(0)
# 第一层卷积层
W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)

h_pool1 = max_pool_2x2(h_conv1)
print(h_pool1.shape)

# 第二层卷积层
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)

h_pool2 = max_pool_2x2(h_conv2)
print(h_pool2.shape)
# os._exit(0)
# 全连接层,输出为1024维的向量
W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
# 使用Dropout,keep_prob是一个占位符,训练时为0.5,测试时为1
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

# 把1024维的向量转换成10维,对应10个类别
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2

# 我们不采用先Softmax再计算交叉熵的方法,而是直接用tf.nn.softmax_cross_entropy_with_logits直接计算
# cross_entropy = tf.reduce_mean(
# tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_, logits=y_conv))

# 同样定义train_step
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

# 定义测试的准确率
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

# 创建Session和变量初始化
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())

# 训练20000步
for i in range(20000):
batch = mnist.train.next_batch(50)
# 每100步报告一次在验证集上的准确度
if i % 100 == 0:
train_accuracy = accuracy.eval(feed_dict={
x: batch[0], y_: batch[1], keep_prob: 1.0})
print("step %d, training accuracy %g" % (i, train_accuracy))
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

# 训练结束后报告在测试集上的准确度
print("test accuracy %g" % accuracy.eval(feed_dict={
x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

https://blog.csdn.net/v_july_v/article/details/51812459

https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/

https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/

http://cs231n.github.io/convolutional-networks/

12…4
goingcoder

goingcoder

匆忙世间的闲人。

38 日志
8 分类
9 标签
RSS
GitHub
Creative Commons
Links
  • 陈冠希
© 2018 goingcoder
本站访客数: