|
- # coding: UTF-8
- import mindspore.nn as nn
- import mindspore.ops.operations as P
-
- class DPCNN(nn.Cell):
- def __init__(self, vocab_len):
- super(DPCNN, self).__init__()
- self.embedding = nn.Embedding(vocab_len, 300, embedding_table='normal', padding_idx=vocab_len - 1)
- self.expand_dims = P.ExpandDims()
- self.conv_region = nn.Conv2d(1, 250, (3, 300), stride=1 ,has_bias=True, pad_mode='valid', weight_init='XavierUniform')
- self.conv = nn.Conv2d(250, 250, (3, 1), stride=1 ,has_bias=True, pad_mode='valid', weight_init='XavierUniform')
- self.max_pool = nn.MaxPool2d(kernel_size=(3, 1), stride=2)
- self.padding1 = nn.Pad(paddings=((0, 0), (0, 0), (1, 1), (0, 0)))
- self.padding2 = nn.Pad(paddings=((0, 0), (0, 0), (0, 1), (0, 0)))
- self.relu = nn.ReLU()
- self.squeeze = P.Squeeze((2, 3))
- self.fc = nn.Dense(250, 2, weight_init='XavierUniform')
-
- def construct(self, x):
- x = self.embedding(x)
- x = self.expand_dims(x, 1)
- x = self.conv_region(x)
-
- x = self.padding1(x)
- x = self.relu(x)
- x = self.conv(x)
- x = self.padding1(x)
- x = self.relu(x)
- x = self.conv(x)
- while x.shape[2] > 2:
- x = self._block(x)
- x = self.squeeze(x)
- x = self.fc(x)
- return x
-
- def _block(self, x):
- x = self.padding2(x)
- px = self.max_pool(x)
-
- x = self.padding1(px)
- x = self.relu(x)
- x = self.conv(x)
-
- x = self.padding1(x)
- x = self.relu(x)
- x = self.conv(x)
-
- # Short Cut
- x = x + px
- return x
|