|
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # @File : model.py
- # @Date : 2021/12/9
- # @Desc : 不同网络结构
- # @Author : Hou
- import tensorlayer as tl
- from tensorlayer.layers import Module
- from tensorlayer.layers import Dense, Embedding, RNN, LSTM, GRU, Transformer
- from tensorlayer.layers.Transformer import TransformerEncoderLayer, TransformerEncoder
-
-
- class RNN_Net(Module):
-
- def __init__(self, vocab_size, label_num):
- super(RNN_Net, self).__init__()
- self.embedding = Embedding(vocabulary_size=vocab_size, embedding_size=64)
- self.net = RNN(input_size=64, hidden_size=64)
- self.dense1 = Dense(in_channels=64, n_units=64, act=tl.ReLU)
- self.dense2 = Dense(in_channels=64, n_units=label_num)
-
- def forward(self, x):
- x = self.embedding(x)
- x, _ = self.net(x)
- x = tl.ops.reduce_mean(x, axis=1)
- x = self.dense1(x)
- x = self.dense2(x)
- return x
-
-
- class LSTM_Net(Module):
-
- def __init__(self, vocab_size, label_num):
- super(LSTM_Net, self).__init__()
- self.embedding = Embedding(vocabulary_size=vocab_size, embedding_size=64)
- self.net = LSTM(input_size=64, hidden_size=64)
- self.dense1 = Dense(in_channels=64, n_units=64, act=tl.ReLU)
- self.dense2 = Dense(in_channels=64, n_units=label_num)
-
- def forward(self, x):
- x = self.embedding(x)
- x, _ = self.net(x)
- x = tl.ops.reduce_mean(x, axis=1)
- x = self.dense1(x)
- x = self.dense2(x)
- return x
-
-
- class GRU_Net(Module):
- def __init__(self, vocab_size, label_num):
- super(GRU_Net, self).__init__()
- self.embedding = Embedding(vocabulary_size=vocab_size, embedding_size=64)
- self.net = GRU(input_size=64, hidden_size=64)
- self.dense1 = Dense(in_channels=64, n_units=64, act=tl.ReLU)
- self.dense2 = Dense(in_channels=64, n_units=label_num)
-
- def forward(self, x):
- x = self.embedding(x)
- x, _ = self.net(x)
- x = tl.ops.reduce_mean(x, axis=1)
- x = self.dense1(x)
- x = self.dense2(x)
- return x
-
-
- class Transformer_Net(Module):
- def __init__(self,
- vocab_size,
- label_num,
- d_model=512,
- nhead=8,
- num_encoder_layers=6,
- num_decoder_layers=6,
- dim_feedforward=2048,
- dropout=0.1,
- act='relu',
- custom_encoder=None,
- custom_decoder=None,
- layer_norm_eps=1e-5,
- batch_first=False,
- name=None,):
-
- super(Transformer_Net, self).__init__()
- self.embedding = Embedding(vocabulary_size=vocab_size, embedding_size=64)
-
- encoder_layer = TransformerEncoderLayer(d_model=d_model, nhead=nhead, dim_feedforward=dim_feedforward,
- dropout=dropout, act=act, layer_norm_eps=layer_norm_eps,
- batch_first=batch_first)
- encoder_norm = tl.layers.LayerNorm(d_model, epsilon=layer_norm_eps)
-
- self.net = TransformerEncoder(encoder_layer=encoder_layer,
- num_layers=num_encoder_layers,
- norm=encoder_norm)
-
- self.dense1 = Dense(in_channels=64, n_units=64, act=tl.ReLU)
- self.dense2 = Dense(in_channels=64, n_units=label_num)
-
- def forward(self, x):
- x = self.embedding(x)
- x, _ = self.net(x)
- x = tl.ops.reduce_mean(x, axis=1)
- x = self.dense1(x)
- x = self.dense2(x)
- return x
-
-
- def initial_network(net_name, vocab_size, label_num):
- """
-
- :param net_name: ['rnn', 'lstm', 'gru', 'transformerEncoder']
- :param vocab_size:
- :param label_num:
- :return:
- """
- if net_name is not None:
- net_name = net_name.lower()
- print("network used: ", net_name)
-
- if net_name == "rnn":
- return RNN_Net(vocab_size, label_num)
- elif net_name == "lstm":
- return LSTM_Net(vocab_size, label_num)
- elif net_name == "gru":
- return GRU_Net(vocab_size, label_num)
-
- elif net_name == "transformerEncoder":
- return Transformer_Net(vocab_size, label_num)
-
- return LSTM_Net(vocab_size, label_num)
|