《 Python中的深度强化学习》一书。 适用于专业人士的OpenAI Gym和TensorFlow»

图片 嗨,habrozhiteli! 强化学习是人工智能中最流行和最有前途的领域。 使用Python进行实践学习RL不仅可以帮助您掌握基础知识,还可以帮助您掌握增强的高级深度学习算法。 本书适用于对人工智能感兴趣并希望学习强化学习方法的MO开发人员和深度学习爱好者。 阅读本书,并通过在工作中或工作中实施实际示例,成为强化学习方面的专家。 线性代数,数学分析和Python编程语言的知识将帮助您理解演示的逻辑。

摘录。 使用LSTM RNN生成歌词


现在,让我们看看如何使用LSTM生成Zayn Malik歌词。 Zane的歌曲歌词数据集可以在https://github.com/sudharsan13296/Hands-On-Reinforcement-Learning-With-Python/blob/master/07.%20Deep%20Learning%20Fundamentals/data/ZaynLyrics.txt中下载。

工作从导入必要的库开始:

import tensorflow as tf import numpy as np 

然后读取带有歌词的文件:

 with open("Zayn_Lyrics.txt","r") as f: data=f.read() data=data.replace('\n','') data = data.lower() 

确保数据已成功上传:

 data[:50] "now i'm on the edge can't find my way it's inside " 

现在所有字符都存储在变量all_chars中:

 all_chars=list(set(data)) 

唯一字符数存储在unique_chars中:

 unique_chars = len(all_chars) 

字符总数存储在变量total_chars中:

 total_chars =len(data) 

首先,我们为每个字符分配一个索引。 char_to_ix将包含字符到索引的映射,而ix_to_char将包含字符到索引的映射:

 char_to_ix = { ch:i for i,ch in enumerate(all_chars) } ix_to_char = { i:ch for i,ch in enumerate(all_chars) } 

一个例子:

 char_to_ix['e'] 9 ix_to_char[9] e 

然后定义了generate_batch函数,该函数生成输入值和目标值。 目标值等于输入值乘以i的偏移量。

例如,如果输入= [12,13,24]的偏移值为1,则目标值为[13,24]:

 def generate_batch(seq_length,i): inputs = [char_to_ix[ch] for ch in data[i:i+seq_length]] targets = [char_to_ix[ch] for ch in data[i+1:i+seq_length+1]] inputs=np.array(inputs).reshape(seq_length,1) targets=np.array(targets).reshape(seq_length,1) return inputs,targets 

我们将确定序列的长度,学习的速度以及结点的数量,这等于神经元的数量:

 seq_length = 25 learning_rate = 0.1 num_nodes = 300 

构建LSTM RNN。 TensorFlow提供了用于构建LSTM单元的BasicLSTMCell()函数; 您必须指定LSTM单元中的单位数和使用的激活函数的类型。

因此,我们使用tf.nn.dynamic_rnn()函数创建LSTM单元并使用该单元构建RNN网络,该函数返回输出和状态值:

 def build_rnn(x): cell= tf.contrib.rnn.BasicLSTMCell(num_units=num_nodes, activation=tf.nn.relu) outputs, states = tf.nn.dynamic_rnn(cell, x, dtype=tf.float32) return outputs,states 

现在创建输入X和目标Y的替代项:

 X=tf.placeholder(tf.float32,[None,1]) Y=tf.placeholder(tf.float32,[None,1]) 

将X和Y转换为int:

 X=tf.cast(X,tf.int32) Y=tf.cast(Y,tf.int32) 

还为X和Y创建onehot视图:

 X_onehot=tf.one_hot(X,unique_chars) Y_onehot=tf.one_hot(Y,unique_chars) 

通过调用build_rnn函数从RNN获取输出和状态:

 outputs,states=build_rnn(X_onehot) 

转置输出:

 outputs=tf.transpose(outputs,perm=[1,0,2]) 

我们初始化权重和偏移量:

 W=tf.Variable(tf.random_normal((num_nodes,unique_chars),stddev=0.001)) B=tf.Variable(tf.zeros((1,unique_chars))) 

我们通过将输出乘以权重并加上偏移量来计算输出:

 Ys=tf.matmul(outputs[0],W)+B 

现在我们将执行softmax激活并获得概率:

 prediction = tf.nn.softmax(Ys) 

cross_entropy的损失将计算如下:

 cross_entropy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels =Y_onehot,logits=Ys)) 

我们的目标是最大程度地减少损耗,因此我们将对网络执行反向传播并执行梯度下降:

 optimiser = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cro ss_entropy) 

然后将定义辅助函数预测,该预测将根据RNN模型给出下一个预测符号的索引:

 def predict(seed,i): x=np.zeros((1,1)) x[0][0]= seed indices=[] for t in range(i): p=sess.run(prediction,{X:x}) index = np.random.choice(range(unique_chars), p=p.ravel()) x[0][0]=index indices.append(index) return indices 

然后,将设置batch_size数据包大小,数据包数量和时代数以及用于生成数据包的移位值:

 batch_size=100 total_batch=int(total_chars//batch_size) epochs=1000 shift=0 

最后,我们创建一个TensorFlow会话并构建一个模型:

 init=tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) for epoch in range(epoch): print("Epoch {}:".format(epoch)) if shift + batch_size+1 >= len(data): shift =0 #         # generate_batch,      shift, #    for i in range(total_batch): inputs,targets=generate_batch(batch_size,shift) shift += batch_size # calculate loss if(i%100==0): loss=sess.run(cross_entropy,feed_dict={X:inputs, Y:targets}) #      #    predict index =predict(inputs[0],200) #     ix_to_char #    txt = ''.join(ix_to_char[ix] for ix in index) print('Iteration %i: '%(i)) print ('\n %s \n' % (txt, )) sess.run(optimiser,feed_dict={X:inputs,Y:targets}) 

从结果中可以看到,在最初的时代,输出由随机字符组成,但是据您了解,结果有所改善:

 Epoch 0: Iteration 0: wsadrpud,kpswkypeqawnlfyweudkgt,khdi nmgof' u vnvlmbis . snsblp,podwjqehb,e;g- 'fyqjsyeg,byjgyotsrdf;;u,ha;ik'sfc;dvtauofd.,q.;npsw'wjy-quw'quspfqw- . . . Epoch 113: Iteration 0: i wanna see you, yes, and she said yes! 

关于作者


Sudharsan Ravichandiran是数据处理和分析专家,人工智能的热心爱好者和视频博客。 他获得了安妮大学计算机科学学士学位,并致力于深度学习和强化学习的实际实施研究,包括自然语言处理和计算机视觉。 以前是自由网页设计师和开发人员,曾参与创建多个屡获殊荣的网站。 他目前参加开源项目,并经常回答有关Stack Overflow的问题。

关于科学编辑


Sujit Pal是Reed-Elsevier集团最新技术开发团队Elsevier Labs的技术研究总监。 他从事语义搜索,自然语言处理,机器和深度学习领域的研究。 在Elsevier,他参与了多个创新项目,包括评估和改善搜索质量,图像分类和重复识别,注释和开发医学和科学文本选集。 他与Antonio Gulli写了一本深度学习书,并在Salmon Run博客上写了有关技术的文章。

Suriyadeepan Ramamoorthy是来自Pondicherry(印度)的AI研究人员和工程师,是一名人工智能研究人员和工程师。 他的工作主题是理解自然语言并形成推理。 他在深度学习博客上撰写了大量文章。 在SAAMA Technologies,他使用先进的深度学习方法来分析生物医学文本。 作为自由软件的热心支持者,他积极参与了FSFTN社区的软件开发项目。 他还对协作网络,数据可视化和创意编程感兴趣。

»这本书的更多信息可以在出版商的网站上找到
» 目录
» 摘录

小贩优惠券25%优惠-Python

支付纸质版本的书后,就会通过电子邮件发送电子书。

Source: https://habr.com/ru/post/zh-CN465605/


All Articles