summaryrefslogtreecommitdiff
path: root/become_yukarin/model.py
diff options
context:
space:
mode:
Diffstat (limited to 'become_yukarin/model.py')
-rw-r--r--become_yukarin/model.py46
1 files changed, 33 insertions, 13 deletions
diff --git a/become_yukarin/model.py b/become_yukarin/model.py
index 8a727ae..d4fa369 100644
--- a/become_yukarin/model.py
+++ b/become_yukarin/model.py
@@ -1,3 +1,4 @@
+from functools import partial
from typing import List
import chainer
@@ -10,7 +11,7 @@ class Convolution1D(chainer.links.ConvolutionND):
def __init__(self, in_channels, out_channels, ksize, stride=1, pad=0,
nobias=False, initialW=None, initial_bias=None,
cover_all=False):
- super(Convolution1D, self).__init__(
+ super().__init__(
ndim=1,
in_channels=in_channels,
out_channels=out_channels,
@@ -24,6 +25,29 @@ class Convolution1D(chainer.links.ConvolutionND):
)
+class LegacyConvolution1D(chainer.links.Convolution2D):
+ def __init__(self, in_channels, out_channels, ksize=None, stride=1, pad=0,
+ nobias=False, initialW=None, initial_bias=None, **kwargs):
+ assert ksize is None or isinstance(ksize, int)
+ assert isinstance(stride, int)
+ assert isinstance(pad, int)
+ super().__init__(
+ in_channels=in_channels,
+ out_channels=out_channels,
+ ksize=(ksize, 1),
+ stride=(stride, 1),
+ pad=(pad, 0),
+ nobias=nobias,
+ initialW=initialW,
+ initial_bias=initial_bias,
+ **kwargs,
+ )
+
+ def __call__(self, x):
+ assert x.shape[-1] == 1
+ return super().__call__(x)
+
+
class ConvHighway(chainer.link.Chain):
def __init__(self, in_out_size, nobias=False, activate=chainer.functions.relu,
init_Wh=None, init_Wt=None, init_bh=None, init_bt=-1):
@@ -64,7 +88,7 @@ class Conv1DBank(chainer.link.Chain):
super().__init__()
self.stacked_channels = out_channels * k
self.pads = [
- chainer.functions.Pad(((0, 0), (0, 0), (i // 2, (i + 1) // 2)), mode='constant')
+ partial(chainer.functions.pad, pad_width=((0, 0), (0, 0), (i // 2, (i + 1) // 2)), mode='constant')
for i in range(k)
]
@@ -111,8 +135,9 @@ class CBHG(chainer.link.Chain):
disable_last_rnn: bool,
):
super().__init__()
- self.max_pooling_padding = chainer.functions.Pad(
- ((0, 0), (0, 0), ((max_pooling_k - 1) // 2, max_pooling_k // 2)),
+ self.max_pooling_padding = partial(
+ chainer.functions.pad,
+ pad_width=((0, 0), (0, 0), ((max_pooling_k - 1) // 2, max_pooling_k // 2)),
mode='constant',
)
self.max_pooling = chainer.functions.MaxPoolingND(1, max_pooling_k, 1, cover_all=False)
@@ -201,25 +226,20 @@ class Discriminator(chainer.link.Chain):
super().__init__()
with self.init_scope():
self.convs = chainer.link.ChainList(*(
- Convolution1D(i_c, o_c, ksize=2, stride=2, nobias=True)
+ LegacyConvolution1D(i_c, o_c, ksize=2, stride=2)
for i_c, o_c in zip([in_channels] + hidden_channels_list[:-1], hidden_channels_list)
))
- self.lstm_cell = chainer.links.StatelessLSTM(hidden_channels_list[-1], last_channels)
- self.last_linear = chainer.links.Linear(last_channels, 1)
+ self.last_linear = chainer.links.Linear(None, 1)
def __call__(self, x):
"""
:param x: (batch, channel, time)
"""
h = x
+ h = chainer.functions.reshape(h, h.shape + (1,))
for conv in self.convs.children():
h = chainer.functions.relu(conv(h))
-
- hs = chainer.functions.separate(h, axis=2)
- c_next = h_next = None
- for h in reversed(hs):
- c_next, h_next = self.lstm_cell(c_next, h_next, h)
- h = h_next
+ h = chainer.functions.reshape(h, h.shape[:-1])
h = self.last_linear(h)
return h