Tensorflow(三十三) —— LSTM

Tensorflow(三十三) —— LSTM

LSTM(Long Short-Term Memory)


import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
import pandas as pd
from tensorflow.keras.preprocessing.sequence import pad_sequences
# 加载数据集
num_word = 10000
(x_train,y_train),(x_test,y_test) = keras.datasets.imdb.load_data(num_words = num_word)
word_len = [len(value) for value in x_train]
plt.hist(word_len,bins = range(0,750,50))

在这里插入图片描述


# 数据预处理

max_review_len = 150
x_train = pad_sequences(x_train,maxlen=max_review_len)
x_test = pad_sequences(x_test,maxlen=max_review_len)

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

db_train = tf.data.Dataset.from_tensor_slices((x_train,y_train))
db_test = tf.data.Dataset.from_tensor_slices((x_test,y_test))

batch_size = 32
db_train = db_train.map(preprocess).shuffle(1000).batch(batch_size,drop_remainder = True)
db_test =db_test.map(preprocess).shuffle(1000).batch(batch_size,drop_remainder = True)

# 搭建两层LSTM网络模型
class MyLSTM(keras.Model):
    def __init__(self,units):
        super(MyLSTM,self).__init__()
        # embedding层
        self.embedding = keras.layers.Embedding(input_dim=num_word,output_dim=100,\
                                                input_length=max_review_len)
        # lstm 第一层
        self.state1 = [tf.zeros([batch_size,units]),tf.zeros([batch_size,units])]
        self.lstm1 = keras.layers.LSTMCell(units)
        # lstm 第二层
        self.state2 = [tf.zeros([batch_size,units]),tf.zeros([batch_size,units])]
        self.lstm2 = keras.layers.LSTMCell(units)
        # 定义一个全连接层
        self.fc = tf.keras.layers.Dense(1,activation=tf.nn.sigmoid)
    def call(self,inputs,training = None):
        out = self.embedding(inputs)
        state1 = self.state1
        state2 = self.state2
        for word in tf.unstack(out,axis = 1):
            out1,state1 = self.lstm1(word,state1,training=training)
            out2,state2 = self.lstm2(out1,state2,training=training)
        prob = self.fc(out2)
        return prob   

# 训练模型
model = MyLSTM(64)
model.compile(optimizer = keras.optimizers.Adam(lr = 1e-4),\
              loss = tf.losses.BinaryCrossentropy(),\
              metrics = ["accuracy"] )
model.fit(db_train,epochs = 3,validation_data = db_test,validation_freq = 1)

# 使用高阶API
# 搭建两层LSTM网络模型
class MyLSTM(keras.Model):
    def __init__(self,units):
        super(MyLSTM,self).__init__()
        # embedding层
        self.embedding = keras.layers.Embedding(input_dim=num_word,output_dim=100,\
                                                input_length=max_review_len)
        # lstm层
        self.lstm = keras.Sequential([
            keras.layers.LSTM(units,return_sequences = True,dropout = 0.5),
            keras.layers.LSTM(units,dropout = 0.5)
        ])
        # 定义一个全连接层
        self.fc = tf.keras.layers.Dense(1,activation=tf.nn.sigmoid)
    def call(self,inputs,training = None):
        out = self.embedding(inputs)
        out = self.lstm(out,training=training)
        prob = self.fc(out)
        return prob   
# 训练模型
model = MyLSTM(64)
model.compile(optimizer = keras.optimizers.Adam(lr = 1e-4),\
              loss = tf.losses.BinaryCrossentropy(),\
              metrics = ["accuracy"] )
model.fit(db_train,epochs = 2,validation_data = db_test,validation_freq = 1)

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

by CyrusMay 2022 04 18

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值