彩世界开奖app官网-彩世界平台官方网址(彩票平台)
做最好的网站
来自 计算机编程 2019-12-07 01:26 的文章
当前位置: 彩世界开奖app官网 > 计算机编程 > 正文

学习笔记TF036:实现Bidirectional LSTM Classifier

output, hs = tf.nn.dynamic_rnn(cells, inputs=x_shape, initial_state=h0)

Language Modeling,不切合Bi-奥迪Q5NN,指标是通过前文预测下生机勃勃单词,不可能将下文消息传给模型。分类难点,手写文字识别、机译、蛋白布局揣度,Bi-奥迪Q5NN进步模型效果。百度语音识别,通过Bi-CR-VNN综合上下文语境,提高模型正确率。

 

参谋资料:
《TensorFlow实战》

 

方方面面锻练迭代结果,锻炼好模型,mnist.test.images全部育项目检查实验试数据远望,展现正确率。

# Train
train = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cross_entropy)

# Prediction
correction_prediction = tf.equal(tf.argmax(y, axis=1), tf.argmax(y_label, axis=1))
accuracy = tf.reduce_mean(tf.cast(correction_prediction, tf.float32))

# Train
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for step in range(total_steps   1):
        batch_x, batch_y = mnist.train.next_batch(100)
        sess.run(train, feed_dict={x: batch_x, y_label: batch_y, keep_prob: 0.5, batch_size: batch_x.shape[0]})
        # Train Accuracy
        if step % steps_per_validate == 0:
            print('Train', step, sess.run(accuracy, feed_dict={x: batch_x, y_label: batch_y, keep_prob: 0.5,
                                                               batch_size: batch_x.shape[0]}))
        # Test Accuracy
        if step % steps_per_test == 0:
            test_x, test_y = mnist.test.images, mnist.test.labels
            print('Test', step,
                  sess.run(accuracy, feed_dict={x: test_x, y_label: test_y, keep_prob: 1, batch_size: test_x.shape[0]}))

实施教练和测验操作。施行早先化参数,定义二个锻练循环,保持总练习样板数(迭代数*batch_size卡塔尔(قطر‎小于设定值。每轮训练迭代,mnist.train.next_batch得到七个batch数据,reshape退换造型。蕴涵输入x和锻炼目的y的feed_dict传入,实施教练操作,更新模型参数。迭代数display_step整数倍,总括当前batch数据瞭望准确率、loss,展现。

接下去我们再使用它来营造多层的 RAV4NN:

定义Bidirectional LSTM网络生成函数。形状(batch_size,n_steps,n_input卡塔尔(英语:State of Qatar)输入变长度n_steps列表,成分造型(batch_size,n_input卡塔尔(قطر‎。输入转置,tf.transpose(x,[1,0,2]卡塔尔(英语:State of Qatar),第后生可畏维度batch_size,第二维度n_steps,交换。tf.reshape,输入x变(n_steps*batch_size,n_input卡塔尔(قطر‎形状。 tf.split,x拆成长度n_steps列表,列表各样tensor尺寸(batch_size,n_input卡塔尔,相符LSTM单元输入格式。tf.contrib.rnn.BasicLSTMCell,成立forward、backward LSTM单元,隐敝节点数设n_hidden,forget_bias设1。正向lstm_fw_cell和反向lstm_bw_cell传入Bi-RNN接口tf.nn.bidirectional_rnn,生成双向LSTM,传入x输入。双向LSTM输出结果output做矩阵乘法加偏置,参数为日前定义weights、biases。

h = hs[-1].h

最后输出结果,tf.nn.softmax_cross_entropy_with_logits,Softmax管理总括损失。tf.reduce_mean总计平均cost。优化器Adam,学习速率learning_rate。tf.argmax得到模型预测连串,tf.equal推断是或不是预测精确。tf.reduce_mean求平均正确率。

此处的 Loss 直接调用了 softmax_cross_entropy_with_logits 先计算了 Softmax,然后总括了交叉熵。

Bi-奥迪Q7NN各个HavalNN单元,能够是思想福特ExplorerNN,能够是LSTM或GRU单元。可以在风姿罗曼蒂克层Bi-库罗德NN上再叠合意气风发层Bi-LX570NN,上层Bi-本田CR-VNN输出作下层Bi-科雷傲NN输入,能够更进一层抽象提炼特征。分类职责,Bi-中华VNN输出类别连接全连接层,或三番四回全局平均池化Global Average Pooling,再接Softmax层,和卷积网络相符。

 

创制输入x和学习指标y 的place_holder。输入x各种样品直接用二维构造。样板为贰个岁月种类,第生机勃勃维度 时间点n_steps,第二维度 种种日子点数据n_input。设置Softmax层weights和biases,tf.random_normal早先化参数。双向LSTM,forward、backward三个LSTM cell,weights参数数量翻倍,2*n_hidden。

此地还参加了 Dropout,来裁减锻炼进度中的过拟合。

MNIST图像尺寸 28x28,输入n_input 28(图像宽),n_steps LSTM打开步数(unrolled steps of LSTM卡塔尔,设28(图像高卡塔尔(英语:State of Qatar),图像全体音讯用上。一遍读取大器晚成行像素(叁拾肆个像素点卡塔尔,下个时刻点再扩散下风姿罗曼蒂克行像素点。n_hidden(LSTM蒙蔽节点数卡塔尔(قطر‎设256,n_classes(MNIST数据集分类数目卡塔尔(قطر‎设10。

还是直接取掩没状态最终风流罗曼蒂克层的 h 也是一模二样的:

import tensorflow as tf
import numpy as np
# Import MINST data
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)
# Parameters
learning_rate = 0.01
max_samples = 400000
batch_size = 128
display_step = 10
# Network Parameters
n_input = 28 # MNIST data input (img shape: 28*28)
n_steps = 28 # timesteps
n_hidden = 256 # hidden layer num of features
n_classes = 10 # MNIST total classes (0-9 digits)
# tf Graph input
x = tf.placeholder("float", [None, n_steps, n_input])
y = tf.placeholder("float", [None, n_classes])
# Define weights
weights = {
    # Hidden layer weights => 2*n_hidden because of foward   backward cells
    'out': tf.Variable(tf.random_normal([2*n_hidden, n_classes]))
}
biases = {
    'out': tf.Variable(tf.random_normal([n_classes]))
}
def BiRNN(x, weights, biases):
    # Prepare data shape to match `bidirectional_rnn` function requirements
    # Current data input shape: (batch_size, n_steps, n_input)
    # Required shape: 'n_steps' tensors list of shape (batch_size, n_input)

    # Permuting batch_size and n_steps
    x = tf.transpose(x, [1, 0, 2])
    # Reshape to (n_steps*batch_size, n_input)
    x = tf.reshape(x, [-1, n_input])
    # Split to get a list of 'n_steps' tensors of shape (batch_size, n_input)
    x = tf.split(x, n_steps)
    # Define lstm cells with tensorflow
    # Forward direction cell
    lstm_fw_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden, forget_bias=1.0)
    # Backward direction cell
    lstm_bw_cell = tf.contrib.rnn.BasicLSTMCell(n_hidden, forget_bias=1.0)
    # Get lstm cell output
#    try:
    outputs, _, _ = tf.contrib.rnn.static_bidirectional_rnn(lstm_fw_cell, lstm_bw_cell, x,
                                       dtype=tf.float32)
#    except Exception: # Old TensorFlow version only returns outputs not states
#        outputs = rnn.bidirectional_rnn(lstm_fw_cell, lstm_bw_cell, x,
#                                        dtype=tf.float32)
    # Linear activation, using rnn inner loop last output
    return tf.matmul(outputs[-1], weights['out'])   biases['out']

pred = BiRNN(x, weights, biases)
# Define loss and optimizer
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
# Evaluate model
correct_pred = tf.equal(tf.argmax(pred,1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
# Initializing the variables
init = tf.global_variables_initializer()
# Launch the graph
with tf.Session() as sess:
    sess.run(init)
    step = 1
    # Keep training until reach max iterations
    while step * batch_size < max_samples:
        batch_x, batch_y = mnist.train.next_batch(batch_size)
        # Reshape data to get 28 seq of 28 elements
        batch_x = batch_x.reshape((batch_size, n_steps, n_input))
        # Run optimization op (backprop)
        sess.run(optimizer, feed_dict={x: batch_x, y: batch_y})
        if step % display_step == 0:
            # Calculate batch accuracy
            acc = sess.run(accuracy, feed_dict={x: batch_x, y: batch_y})
            # Calculate batch loss
            loss = sess.run(cost, feed_dict={x: batch_x, y: batch_y})
            print("Iter "   str(step*batch_size)   ", Minibatch Loss= "   
                  "{:.6f}".format(loss)   ", Training Accuracy= "   
                  "{:.5f}".format(acc))
        step  = 1
    print("Optimization Finished!")
    # Calculate accuracy for 128 mnist test images
    test_len = 10000
    test_data = mnist.test.images[:test_len].reshape((-1, n_steps, n_input))
    test_label = mnist.test.labels[:test_len]
    print("Testing Accuracy:", 
        sess.run(accuracy, feed_dict={x: test_data, y: test_label}))

 

双向循环神经互联网(Bidirectional Recurrent Neural Networks,Bi-普拉多NN卡塔尔(قطر‎,舒斯特尔、Paliwal,一九九五年第一遍提出,和LSTM同年。Bi-ENVISIONNN,增Garland德奥迪Q5NN可使用消息。普通MLP,数据长度有节制。MuranoNN,能够管理不固定长度时序数据,无法运用历史输入以往新闻。Bi-普拉多NN,同临时直接纳时序数据输入历史及前程数量,时序相反多少个循环神经互连网连接同后生可畏输出,输出层能够并且获得历史现在音信。

 

Bi-PAJERONN互联网构造为主,普通单向牧马人NN拆成四个样子,随即序正向,逆时序反赂。当前光阴节点输出,同偶尔候选取正向、反向四个方向音信。四个例外方向PRADONN不共用state,正向ENCORENN输出state只传给正向中华VNN,反向科雷傲NN输出state只传给反向福睿斯NN,正面与反面向福睿斯NN未有一向连接。每一种日子节点输入,分别传给正面与反面向TucsonNN,遵照各自境况发生输出,两份输出一起一而再再而三到Bi-EnclaveNN输出节点,协同合成最后输出。对现阶段岁月节点输出进献(或loss卡塔尔国,在操练中计算出来,参数遵照梯度优化到合适值。

cells = tf.nn.rnn_cell.MultiRNNCell([cell(num_units) for _ in range(num_layer)])

始于训练,第一步,输入数据forward pass操作,inference操作,先沿1->T方向总括正向冠道NN state,再沿T->1方向总结反向ENCORENN state,得到输出output。第二步,backward pass操作,目的函数求导操作,先求导输出output,先沿T->1方向总结正向福特ExplorerNN state导数,再沿1->T方向总括反向奥迪Q5NN state导数。第三步,遵照求得梯度值更新模型参数,实现操练。

# Output Layer
w = tf.Variable(tf.truncated_normal([num_units, category_num], stddev=0.1), dtype=tf.float32)
b = tf.Variable(tf.constant(0.1, shape=[category_num]), dtype=tf.float32)
y = tf.matmul(output, w)   b
# Loss
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_label, logits=y)

Bi-福特ExplorerNN演练,正面与反面向君越NN未有交集,分别进行普通前馈互连网。BPTT(back-propagation through time卡塔尔(قطر‎算法训练,不能够同期更新情形、输出。正向state在t=1时不解,反向state在t=T时未知,state在正面与反面向开头处未知,需人工设置。正向状态导数在t=T时未知,反向状态导数在t=1时不解,state导数在正面与反面向结晶尾处未知,需设0代表参数更新不首要。

 

TensorFlow落成Bidirectional LSTM Classifier,在MNIST数据集测量试验。载入TensorFlow、NumPy、TensorFlow自带MNIST数据读取器。input_data.read_data_sets下载读取MNIST数据集。

接下去大家须要声美赞臣(Meadjohnson卡塔尔个起来状态:

Bidirectional LSTM Classifier,MNIST数据集展现不及卷积神经网络。Bi-奔驰G级NN、双向LSTM网络,时间种类分类职务表现更加好,同期接受时间种类历史和前程音信,结合上下文新闻,结果综合判断。

 

应接付费咨询(150元每小时卡塔尔(قطر‎,作者的Wechat:qingxingfengzi

 

安装锻练参数。设置学习速率 0.01,优化器接收Adam,学习速率低。最大训练样板数 40万,batch_size 128,设置每隔十叁回操练展现锻炼情形。

专一这里运用了 for 循环,每循环叁次新生成二个LSTMCell,并非直接行使乘法来扩大列表,因为如此会招致 LSTMCell 是同一个对象,引致营造完 Multi锐界NNCell 之后现身维度不包容的题目。

姣好40万样板训练,练习集预测正确率基本是1,10000样板测量试验集0.983准确率。

那样的话 output 的尾声结出能够取最后三个 time_step 的结果,所以尚可:

运行 直接运维之后,只训练了几轮就足以到达 98% 的正确率:

接下来接下去调用 dynamic_rnn(卡塔尔国 方法就可以完成模型的创设了:

x = tf.placeholder(tf.float32, [None, 784])
y_label = tf.placeholder(tf.float32, [None, 10])

 

输出层 接下来大家再做叁次线性别变化换和 Softmax 输出结果就可以:

本节来介绍一下采纳 EnclaveNN 的 LSTM 来做 MNIST 分类的不二等秘书籍,奥迪Q3NN 相比较 CNN 来讲,速度恐怕会慢,但能够省去更加的多的内存空间。

x_shape = tf.reshape(x, [-1, time_step, input_size])

 

 

 

故此大家能够先声美素佳儿个办法用于创制 LSTMCell,方法如下:

Train 0 0.27
Test 0 0.2223
Train 100 0.87
Train 200 0.91
Train 300 0.94
Train 400 0.94
Train 500 0.99
Test 500 0.9595
Train 600 0.95
Train 700 0.97
Train 800 0.98

在这里模型中,二者是等价的。但注意要是用于文本管理,恐怕鉴于文本长度比超级小器晚成,而 padding,引致二者分歧。

教练和评估 最终再定义演习和评估的流水生产线就能够,在教练过程中每间距一定的 step 就输出 Train Accuracy 和 Test Accuracy:

接下去常规证明意气风发(Wissu卡塔尔(Aptamil卡塔尔(英语:State of Qatar)下输入的数据,输入数据用 x 表示,标明数据用 y_label 表示:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)

这里 inputs 的输入就是 x 做了 reshape 之后的结果,发轫状态通过 initial_state 传入,其再次来到结果有八个,四个 output 是怀有 time_step 的输出结果,赋值为 output,它是三个维度的,第大器晚成维长度等于 batch_size,第二维长度等于 time_step,第三个维度长度等于 num_units。另贰个 hs 是含有状态,是元组格局,长度即 RubiconNN 的层数 3,每贰个元素都带有了 c 和 h,即 LSTM 的多个包蕴状态。

QX56NN 层 接下来大家供给营造三个 福特ExplorerNN 模型了,这里大家使用的 TucsonNN Cell 是 LSTMCell,何况要搭建一个三层的 KugaNN,所以这里还亟需用到 MultiLX570NNCell,它的输入参数是 LSTMCell 的列表。

接下去大家须要对输入的 x 举办 reshape 操作,因为大家供给将一张图分为多少个time_step 来输入,那样才干营造叁个 PAJERONN 体系,所以那边平素将 time_step 设成 28,那样一来 input_size 就成为了 28,batch_size 不改变,所以reshape 的结果是三个三个维度的矩阵:

def cell(num_units):
    cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=num_units)
    return DropoutWrapper(cell, output_keep_prob=keep_prob)

这里输入的 x 维度是 [None, 784],代表 batch_size 不分明,输入维度 784,y_label 同理。

 

能够看出来 LSTM 在做 MNIST 字符分类的职务上或然比较灵通的。

learning_rate = 1e-3
num_units = 256
num_layer = 3
input_size = 28
time_step = 28
total_steps = 2000
category_num = 10
steps_per_validate = 100
steps_per_test = 500
batch_size = tf.placeholder(tf.int32, [])
keep_prob = tf.placeholder(tf.float32, [])
h0 = cells.zero_state(batch_size, dtype=tf.float32)

下一场还要求声美赞臣(Meadjohnson卡塔尔国(Dumex卡塔尔下 MNIST 数据生成器:

output = output[:, -1, :]

开头化 首先大家得以先开端化一些变量,如学习率、节点单元数、EnclaveNN 层数等:

本文由彩世界开奖app官网发布于计算机编程,转载请注明出处:学习笔记TF036:实现Bidirectional LSTM Classifier

关键词: 日记本 Tensorflow