chatbot1.2

如何处理多义词的embedding?

  • 每个意思一个向量,多方叠加。在某个切面与其相同意思的向量相近

如何识别和学习词组的向量?

  • 多次出现在一起,认为是词组

如何处理未曾见过的新词?

  • 语境平均,语境猜测

通过非监督学习训练词向量需要多少数据?

  • Glove
  • Word2vec

如何用已有的数据优化?

Retrofit

  • 灰色的是非监督学习学到的向量,白色的是知识库的词和其关系。白色标记学到的尽量接近灰色的来加强知识库里的词的关系或消弱。–》兼顾两者特征的新的。形成下面的
  • Conceptnet embedding

RNN

https://r2rt.com/recurrent-neural-networks-in-tensorflow-i.html

demo1


# adapted from https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/rnn/ptb/reader.py
def gen_batch(raw_data, batch_size, num_steps):# """#     产生minibatch数据#     :param raw_data:所有的数据,(input,output)tuple#     :param batch_size: 一个minibatch包含的样本数量,每个样本是一个sequence,有多少个序列#     :param num_steps: 每个sequence样本的长度#     :return:#         一个generator,在一个tuple里面包含一个minibatch的输入,输出序列#     """raw_x, raw_y = raw_datadata_length = len(raw_x)# 将raw_data分为batches并且stack他们垂直的在数据矩阵中# partition raw data into batches and stack them vertically in a data matrixbatch_partition_length = data_length // batch_sizedata_x = np.zeros([batch_size, batch_partition_length], dtype=np.int32)data_y = np.zeros([batch_size, batch_partition_length], dtype=np.int32)#这两个形状相同for i in range(batch_size):data_x[i] = raw_x[batch_partition_length * i:batch_partition_length * (i + 1)]data_y[i] = raw_y[batch_partition_length * i:batch_partition_length * (i + 1)]# further divide batch partitions into num_steps for truncated backprop更进一步分割epoch_size = batch_partition_length // num_stepsfor i in range(epoch_size):x = data_x[:, i * num_steps:(i + 1) * num_steps]y = data_y[:, i * num_steps:(i + 1) * num_steps]yield (x, y)def gen_epochs(n, num_steps):for i in range(n):yield gen_batch(gen_data(), batch_size, num_steps)

caculate the perplexity



  • 3中完美的模型表示,既考虑t-3的时间也考虑了t-8的时间
  • 4中不完美的模型不考虑时间

简易的RNN模型实现

  • 前一个会把它自己的状态作为输入放到后一个里面,他也会把自己的观测时作为另一部分放在rnn里面,两个输入会拼接到一起映射到一个四维的向量里,然后这个四维的向量会进一步映射到一个一维的输出里面。这就是如何使用一个rnn模型给定一个输入,预测一个输出。
  1. 默认graph,variale_scope,name_scope
  2. 自定义rnn cell
    ####tensorflow tip:tf.placeholder ####
  3. 在计算图中添加node,用于存储数据
  4. placeholder没有默认数据,数据完全由外部提供。注意tf.Variable,tf.Tensor,tf.placeholder的区别
  • 外界输入数据:tf.placeholder
  • 中间数据:tf.Tensor,tensorflow operation的output
  • 参数:tf.Variable
"""
Placeholders
"""x = tf.placeholder(tf.int32, [batch_size, num_steps], name='input_placeholder')
y = tf.placeholder(tf.int32, [batch_size, num_steps], name='labels_placeholder')
init_state = tf.zeros([batch_size, state_size])#得到的是当前的状态,也是下一个的其中一个输入"""
RNN Inputs
"""
# RNN Inputs
# Turn our placeholder into a list of one-hot tensors:
# rnn_inputs is a list of num_steps tensors with shape [batch_size, num_classes]
# 将前面定义的placeholder输入到rnn cells
# 将输入序列的每一个0,1数字转化为二维one-hot向量
x_one_hot = tf.one_hot(x, num_classes)
rnn_inputs = tf.unstack(x_one_hot, axis=1)




"""
Definition of rnn_cellThis is very similar to the __call__ method on Tensorflow's BasicRNNCell. See:
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/rnn/python/ops/core_rnn_cell_impl.py#L95
"""
# state_size#隐含状态的维度,希望把num_classes + state_size映射到新的rnn向量的维度上state_size
#这里只是定义变量
with tf.variable_scope('rnn_cell'):W = tf.get_variable('W', [num_classes + state_size, state_size])b = tf.get_variable('b', [state_size], initializer=tf.constant_initializer(0.0))
#这里使用定义的变量形成一个又一个的rnn单元,且公用同样的参数
def rnn_cell(rnn_input, state):with tf.variable_scope('rnn_cell', reuse=True):#reuse=True如果已存在,就直接拿来用,不再重新建立了W = tf.get_variable('W', [num_classes + state_size, state_size])b = tf.get_variable('b', [state_size], initializer=tf.constant_initializer(0.0))return tf.tanh(tf.matmul(tf.concat([rnn_input, state], 1), W) + b)

init_state,state,final_state

"""
Adding rnn_cells to graphThis is a simplified version of the "static_rnn" function from Tensorflow's api. See:
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/rnn/python/ops/core_rnn.py#L41
Note: In practice, using "dynamic_rnn" is a better choice that the "static_rnn":
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/rnn.py#L390
"""
state = init_state#初始化的状态,对第一个rnn单元,我们也要给他一个初始状态,一般是0
rnn_outputs = []
for rnn_input in rnn_inputs:state = rnn_cell(rnn_input, state)rnn_outputs.append(state)
final_state = rnn_outputs[-1]
"""
Predictions, loss, training stepLosses is similar to the "sequence_loss"
function from Tensorflow's API, except that here we are using a list of 2D tensors, instead of a 3D tensor. See:
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/seq2seq/python/ops/loss.py#L30
"""#logits and predictions
with tf.variable_scope('softmax'):W = tf.get_variable('W', [state_size, num_classes])b = tf.get_variable('b', [num_classes], initializer=tf.constant_initializer(0.0))
logits = [tf.matmul(rnn_output, W) + b for rnn_output in rnn_outputs]
predictions = [tf.nn.softmax(logit) for logit in logits]# Turn our y placeholder into a list of labels
y_as_list = tf.unstack(y, num=num_steps, axis=1)#losses and train_step
# """
# 计算损失函数,定义优化器
# 从每一个time frame 的hidden state
# 映射到每个time frame的最终output(prediction)
# 和cbow或者skip_gram的最上层相同
# Predictions, loss, training step
# Losses is similar to the "sequence_loss"
# function from Tensorflow's API, except that here we are using a list of 2D tensors, instead of a 3D tensor. See:
# https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/seq2seq/python/ops/loss.py#L30
# """
# logits and predictions
losses = [tf.nn.sparse_softmax_cross_entropy_with_logits(labels=label, logits=logit) for \logit, label in zip(logits, y_as_list)]
total_loss = tf.reduce_mean(losses)
train_step = tf.train.AdagradOptimizer(learning_rate).minimize(total_loss)

tf.variable_scope(‘softmax’)和tf.variable_scope(‘rnn_cell’, reuse=True)中,各有两个W,b的tf.Variable,因为在不同的variable_scope,即便用相同的名字,也是不同的对象。

##打印所有的variable
all_vars =[node.name for node in tf.global_variables()]
for var in all_vars:print(var)  # rnn_cell/W:0
# rnn_cell/b:0
# softmax/W:0
# softmax/b:0
# rnn_cell/W/Adagrad:0计算和优化的东西
# rnn_cell/b/Adagrad:0
# softmax/W/Adagrad:0
# softmax/b/Adagrad:0all_node_names=[node for node in tf.get_default_graph().as_graph_def().node]
#或者tf.get_default_graph().get_operations()
all_node_values=[node.values() for node in tf.get_default_graph().getoperationa()]
for i in range(0,len(all_node_values),50):print("output and operation %d:"%i)print(all_node_values[i])print('---------------------------')print(all_node_names[i])print('\n')print('\n')for i in range(len(all_node_values)):print('%d:%s'%(i,all_node_values[i]))

tensor命名规则

add_7:0第七次调用add操作,返回0个向量7

"""
Train the network
"""def train_network(num_epochs, num_steps, state_size=4, verbose=True):with tf.Session() as sess:sess.run(tf.global_variables_initializer())training_losses = []for idx, epoch in enumerate(gen_epochs(num_epochs, num_steps)):training_loss = 0training_state = np.zeros((batch_size, state_size))if verbose:print("\nEPOCH", idx)for step, (X, Y) in enumerate(epoch):tr_losses, training_loss_, training_state, _ = \sess.run([losses,total_loss,final_state,train_step],feed_dict={x:X, y:Y, init_state:training_state})training_loss += training_loss_if step % 100 == 0 and step > 0:if verbose:print("Average loss at step", step,"for last 250 steps:", training_loss/100)training_losses.append(training_loss/100)training_loss = 0return training_losses
training_losses = train_network(1,num_steps)
plt.plot(training_losses)

chatbot1_2 RNN简单实现相关推荐

  1. 循环神经网络(RNN)简单介绍及实现(基于表面肌电信号)

    循环神经网络(RNN) 文章目录 循环神经网络(RNN) 一.介绍 二.python实现(LSTM) 三.总结 一.介绍   以序列数据为输入,在序列的演进方向进行递归且所有节点(循环单元)按链式连接 ...

  2. Keras【Deep Learning With Python】RNN Classifier 循环神经网络

    文章目录 1 前言 2 RNN-循环神经网络 2.1 序列数据 2.2 处理序列数据的神经网络 2.3 应用 3 代码实现 4 代码讲解 5 输出 1 前言 本文分为RNN简单讲解,与Keras快速搭 ...

  3. 深度学习Deep learning:四十九(RNN-RBM简单理解)

    前言: 本文主要是bengio的deep learning tutorial教程主页中最后一个sample:rnn-rbm in polyphonic music. 即用RNN-RBM来model复调 ...

  4. 循环神经网络 (RNN)

    RNN是什么 循环神经网络即recurrent neural network,它的提出主要是为了处理序列数据,序列数据是什么?就是前面的输入和后面的输入是有关联的,比如一句话,前后的词都是有关系的,& ...

  5. ViT (Vision Transformer) ---- RNN

    1.one to one 模型 如何对时序数据建模? 人类大脑在阅读时,并不是把一段文字看完在思考,而是边思考变阅读,随着看完后就积累了整段文字的大意,因此处理时序数据就不能使用one to one ...

  6. cs230 deeplearning.ai 3: RNN

    RNN简单来看是把基本的NN网络级连起来,但因为计算量大,所以一般不会有很深层的网络.

  7. 第14节:lstm原理及numpy

    文章目录 lstm原理 rnn lstm实例 lstm原理 文本相关.主要应用于自然语言处理(NLP).对话系统.情感分析.机器翻译等等领域,Google翻译用的就是一个7-8层的LSTM模型. 时序 ...

  8. 字符识别--CRNN+CTC

    文字检测过程分两步,第一步为检测出文字所在的位置,第二步根据检测框里的内容进行文字识别. 第一部分文字检测,这里介绍了SAST算法:https://blog.csdn.net/qq_31607947/ ...

  9. 对抗样本学习笔记:Adversarial Examples: Attacks and Defenses for Deep Learning

    (持续更新) 一.相关优质博客 1.全面入门 2.直观理解原理 3.相关补充论文 4.对抗防御分类 二.论文细节知识点 1.hessian矩阵(表一):hessian矩阵实际上就是函数的二阶导矩阵 H ...

最新文章

  1. 吴恩达深度学习课程deeplearning.ai课程作业:Class 1 Week 4 assignment4_1
  2. ubuntu19.10改成aliyun源
  3. 网页挂码方式html css,CSS代码 解决网页挂马问题
  4. linux ssh非交互脚本,Linux expect非交互式执行脚本
  5. 实战VEEAM BR 10针对物理AD服务器备份与APP感知还原
  6. 安卓获取浏览器上网记录_在android中获取浏览器历史记录和搜索结果
  7. java各种加密算法_Java中的各种加密算法
  8. gitlab 邮件服务器配置
  9. 我的梦想是成为一名计算机程序员英语怎么说,我梦想将来成为一名程序员英语作文...
  10. 线性方程组解个数的判定和求解
  11. 如何做一个基于微信驾校考试小程序系统毕业设计毕设作品
  12. Python语言程序设计基础_实验3 流程控制I_答案_通识教育必修课程_上海师范大学
  13. Solidity入门-开发众筹智能合约
  14. 求两点之间的夹角--两种方法
  15. 九龙证券|近200家机构组团调研,这些机构密集调研股稳增长低估值
  16. linux虚拟网卡修改mac地址,Win10秘笈:两种方式修改网卡物理地址(MAC)
  17. fgets和fputs的使用
  18. 性能对比|FASS iSCSI vs NVMe/TCP
  19. 年龄计算机在线计算,年龄计算器在线计算
  20. matlab fm非相干解调,FM调制和相干解调,非相干解调讲解.doc

热门文章

  1. 终极教程,带具体实验现象,1个GPIO控制2个LED显示4种状态,欢迎讨论!
  2. MTK 8127平台使用busybox
  3. php print r用法,php中echo(),print(),print_r()用法
  4. selenium firefox驱动_Python3+selenium配置常见报错解决方案
  5. 九、MySQL常见约束相关知识总结 学习笔记 + 强化复习(六大约束)
  6. 搞懂DEtection TRanformer(DETR)
  7. MapReduce 计算框架如何运作
  8. LeetCode 529. 扫雷游戏(广度优先搜索BFS/深度优先搜索DFS)
  9. 基于感知机Perceptron的鸢尾花分类实践
  10. python中的文件备份过程