python人工智能tensorflow構(gòu)建循環(huán)神經(jīng)網(wǎng)絡(luò)RNN
學(xué)習(xí)前言
在前一段時(shí)間已經(jīng)完成了卷積神經(jīng)網(wǎng)絡(luò)的復(fù)習(xí),現(xiàn)在要對(duì)循環(huán)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)進(jìn)行更深層次的明確。
RNN簡(jiǎn)介
RNN 是當(dāng)前發(fā)展非?;馃岬纳窠?jīng)網(wǎng)絡(luò)中的一種,它擅長(zhǎng)對(duì)序列數(shù)據(jù)進(jìn)行處理。
什么是序列數(shù)據(jù)呢?舉個(gè)例子。
現(xiàn)在假設(shè)有四個(gè)字,“我” “去” “吃” “飯”。我們可以對(duì)它們進(jìn)行任意的排列組合。
“我去吃飯”,表示的就是我要去吃飯了。
“飯去吃我”,表示的就是飯成精了。
“我吃去飯”,表示的我要去吃‘去飯’了。
不同的排列順序會(huì)導(dǎo)致不同的語(yǔ)意,序列數(shù)據(jù)表示的就是按照一定順序排列的序列,這種排列一般存在一定的意義。。
所以我們知道了RNN有順序存儲(chǔ)的這個(gè)抽象概念,但是RNN如何學(xué)習(xí)這個(gè)概念呢?
那么,讓我們來(lái)看一個(gè)傳統(tǒng)的神經(jīng)網(wǎng)絡(luò),也稱為前饋神經(jīng)網(wǎng)絡(luò)。它有輸入層,隱藏層和輸出層。就像這樣
對(duì)于RNN來(lái)講,其結(jié)構(gòu)示意圖是這樣的:
一句話可以分為N個(gè)part,比如“我去吃飯”可以分為四個(gè)字,“我” “去” “吃” “飯”,分別可以傳入四個(gè)隱含層,前一個(gè)隱含層會(huì)有一個(gè)輸出按照一定的比率傳給后一個(gè)隱含層,比如第一個(gè)“我”輸入隱含層后,有一個(gè)輸出按照w1的比率輸入給下一個(gè)隱含層,當(dāng)?shù)诙€(gè)“去”進(jìn)入隱含層時(shí),隱含層同樣要接收“我”傳過(guò)來(lái)的信息。
以此類推,在到達(dá)最后一個(gè)“飯”時(shí),最后的輸出便得到了前面全部的信息。
其偽代碼形式為:
rnn = RNN() ff = FeedForwardNN() hidden_state = [0,0,0] for word in input: output,hidden_state = rnn(word,hidden_state) prediction = ff(output)
tensorflow中RNN的相關(guān)函數(shù)
tf.nn.rnn_cell.BasicLSTMCell
tf.nn.rnn_cell.BasicRNNCell( num_units, activation=None, reuse=None, name=None, dtype=None, **kwargs)
- num_units:RNN單元中的神經(jīng)元數(shù)量,即輸出神經(jīng)元數(shù)量。
- activation:激活函數(shù)。
- reuse:描述是否在現(xiàn)有范圍中重用變量。如果不為T(mén)rue,并且現(xiàn)有范圍已經(jīng)具有給定變量,則會(huì)引發(fā)錯(cuò)誤。
- name:層的名稱。
- dtype:該層的數(shù)據(jù)類型。
- kwargs:常見(jiàn)層屬性的關(guān)鍵字命名屬性,如trainable,當(dāng)從get_config()創(chuàng)建cell 。
在使用時(shí),可以定義為:
RNN_cell = tf.nn.rnn_cell.BasicRNNCell(n_hidden_units,activation=tf.nn.tanh)
在定義完成后,可以進(jìn)行狀態(tài)初始化:
_init_state = RNN_cell.zero_state(batch_size,tf.float32)
tf.nn.dynamic_rnn
tf.nn.dynamic_rnn( cell, inputs, sequence_length=None, initial_state=None, dtype=None, parallel_iterations=None, swap_memory=False, time_major=False, scope=None )
- cell:上文所定義的lstm_cell。
- inputs:RNN輸入。如果time_major==false(默認(rèn)),則必須是如下shape的tensor:[batch_size,max_time,…]或此類元素的嵌套元組。如果time_major==true,則必須是如下形狀的tensor:[max_time,batch_size,…]或此類元素的嵌套元組。
- sequence_length:Int32/Int64矢量大小。用于在超過(guò)批處理元素的序列長(zhǎng)度時(shí)復(fù)制通過(guò)狀態(tài)和零輸出。因此,它更多的是為了性能而不是正確性。
- initial_state:上文所定義的_init_state。
- dtype:數(shù)據(jù)類型。
- parallel_iterations:并行運(yùn)行的迭代次數(shù)。那些不具有任何時(shí)間依賴性并且可以并行運(yùn)行的操作將是。這個(gè)參數(shù)用時(shí)間來(lái)交換空間。值>>1使用更多的內(nèi)存,但花費(fèi)的時(shí)間更少,而較小的值使用更少的內(nèi)存,但計(jì)算需要更長(zhǎng)的時(shí)間。
- time_major:輸入和輸出tensor的形狀格式。如果為真,這些張量的形狀必須是[max_time,batch_size,depth]。如果為假,這些張量的形狀必須是[batch_size,max_time,depth]。使用time_major=true會(huì)更有效率,因?yàn)樗梢员苊庠赗NN計(jì)算的開(kāi)始和結(jié)束時(shí)進(jìn)行換位。但是,大多數(shù)TensorFlow數(shù)據(jù)都是批處理主數(shù)據(jù),因此默認(rèn)情況下,此函數(shù)為False。
- scope:創(chuàng)建的子圖的可變作用域;默認(rèn)為“RNN”。
在RNN的最后,需要用該函數(shù)得出結(jié)果。
outputs,states = tf.nn.dynamic_rnn(RNN_cell,X_in,initial_state = _init_state,time_major = False)
返回的是一個(gè)元組 (outputs, state):
outputs
:RNN的最后一層的輸出,是一個(gè)tensor。如果為time_major== False,則它的shape為[batch_size,max_time,cell.output_size]。如果為time_major== True,則它的shape為[max_time,batch_size,cell.output_size]。
states
:states是一個(gè)tensor。state是最終的狀態(tài),也就是序列中最后一個(gè)cell輸出的狀態(tài)。一般情況下states的形狀為 [batch_size, cell.output_size],但當(dāng)輸入的cell為BasicLSTMCell時(shí),states的形狀為[2,batch_size, cell.output_size ],其中2也對(duì)應(yīng)著LSTM中的cell state和hidden state。
整個(gè)RNN的定義過(guò)程為:
def RNN(X,weights,biases): #X最開(kāi)始的形狀為(128 batch,28 steps,28 inputs) #轉(zhuǎn)化為(128 batch*28 steps,128 hidden) X = tf.reshape(X,[-1,n_inputs]) #經(jīng)過(guò)乘法后結(jié)果為(128 batch*28 steps,256 hidden) X_in = tf.matmul(X,weights['in'])+biases['in'] #再次轉(zhuǎn)化為(128 batch,28 steps,256 hidden) X_in = tf.reshape(X_in,[-1,n_steps,n_hidden_units]) RNN_cell = tf.nn.rnn_cell.BasicRNNCell(n_hidden_units,activation=tf.nn.tanh) _init_state = RNN_cell.zero_state(batch_size,tf.float32) outputs,states = tf.nn.dynamic_rnn(RNN_cell,X_in,initial_state = _init_state,time_major = False) results = tf.matmul(states,weights['out'])+biases['out'] return results
全部代碼
該例子為手寫(xiě)體識(shí)別例子,將手寫(xiě)體的28行分別作為每一個(gè)step的輸入,輸入維度均為28列。
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data",one_hot = "true") lr = 0.001 #學(xué)習(xí)率 training_iters = 1000000 #學(xué)習(xí)世代數(shù) batch_size = 128 #每一輪進(jìn)入訓(xùn)練的訓(xùn)練量 n_inputs = 28 #輸入每一個(gè)隱含層的inputs維度 n_steps = 28 #一共分為28次輸入 n_hidden_units = 128 #每一個(gè)隱含層的神經(jīng)元個(gè)數(shù) n_classes = 10 #輸出共有10個(gè) x = tf.placeholder(tf.float32,[None,n_steps,n_inputs]) y = tf.placeholder(tf.float32,[None,n_classes]) weights = { 'in':tf.Variable(tf.random_normal([n_inputs,n_hidden_units])), 'out':tf.Variable(tf.random_normal([n_hidden_units,n_classes])) } biases = { 'in':tf.Variable(tf.constant(0.1,shape=[n_hidden_units])), 'out':tf.Variable(tf.constant(0.1,shape=[n_classes])) } def RNN(X,weights,biases): #X最開(kāi)始的形狀為(128 batch,28 steps,28 inputs) #轉(zhuǎn)化為(128 batch*28 steps,128 hidden) X = tf.reshape(X,[-1,n_inputs]) #經(jīng)過(guò)乘法后結(jié)果為(128 batch*28 steps,256 hidden) X_in = tf.matmul(X,weights['in'])+biases['in'] #再次轉(zhuǎn)化為(128 batch,28 steps,256 hidden) X_in = tf.reshape(X_in,[-1,n_steps,n_hidden_units]) RNN_cell = tf.nn.rnn_cell.BasicRNNCell(n_hidden_units,activation=tf.nn.tanh) _init_state = RNN_cell.zero_state(batch_size,tf.float32) outputs,states = tf.nn.dynamic_rnn(RNN_cell,X_in,initial_state = _init_state,time_major = False) results = tf.matmul(states,weights['out'])+biases['out'] return results pre = RNN(x,weights,biases) cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = pre,labels = y)) train_op = tf.train.AdamOptimizer(lr).minimize(cost) correct_pre = tf.equal(tf.argmax(y,1),tf.argmax(pre,1)) accuracy = tf.reduce_mean(tf.cast(correct_pre,tf.float32)) init = tf.initialize_all_variables() with tf.Session() as sess: sess.run(init) step = 0 while step*batch_size <training_iters: batch_xs,batch_ys = mnist.train.next_batch(batch_size) batch_xs = batch_xs.reshape([batch_size,n_steps,n_inputs]) sess.run(train_op,feed_dict = { x:batch_xs, y:batch_ys }) if step%20 == 0: print(sess.run(accuracy,feed_dict = { x:batch_xs, y:batch_ys })) step += 1
以上就是python人工智能tensorflow構(gòu)建循環(huán)神經(jīng)網(wǎng)絡(luò)RNN的詳細(xì)內(nèi)容,更多關(guān)于tensorflow構(gòu)建循環(huán)神經(jīng)網(wǎng)絡(luò)RNN的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 深度學(xué)習(xí)TextRNN的tensorflow1.14實(shí)現(xiàn)示例
- python循環(huán)神經(jīng)網(wǎng)絡(luò)RNN函數(shù)tf.nn.dynamic_rnn使用
- Python使用循環(huán)神經(jīng)網(wǎng)絡(luò)解決文本分類問(wèn)題的方法詳解
- 基于循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)實(shí)現(xiàn)影評(píng)情感分類
- 基于循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的古詩(shī)生成器
- TensorFlow實(shí)現(xiàn)RNN循環(huán)神經(jīng)網(wǎng)絡(luò)
- 循環(huán)神經(jīng)網(wǎng)絡(luò)TextRNN實(shí)現(xiàn)情感短文本分類任務(wù)
相關(guān)文章
python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5樹(shù)形結(jié)構(gòu)控件QTreeWidget詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)PyQt5樹(shù)形結(jié)構(gòu)控件QTreeWidget詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03Scrapy-Redis之RedisSpider與RedisCrawlSpider詳解
這篇文章主要介紹了Scrapy-Redis之RedisSpider與RedisCrawlSpider詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Tensorflow 實(shí)現(xiàn)將圖像與標(biāo)簽數(shù)據(jù)轉(zhuǎn)化為tfRecord文件
今天小編就為大家分享一篇Tensorflow 實(shí)現(xiàn)將圖像與標(biāo)簽數(shù)據(jù)轉(zhuǎn)化為tfRecord文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02檢測(cè)python爬蟲(chóng)時(shí)是否代理ip偽裝成功的方法
這篇文章主要介紹了檢測(cè)python爬蟲(chóng)時(shí)是否代理ip偽裝成功的方法以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。,需要的朋友可以參考下2019-07-07python命令行交互引導(dǎo)用戶選擇寵物實(shí)現(xiàn)
這篇文章主要為大家介紹了python命令行交互引導(dǎo)用戶選擇寵物實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11