Tensorflow(三十一) —— RNN

Tensorflow(三十一) —— RNN

1. 结构单元

import tensorflow as tf
from tensorflow import keras
# ***************** 1、input dim & hidden dim
cell = keras.layers.SimpleRNNCell(64) # 4为隐含层神经元数量
cell.build(input_shape = [None,6])
print(cell.trainable_variables[0].shape,\
      cell.trainable_variables[1].shape,\
      cell.trainable_variables[2].shape)

x = tf.random.normal([2,6])
h_t1 = tf.random.normal([2,64])

out,h_t = cell(x,[h_t1]) # 状态参数需要用列表,返回值也是列表

print("out:",out.shape)
print("h_t:",h_t[0].shape)
print(id(out),id(h_t[0]))
# **************** 2、Multi-Layers RNN
cell_1 = keras.layers.SimpleRNNCell(64)
cell_2 = keras.layers.SimpleRNNCell(64)

cell_1.build(input_shape = [None,6])
cell_2.build(input_shape = [None,64])

x = tf.random.normal([2,6])
state0,state1 = [tf.zeros([2,64])],[tf.zeros([2,64])]

out_1,state0 = cell_1(x,state0)
out_2,state1 = cell_2(out_1,state1)

print(out_1.shape,out_2.shape)
# ******************* 3、多个时间戳
x = tf.random.normal([2,8,4])

cell_1 = keras.layers.SimpleRNNCell(64)
cell_2 = keras.layers.SimpleRNNCell(64)

cell_1.build(input_shape = [None,4])
cell_2.build(input_shape = [None,64])

state0,state1 = [tf.zeros([2,64])],[tf.zeros([2,64])]

for word in tf.unstack(x,axis = 1):
    out_1,state0 = cell_1(word,state0)
    out_2,state1 = cell_2(out_1,state1)
print(out_2.shape)
# ********************* 4RNN Layer
rnn = keras.Sequential([
                        keras.layers.SimpleRNN(64,return_sequences = True,unroll = True),\
                        keras.layers.SimpleRNN(64,return_sequences = False,unroll = True)
])
"""
return_sequences: 返回state序列 作为下一个RNN的输入,若为False,则返回一个输出
unroll:改善tensorflow后端性能
"""
x = tf.random.uniform([2,8,4])
out = rnn(x)
print(out.shape)

2. RNN与情感分类问题实战

import tensorflow as tf 
from tensorflow import keras
import numpy as np
tf.compat.v1.disable_eager_execution()
# 加载数据集
total_words = 10000
(x_train,y_train),(x_test,y_test) = keras.datasets.imdb.load_data(num_words=total_words)
print("train_shape:",x_train.shape,y_train.shape,x_test.shape,y_test.shape)
# 数据预处理
max_len = 500
x_train = keras.preprocessing.sequence.pad_sequences(x_train,maxlen=max_len,\
                                                     padding="post",truncating = "post")
"""
post 为从末尾开始阶段
"""
x_test = keras.preprocessing.sequence.pad_sequences(x_test,maxlen = max_len,\
                                                   padding = "post",truncating = "post")
db_train = tf.data.Dataset.from_tensor_slices((x_train,y_train))
db_test = tf.data.Dataset.from_tensor_slices((x_test,y_test))

def preprocess(x,y):
    x = tf.cast(x,dtype=tf.float32)
    y = tf.cast(y,dtype=tf.int32)
    return x,y

db_train = db_train.map(preprocess).shuffle(10000).batch(128,drop_remainder = True)
db_test = db_test.map(preprocess).shuffle(10000).batch(128,drop_remainder = True)
# 自定义RNN类
embedding_len = 100
class MyRNN(keras.Model):
    def __init__(self,units):
        super(MyRNN,self).__init__()
        self.embedding = keras.layers.Embedding(total_words,embedding_len)
        self.cell_1 = keras.layers.SimpleRNNCell(units,dropout=0.5)
        self.state_1 = [tf.zeros([128,units])]
        self.cell_2 = keras.layers.SimpleRNNCell(units,dropout = 0.5)
        self.state_2 = [tf.zeros([128,units])]
        self.fc = keras.layers.Dense(1,activation=tf.nn.sigmoid)
        
    def call(self,inputs,training = None):
        # [b,words] => [b,words,c]
        x = inputs
        x = self.embedding(x)
        state_1 = self.state_1
        state_2 = self.state_2
        # [b,words,c] => [b,units]
        for word in tf.unstack(x,axis = 1):
            out_1,state_1 = self.cell_1(word,state_1,training)
            out_2,state_2 = self.cell_2(out_1,state_2,training)
        
        # [b,units] => [b,1]
        prob = self.fc(out_2)
        return prob
def main():
    rnn_net = MyRNN(64)
    rnn_net.compile(loss=tf.losses.BinaryCrossentropy(),\
                    optimizer=keras.optimizers.Adam(lr = 1e-3),\
                   metrics = ["accuracy"])
    rnn_net.fit(db_train,epochs=10,validation_data=db_test,validation_freq=1)
    print("test:",rnn_net.evaluate(db_test))
if __name__ == "__main__":
    main()
# 使用高阶API
import tensorflow as tf 
from tensorflow import keras
import numpy as np
# 加载数据集
total_words = 10000
(x_train,y_train),(x_test,y_test) = keras.datasets.imdb.load_data(num_words=total_words)
print("train_shape:",x_train.shape,y_train.shape,x_test.shape,y_test.shape)
# 数据预处理
max_len = 80
x_train = keras.preprocessing.sequence.pad_sequences(x_train,maxlen=max_len,\
                                                     padding="post",truncating = "post")
"""
post 为从末尾开始阶段
"""
x_test = keras.preprocessing.sequence.pad_sequences(x_test,maxlen = max_len,\
                                                   padding = "post",truncating = "post")
db_train = tf.data.Dataset.from_tensor_slices((x_train,y_train))
db_test = tf.data.Dataset.from_tensor_slices((x_test,y_test))

def preprocess(x,y):
    x = tf.cast(x,dtype=tf.float32)
    y = tf.cast(y,dtype=tf.int32)
    return x,y

db_train = db_train.map(preprocess).shuffle(10000).batch(128,drop_remainder = True)
db_test = db_test.map(preprocess).shuffle(10000).batch(128,drop_remainder = True)
# 自定义RNN类
embedding_len = 100
class MyRNN(keras.Model):
    def __init__(self,units):
        super(MyRNN,self).__init__()
        self.embedding = keras.layers.Embedding(total_words,embedding_len)
        self.rnn = keras.Sequential([
                                    keras.layers.SimpleRNN(units,dropout = 0.5,\
                                                           unroll = True,return_sequences = True),
                                    keras.layers.SimpleRNN(units,dropout=0.5,unroll=True)
        ])
        self.fc = keras.layers.Dense(1,activation=tf.nn.sigmoid)
        
    def call(self,inputs,training = None):
        # [b,words] => [b,words,c]
        x = inputs
        x = self.embedding(x)
        # [b,words,c] => [b,units]
        out = self.rnn(x)
        
        # [b,units] => [b,1]
        prob = self.fc(out)
        return prob
def main():
    rnn_net = MyRNN(64)
    rnn_net.compile(loss=tf.losses.BinaryCrossentropy(),\
                    optimizer=keras.optimizers.Adam(lr = 1e-3),\
                   metrics = ["accuracy"])
    rnn_net.fit(db_train,epochs=10,validation_data=db_test,validation_freq=1)
    print("test:",rnn_net.evaluate(db_test))
if __name__ == "__main__":
    main()    

本文为参考龙龙老师的“深度学习与TensorFlow 2入门实战“课程书写的学习笔记

by CyrusMay 2022 04 18

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值