日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

python循環(huán)神經(jīng)網(wǎng)絡(luò)RNN函數(shù)tf.nn.dynamic_rnn使用_python

作者:Bubbliiiing ? 更新時(shí)間: 2022-06-29 編程語(yǔ)言

學(xué)習(xí)前言

已經(jīng)完成了RNN網(wǎng)絡(luò)的構(gòu)建,但是我們對(duì)于RNN網(wǎng)絡(luò)還有許多疑問(wèn),特別是tf.nn.dynamic_rnn函數(shù),其具體的應(yīng)用方式我們并不熟悉,查詢(xún)了一下資料,我心里的想法是這樣的。

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
)
  1. cell:上文所定義的lstm_cell。
  2. inputs:RNN輸入。如果time_major==false(默認(rèn)),則必須是如下shape的tensor:[batch_size,max_time,…]或此類(lèi)元素的嵌套元組。如果time_major==true,則必須是如下形狀的tensor:[max_time,batch_size,…]或此類(lèi)元素的嵌套元組。
  3. sequence_length:Int32/Int64矢量大小。用于在超過(guò)批處理元素的序列長(zhǎng)度時(shí)復(fù)制通過(guò)狀態(tài)和零輸出。因此,它更多的是為了性能而不是正確性。
  4. initial_state:上文所定義的_init_state。
  5. dtype:數(shù)據(jù)類(lèi)型。
  6. parallel_iterations:并行運(yùn)行的迭代次數(shù)。那些不具有任何時(shí)間依賴(lài)性并且可以并行運(yùn)行的操作將是。這個(gè)參數(shù)用時(shí)間來(lái)交換空間。值>>1使用更多的內(nèi)存,但花費(fèi)的時(shí)間更少,而較小的值使用更少的內(nèi)存,但計(jì)算需要更長(zhǎng)的時(shí)間。
  7. time_major:輸入和輸出tensor的形狀格式。如果為T(mén)rue,這些張量的形狀必須是[max_time,batch_size,depth]。如果為False,這些張量的形狀必須是[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。
  8. scope:創(chuàng)建的子圖的可變作用域;默認(rèn)為“RNN”。

其返回值為outputs,states。

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:是每一層的最后一個(gè)step的輸出,是一個(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。

tf.nn.dynamic_rnn的使用舉例

單層實(shí)驗(yàn)

我們首先使用單層的RNN進(jìn)行實(shí)驗(yàn)。

使用的代碼為:

import tensorflow as tf
import numpy as np
n_steps = 2         #兩個(gè)step
n_inputs = 3        #每個(gè)input是三維
n_nerve = 4         #神經(jīng)元個(gè)數(shù)
X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
basic_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=n_nerve)
outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32)
init = tf.global_variables_initializer()
X_batch = np.array([[[0, 1, 2], [1, 2, 3]],
                    [[3, 4, 5], [4, 5, 6]],
                    [[5, 6, 7], [6, 7, 8]],
                    [[7, 8, 9], [8, 9, 10]]])
with tf.Session() as sess:
    sess.run(init)
    outputs_val, states_val = sess.run([outputs, states], feed_dict={X: X_batch})
    print("outputs:", outputs_val) 
    print("states:", states_val)

輸出的log為:

outputs: [[[0.92146313 0.6069534  0.24989243 0.9305415 ]
		   [0.9234855  0.8470011  0.7865616  0.99935764]]
 	  	   [[0.9772771  0.9713368  0.99483156 0.9999987 ]
  	 	   [0.9753329  0.99538314 0.9988139  1.        ]]
		   [[0.9901842  0.99558043 0.9998626  1.        ]
  		   [0.989398   0.9992842  0.9999691  1.        ]]
 		   [[0.99577546 0.9993256  0.99999636 1.        ]
  		   [0.9954579  0.9998903  0.99999917 1.        ]]]
states: [[0.9234855  0.8470011  0.7865616  0.99935764]
 		 [0.9753329  0.99538314 0.9988139  1.        ]
		 [0.989398   0.9992842  0.9999691  1.        ]
 		 [0.9954579  0.9998903  0.99999917 1.        ]]
  • Xin的shape是[batch_size = 4, max_time = 2, depth = 3]。
  • outputs的shape是[batch_size = 4, max_time = 2, cell.output_size = 4]。
  • states的shape是[batch_size = 4, cell.output_size = 4]

在time_major = False的時(shí)候:

  • Xin、outputs、states的第一維,都是batch_size,即用于訓(xùn)練的batch的大小。
  • Xin、outputs的第二維,都是max_time,在本文中對(duì)應(yīng)著RNN的兩個(gè)step。
  • outputs、states的最后一維指的是每一個(gè)RNN的Cell的輸出,本文的RNN的Cell的n_nerve為4,所以cell.output_size = 4。Xin的最后一維指的是每一個(gè)輸入樣本的維度。
  • outputs對(duì)應(yīng)的是RNN的最后一層的輸出,states對(duì)應(yīng)的是每一層的最后一個(gè)step的輸出。在RNN的層數(shù)僅1層的時(shí)候,states的輸出對(duì)應(yīng)為outputs最后的step的輸出。

多層實(shí)驗(yàn)

接下來(lái)我們使用兩層的RNN進(jìn)行實(shí)驗(yàn)。

使用的代碼為:

import tensorflow as tf
import numpy as np
n_steps = 2         #兩個(gè)step
n_inputs = 3        #每個(gè)input是三維
n_nerve = 4         #神經(jīng)元個(gè)數(shù)
X = tf.placeholder(tf.float32, [None, n_steps, n_inputs])
#定義多層
layers = [tf.nn.rnn_cell.BasicRNNCell(num_units=n_nerve) for i in range(2)]
multi_layer_cell = tf.contrib.rnn.MultiRNNCell(layers)
outputs, states = tf.nn.dynamic_rnn(multi_layer_cell, X, dtype=tf.float32)
init = tf.global_variables_initializer()
X_batch = np.array([[[0, 1, 2], [1, 2, 3]],
                    [[3, 4, 5], [4, 5, 6]],
                    [[5, 6, 7], [6, 7, 8]],
                    [[7, 8, 9], [8, 9, 10]]])
with tf.Session() as sess:
    sess.run(init)
    outputs_val, states_val = sess.run([outputs, states], feed_dict={X: X_batch})
    print("outputs:", outputs_val) 
    print("states:", states_val)

輸出的log為:

outputs: [[[-0.577939   -0.3657474  -0.21074213  0.8188577 ]
		   [-0.67090076 -0.47001836 -0.40080917  0.6026697 ]]
 		   [[-0.72777444 -0.36500326 -0.7526911   0.86113644]
  		   [-0.7928404  -0.6413429  -0.61007065  0.787065  ]]
 		   [[-0.7537433  -0.35850585 -0.83090436  0.8573037 ]
  		   [-0.82016116 -0.6559162  -0.7360482   0.7915131 ]]
 		   [[-0.7597004  -0.35760364 -0.8450942   0.8567379 ]
  		   [-0.8276395  -0.6573326  -0.7727142   0.7895221 ]]]
states: (array([[-0.71645427, -0.0585744 ,  0.95318353,  0.8424729 ],
       		   [-0.99845   , -0.5044571 ,  0.9955299 ,  0.9750488 ],
       		   [-0.99992913, -0.8408632 ,  0.99885863,  0.9932366 ],
       		   [-0.99999577, -0.9672    ,  0.9996866 ,  0.99814796]],
      		   dtype=float32), 
      	array([[-0.67090076, -0.47001836, -0.40080917,  0.6026697 ],
       		   [-0.7928404 , -0.6413429 , -0.61007065,  0.787065  ],
       		   [-0.82016116, -0.6559162 , -0.7360482 ,  0.7915131 ],
       		   [-0.8276395 , -0.6573326 , -0.7727142 ,  0.7895221 ]],
      		   dtype=float32))

可以看出來(lái)outputs對(duì)應(yīng)的是RNN的最后一層的輸出,states對(duì)應(yīng)的是每一層的最后一個(gè)step的輸出,在完成了兩層的定義后,outputs的shape并沒(méi)有變化,而states的內(nèi)容多了一層,分別對(duì)應(yīng)RNN的兩層輸出。

state中最后一層輸出對(duì)應(yīng)著outputs最后一步的輸出。

原文鏈接:https://blog.csdn.net/weixin_44791964/article/details/98480738

欄目分類(lèi)
最近更新