学习笔记TF036:实现Bidirectional LSTM Classifier分分快三

作者:编程技术

那样的话 output 的尾声结果能够取最终四个 time_step 的结果,所以能够使用:

初步训练,第一步,输入数据forward pass操作,inference操作,先沿1->T方向计算正向中华VNN state,再沿T->1方向总计反向CR-VNN state,获得输出output。第二步,backward pass操作,指标函数求导操作,先求导输出output,先沿T->1方向总结正向瑞虎NN state导数,再沿1->T方向计算反向ENVISIONNN state导数。第三步,依据求得梯度值更新模型参数,达成训练。

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

奉行教练和测量试验操作。实施最早化参数,定义一个教练循环,保持总练习样品数(迭代数*batch_size)小于设定值。每轮流培演习迭代,mnist.train.next_batch获得三个batch数据,reshape修改形象。包罗输入x和教练指标y的feed_dict传入,推行练习操作,更新模型参数。迭代数display_step整好几倍,总结当前batch数据预测准确率、loss,呈现。

然后还须要声贝因美(Beingmate卡塔 尔(阿拉伯语:قطر‎下 MNIST 数据生成器:

安装练习参数。设置学习速率 0.01,优化器选拔Adam,学习速率低。最大锻练样品数 40万,batch_size 128,设置每隔拾一遍演习展现练习情形。

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

姣好40万样品锻炼,演练集预测正确率基本是1,10000样板测量检验集0.983正确率。

此处还参预了 Dropout,来压缩练习进度中的过拟合。

Language Modeling,不相符Bi-CRUISERNN,目的是透过前文预测下黄金时代单词,不可能将下文音信传给模型。分类难点,手写文字识别、机译、蛋白构造估量,Bi-LX570NN提高模型效果。百度语音识别,通过Bi-ENVISIONNN综合上下文语境,进步模型正确率。

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

双向循环神经互连网(Bidirectional Recurrent Neural Networks,Bi-TucsonNN),舒斯特尔、Paliwal,1996年第3回建议,和LSTM同年。Bi-福睿斯NN,扩张EscortNN可利用新闻。普通MLP,数据长度有限量。奥迪Q3NN,能够拍卖不牢固长度时序数据,相当的小概利用历史输入现在音信。Bi-奥迪Q7NN,同有时间接选举择时序数据输入历史及现在数据,时序相反三个循环神经网络连接同风流倜傥输出,输出层能够而且获得历史以往消息。

接下去大家须要声澳优个方始状态:

定义Bidirectional LSTM网络生成函数。形状(batch_size,n_steps,n_input)输入变长度n_steps列表,成分造型(batch_size,n_input)。输入转置,tf.transpose(x,[1,0,2]),第意气风发维度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。

# 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)

招待付费咨询(150元每刻钟),小编的Wechat:qingxingfengzi

 

成立输入x和上学指标y 的place_holder。输入x每一个样品直接用二维布局。样品为四个时间类别,第风流倜傥维度 时间点n_steps,第二维度 每种时刻点数据n_input。设置Softmax层weights和biases,tf.random_normal开始化参数。双向LSTM,forward、backward七个LSTM cell,weights参数数量翻倍,2*n_hidden。

 

Bi-奥迪Q5NN互连网构造为主,普通单向XC60NN拆成四个倾向,任何时候序正向,逆时序反赂。当前时刻节点输出,同有时候采用正向、反向八个样子音讯。多个例外趋向福特ExplorerNN不共用state,正向揽胜NN输出state只传给正向奥迪Q5NN,反向WranglerNN输出state只传给反向传祺NN,正面与反面向CR-VNN未有平素连接。各样日子节点输入,分别传给正面与反面向奥德赛NN,遵照各自情状爆发输出,两份输出一同一而再到Bi-EscortNN输出节点,合营合成最后输出。对当下光阴节点输出进献(或loss),在练习中计算出来,参数依照梯度优化到合适值。

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

Bi-RAV4NN各类RubiconNN单元,能够是人生观牧马人NN,可以是LSTM或GRU单元。能够在一层Bi-奇骏NN上再叠合风流倜傥层Bi-揽胜NN,上层Bi-WranglerNN输出作下层Bi-LX570NN输入,能够进一层抽象提炼特征。分类职务,Bi-ENVISIONNN输出连串连接全连接层,或接二连三全局平均池化Global Average Pooling,再接Softmax层,和卷积网络相仿。

 

参谋资料:
《TensorFlow实战》

能够看出来 LSTM 在做 MNIST 字符分类的天职上或然相比有效的。

MNIST图像尺寸 28x28,输入n_input 28(图像宽),n_steps LSTM打开步数(unrolled steps of LSTM),设28(图像高),图像全体消息用上。三回读取风华正茂行像素(29个像素点),下个日子点再传出下风流倜傥行像素点。n_hidden(LSTM隐瞒节点数)设256,n_classes(MNIST数据集分类数目)设10。

 

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 LSTM Classifier,MNIST数据集表现比不上卷积神经互连网。Bi-CR-VNN、双向LSTM网络,时间类别分类职分表现越来越好,同一时直接收时间系列历史和现在消息,结合上下文音信,结果综合推断。

初叶化 首先大家可以先带头化一些变量,如学习率、节点单元数、君越NN 层数等:

最终输出结果,tf.nn.softmax_cross_entropy_with_logits,Softmax管理总计损失。tf.reduce_mean总结平均cost。优化器Adam,学习速率learning_rate。tf.argmax获得模型预测体系,tf.equal判定是还是不是预测精确。tf.reduce_mean求平均准确率。

接下去大家要求对输入的 x 进行 reshape 操作,因为大家需求将一张图分为七个time_step 来输入,那样能力创设一个 RubiconNN 种类,所以那边一直将 time_step 设成 28,那样一来 input_size 就成为了 28,batch_size 不改变,所以reshape 的结果是三个三个维度的矩阵:

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

 

Bi-中华VNN练习,正面与反面向汉兰达NN未有交集,分别展开普通前馈互联网。BPTT(back-propagation through time)算法演习,不能够同期改革意况、输出。正向state在t=1时不学无术,反向state在t=T时未知,state在正面与反面向初步处未知,需人工设置。正向状态导数在t=T时未知,反向状态导数在t=1时不学无术,state导数在正面与反面向结晶尾处未知,需设0代表参数更新不重要。

下一场接下去调用 dynamic_rnn() 方法就可以完结模型的创设了:

不论什么事教练迭代结果,演习好模型,mnist.test.images全体育项目检测试数据预测,显示正确率。

CaymanNN 层 接下来大家须要营造一个 奥德赛NN 模型了,这里我们运用的 EscortNN Cell 是 LSTMCell,并且要搭建贰个三层的 卡宴NN,所以那边还必要用到 Multi本田CR-VNNCell,它的输入参数是 LSTMCell 的列表。

学习笔记TF036:实现Bidirectional LSTM Classifier分分快三计划。接下去常规声美素佳儿下输入的数额,输入数据用 x 表示,标明数据用 y_label 表示:

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

学习笔记TF036:实现Bidirectional LSTM Classifier分分快三计划。本节来介绍一下行使 OdysseyNN 的 LSTM 来做 MNIST 分类的不二秘籍,福特ExplorerNN 相比较 CNN 来讲,速度或许会慢,但足以省去越来越多的内部存款和储蓄器空间。

h0 = cells.zero_state(batch_size, dtype=tf.float32)
def cell(num_units):
    cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=num_units)
    return DropoutWrapper(cell, output_keep_prob=keep_prob)

 

 

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

那边的 Loss 直接调用了 softmax_cross_entropy_with_logits 先总括了 Softmax,然后总结了交叉熵。

 

介意这里运用了 for 循环,每循环二遍新生成一个LSTMCell,并不是向来动用乘法来扩充列表,因为那样会导致 LSTMCell 是同多少个目的,以致营造完 Multi汉兰达NNCell 之后现身维度不合营的难题。

output, hs = tf.nn.dynamic_rnn(cells, inputs=x_shape, initial_state=h0)
cells = tf.nn.rnn_cell.MultiRNNCell([cell(num_units) for _ in range(num_layer)])
# 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]}))
h = hs[-1].h

 

 

运转 直接运转之后,只操练了几轮就足以达标 98% 的正确率:

在那模型中,二者是等价的。但注意若是用于文本管理,大概由于文本长度不意气风发,而 padding,引致多头不一样。

或许直接取隐蔽状态最终生机勃勃层的 h 也是同等的:

 

这里 inputs 的输入正是 x 做了 reshape 之后的结果,早先状态通过 initial_state 传入,其归来结果有五个,叁个 output 是具有 time_step 的出口结果,赋值为 output,它是三个维度的,第大器晚成维长度等于 batch_size,第二维长度等于 time_step,首个维度长度等于 num_units。另叁个 hs 是包括状态,是元组情势,长度即 中华VNN 的层数 3,每一个要素都富含了 c 和 h,即 LSTM 的两个满含状态。

output = output[:, -1, :]

由此我们能够先声宾博(Nutrilon卡塔 尔(阿拉伯语:قطر‎个措施用于创立 LSTMCell,方法如下:

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

 

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, [])

此处输入的 x 维度是 [None, 784]学习笔记TF036:实现Bidirectional LSTM Classifier分分快三计划。,代表 batch_size 不明确,输入维度 784,y_label 同理。

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划 日记本 tensorflow