原理講解
TextBiRNN是基于TextRNN的改進版本,將網(wǎng)絡(luò)結(jié)構(gòu)中的RNN層改成雙向(Biderectional)的RNN層擅这,希望不僅能考慮正向編碼信息,也能考慮反向編碼的信息景鼠。
網(wǎng)絡(luò)結(jié)構(gòu)
textBiRNN.png
本文實現(xiàn)
textBiRNN實現(xiàn).png
定義網(wǎng)絡(luò)結(jié)構(gòu)
from tensorflow.keras import Input ,Model
from tensorflow.keras.layers import Embedding , Dense ,Dropout,Bidirectional , LSTM
class TextBiRNN(object):
def __init__(self , maxlen , max_features , embedding_dims , class_num = 5 , last_activate = 'softmax'):
self.maxlen = maxlen
self.max_features = max_features
self.embedding_dims = embedding_dims
self.class_num = class_num
self.last_activate = last_activate
def get_model(self):
input = Input((maxlen , ))
embedding = Embedding(self.max_features , self.embedding_dims , input_length = self.maxlen)(input)
x = Bidirectional(LSTM(128))(embedding)
output = Dense(self.class_num , activation = self.last_actvation)(x)
model = Model(inputs = input , outputs = output)
return model
from tensorflow.keras.proprecessing import sequence
import random
from sklearn.model_selection import train_test_split
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.utils import to_categorical
from utils import *
#路徑配置
data_dir = './processed_data'
vocab_file = './vocab/vocab.txt'
vocab_size = 40000
#神經(jīng)網(wǎng)絡(luò)配置
max_features = 40001
maxlen = 400
batch_size = 32
embedding_dims = 50
epochs = 10
print('數(shù)據(jù)預(yù)處理與加載數(shù)據(jù)')
#如果詞匯表不存在仲翎,重建
if not os.path.exists(vocab_file):
build_vocab(data_dir , vocab_file , vocab_size)
#獲得 詞匯/類別 與id的字典銀蛇
categories , cat_to_id = read_category()
words , word_to_id = read_vocab(vocab_file)
#全部數(shù)據(jù)
x , y = read_files(data_dir)
data = list(zip(x,y))
del x,y
#亂序
random.shuffle(data)
#切分?jǐn)?shù)據(jù)集和測試集
train_data , test_data = train_test_split(data)
#對文本的詞id和類別id進行編碼
x_train = encode_sentences([content[0] for content in train_data], word_to_id)
y_train = to_categorical(encode_cate([content[1] for content in train_data], cat_to_id))
x_test = encode_sentences([content[0] for content in test_data], word_to_id)
y_test = to_categorical(encode_cate([content[1] for content in test_data], cat_to_id))
print('對序列做padding,保證是 samples*timestep 的維度')
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
print('x_train shape:', x_train.shape)
print('x_test shape:', x_test.shape)
print('構(gòu)建模型...')
model = TextBiRNN(maxlen, max_features, embedding_dims).get_model()
model.compile('adam', 'categorical_crossentropy', metrics=['accuracy'])
print('Train...')
early_stopping = EarlyStopping(monitor='val_accuracy', patience=2, mode='max')
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
callbacks=[early_stopping],
validation_data=(x_test, y_test))
print('Test...')
result = model.predict(x_test)
import matplotlib.pyplot as plt
plt.switch_backend('agg')
%matplotlib inline
fig1 = plt.figure()
plt.plot(history.history['loss'],'r',linewidth=3.0)
plt.plot(history.history['val_loss'],'b',linewidth=3.0)
plt.legend(['Training loss', 'Validation Loss'],fontsize=18)
plt.xlabel('Epochs ',fontsize=16)
plt.ylabel('Loss',fontsize=16)
plt.title('Loss Curves :CNN',fontsize=16)
fig1.savefig('loss_cnn.png')
plt.show()
fig2=plt.figure()
plt.plot(history.history['accuracy'],'r',linewidth=3.0)
plt.plot(history.history['val_accuracy'],'b',linewidth=3.0)
plt.legend(['Training Accuracy', 'Validation Accuracy'],fontsize=18)
plt.xlabel('Epochs ',fontsize=16)
plt.ylabel('Accuracy',fontsize=16)
plt.title('Accuracy Curves : CNN',fontsize=16)
fig2.savefig('accuracy_cnn.png')
plt.show()
from tensorflow.keras.utils import plot_model
plot_model(model, show_shapes=True, show_layer_names=True)