天天看點

RNN:建構cell時num_units的個數怎麼影響輸出具體RNN實作代碼:點選這裡!  

Cell中神經元的個數不一定要和序列數相等

如不相等 此代碼序列數為len(char2idx)

我給的cell中神經元的個數為len(char2idx)*2

改變個數後 輸出的形狀也随之改變 和cell中神經元的個數是一樣的 這時候需要:

  • 1.reshape 變為二維 [-1,hidden_size]
  • 2.經過一層全連接配接 使之變為[sequence_length,num_class]
  • 3.再次reshape 使之變為[batch_size,sequence_length,num_class]

作為一個三維的資料可以繼續使用 去除了num_units與序列數大小不一緻的影響、

X_for_fc = tf.reshape(outputs,[-1,rnn_hidden_size])
outputs = contrib.layers.fully_connected(
    inputs=X_for_fc, num_outputs=num_classes, activation_fn=None)
outputs = tf.reshape(outputs,[batch_size,sequence_length,num_classes])
           

具體RNN實作代碼:點選這裡! 

整體代碼如下:

import warnings
warnings.filterwarnings('ignore')
import tensorflow as tf
from tensorflow.contrib import rnn
from tensorflow import contrib
import numpy as np

sample = " 這是一個基于tensorflow的RNN短句子練習 (CSDN_qihao) "
idx2char = list(set(sample)) 

char2idx = {c: i for i, c in enumerate(idx2char)} 
sample_idx = [char2idx[c] for c in sample] 
x_data = [sample_idx[:-1]]
y_data = [sample_idx[1:]]   
print(x_data)
print(y_data)
# 一些參數
dic_size = len(char2idx)
rnn_hidden_size = len(char2idx) *2  #***********
num_classes = len(char2idx) # 最終輸出大小(RNN或softmax等)
batch_size = 1 
sequence_length = len(sample) - 1 

X = tf.placeholder(tf.int32, [None, sequence_length]) # X data
Y = tf.placeholder(tf.int32, [None, sequence_length]) # Y label
X_one_hot = tf.one_hot(X, num_classes) # one hot: 1 -> 0 1 0 0 0 0 0 0 0 0

cell = tf.contrib.rnn.BasicLSTMCell(num_units=rnn_hidden_size, state_is_tuple=True)
initial_state = cell.zero_state(batch_size, tf.float32)

outputs, _states = tf.nn.dynamic_rnn(cell,  X_one_hot , initial_state=initial_state, dtype=tf.float32)

X_for_fc = tf.reshape(outputs,[-1,rnn_hidden_size])
outputs = contrib.layers.fully_connected(
    inputs=X_for_fc, num_outputs=num_classes, activation_fn=None)
outputs = tf.reshape(outputs,[batch_size,sequence_length,num_classes])


weights = tf.ones([batch_size, sequence_length])

sequence_loss = tf.contrib.seq2seq.sequence_loss(logits=outputs, targets=Y,weights=weights)
loss = tf.reduce_mean(sequence_loss)
train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss)

prediction = tf.argmax(outputs, axis=2)


with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    # print(sess.run(X_one_hot,feed_dict={X: x_data}))
    for i in range(3000):
        l, _ = sess.run([loss, train], feed_dict={X: x_data, Y: y_data})
        result = sess.run(prediction, feed_dict={X: x_data})
        # print char using dic
        result_str = [idx2char[c] for c in np.squeeze(result)]
        print(i, "loss:", l, "Prediction:", ''.join(result_str))
    print(len(result_str))
           

輸出結果:

RNN:建構cell時num_units的個數怎麼影響輸出具體RNN實作代碼:點選這裡!  

繼續閱讀