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