1.RNN简介
人类并不是每时每刻都从一片空白的大脑开始他们的思考。在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义。我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考。我们的思想拥有持久性。
传统的神经网络并不能做到这点,看起来也像是一种巨大的弊端。例如,假设你希望对电影中的每个时间点的时间类型进行分类。传统的神经网络应该很难来处理这个问题——使用电影中先前的事件推断后续的事件。
RNN 解决了这个问题。RNN 是包含循环的网络,允许信息的持久化。
2.基于imdb数据集的SimpleRNNCell实战
#RNN-情感分类实战
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
import numpy as np
from tensorflow import keras
from tensorflow.keras import layers,datasets
tf.random.set_seed(1234)
np.random.seed(2345)
assert tf.__version__.startswith('2.')#判断tensorflow的类型是否开头是2.版本(写2/2.0都可以)
batchsize = 80
#假设常见单词有10000个,但是我们都知道,词库当中的单词有很多,肯定要超过一万个
total_words = 10000
#为了方便我们的网络训练和数据处理,我们把每个句子的单词个数统一设置成80,通过下面的padding操作处理
max_review_len = 80
#这样的话是说每个单词通过embedding_len这个方法用一百维的向量去表示
embedding_len = 100
(x_train,y_train),(x_test,y_test) = datasets.imdb.load_data(num_words=total_words)
x_train = keras.preprocessing.sequence.pad_sequences(x_train,maxlen=max_review_len)
x_test = keras.preprocessing.sequence.pad_sequences(x_test,maxlen=max_review_len)
#经过padding之后,x_train:[b,80],x_test:[b,80]->b个句子,每个句子80个单词
db_train = tf.data.Dataset.from_tensor_slices((x_train,y_train))
db = db_train.shuffle(25000).batch(batchsize,drop_remainder=True)
#出现剩下的句子个数不足128的情况,这样我们就不再进行训练--定长训练RNN
db_test = tf.data.Dataset.from_tensor_slices((x_test,y_test))
db_test = db_test.shuffle(25000).batch(batchsize,drop_remainder=True)
#出现剩下的句子个数不足128的情况,这样我们就不再进行测试--定长测试RNN
print('x_train_shape:',x_train.shape,)#(25000, 80)--25k个句子
print('x_test-shape:',x_test.shape)#(25000, 80)
print('y_train_shape:',y_train.shape,)#(25000,)
print('y_test-shape:',y_test.shape)#(25000,)
print(tf.reduce_min(y_train),tf.reduce_max(y_train),#min-0差评Neg,max-1好评Pos
tf.reduce_min(y_test),tf.reduce_max(y_test))#min-0,max-1
class MyRNN(keras.Model):
def __init__(self,units):
super(MyRNN,self).__init__()
self.state0 = [tf.zeros([batchsize,units])]#一个batch一个batch的运算/训练/验证/测试
self.state1 = [tf.zeros([batchsize,units])]
#[b,80]->[b,80,100]
self.embedding = layers.Embedding(total_words,embedding_len,input_length=max_review_len)
#[b,80,100]->[b,64]
self.rnn1 = layers.SimpleRNNCell(units,dropout=0.2)
self.rnn2 = layers.SimpleRNNCell(units, dropout=0.2)