create_cell()用于创建一个 LSTM 单元,这个 LSTM 单元由 4 个隐藏神经元组成。这个函数会在将结果返回给我们前,在输出上添加一个 dropout。 tf.contrib.rnn.MultiRNNCell负责将 RNN 实例化。我们给 create_cell() 一个参数,因为我们想要 RNN 由多个层组成,在这里是 3。 initial_state:知道了 RNN 的每个单元都取决于先前的状态,我们就必须将要作为我们批次第一批 entry 输入的那些为 0 的初始状态实例化。 x_one_hot将批次转换成一个热编码 cell_outputs给出了 RNN 每个单元格的输出。这里,每个输出将由 4 个值(隐藏神经元的个数)组成。 final_state返回最后一个单元的状态,这个状态可以在训练期间作为下一批次的新初始状态使用(假设下一批次在逻辑上紧连着上一批次)。 3)Graph 输出 单元的输出值存储在一个三维的表格中 [序列数,序列大小,神经元数],或者说是 [2,10,4]。我们不再需要按序列将输出间隔开来。我们之后会调整输出的大小,直播,得到维数 [20,4] 的数组,存储在变量 seq_out_reshape 当中。 最后,用一个简单的线性运算:tf.matmul(..) + b。在最后整个再跟一个 softmax,把输出表示为概率的形式。 4)Loss 为了做误差运算,批处理的目标必须用与模型输出相同的方式和相同的维度来表示。我们使用tf.one_hot 表示输出与输入有相同的编码。然后,将数组 (tf.reshape ()) 调整到与线性输出tf.matmul(..) + b 相同的维度。现在,就可以使用这个函数来计算模型的误差了。 5)训练 用 AdamOptimize 将误差最小化即可。 训练结果! 好,终于走到结果了。这是最有成就感的一部分。我使用的参数是: 序列大小:100 批量大小:200 每个细胞的神经元数量:512 RNN 深度(层数):2 学习率:0.0005 Dropout:0.5 下面是在我的 GPU (GeForce GTX 1060)训练大约 2 个小时后获得的结果。 我们从误差演变开始: 最后,我们来看模型能够生成的代码: 看到模型能够清楚地了解一个程序的一般结构,感觉真是太酷了。 注意,在数据集中没有什么名为“super_fold”的函数。所以,我花了很长时间理解这个函数的功能。 不得不说,这个模型可能比我更聪明…… 编译来源
https://becominghuman.ai/how-to-train-a-neural-network-to-code-by-itself-a432e8a120df (责任编辑:本港台直播) |