Hiroshiba / become-yukarin

Convert your voice to favorite voice
https://hiroshiba.github.io/blog/became-yuduki-yukari-with-deep-learning-power/
MIT License
576 stars 88 forks source link

sr_train.py 実行時エラーについて #39

Closed sim-mokomo closed 6 years ago

sim-mokomo commented 6 years ago

sr_train.pyを実行し、学習を始めたところ、SRDecoderクラス内callでtype_check時に以下のようなエラーが出てしまいます。

Expect: in_types[0].shape[2] == in_types[1].shape[2]
Actual: 511 != 512

自分で調べましたところ次元数が一致していない時に出るようです。 Deconvolution2Dなどshapeを操作している場所を調べてみたのですが理解度が低いため解決方法がわかりませんでした。 修正のアプローチを教えて欲しいです。

class SRDecoder(chainer.Chain):

    # ~ 略 ~ 
    # ~ 略 ~ 

    def __call__(self, hs):
        h = self.c0(hs[-1])
        for i in range(1, 8):
            h = F.concat([h, hs[-i - 1]]) # ここでエラーが出てしまいます。
            if i < 7:
                h = self['c%d' % i](h)
            else:
                h = self.c7(h)
        return h

こちらがエラー時のTracebackとなります

Traceback (most recent call last):
  File "train_sr.py", line 85, in <module>
    trainer.run()
  File "/home/username/anaconda3/envs/become-yukarin/lib/python3.6/site-packages/chainer/training/trainer.py", line 320, in run
    six.reraise(*sys.exc_info())
  File "/home/username/anaconda3/envs/become-yukarin/lib/python3.6/site-packages/six.py", line 693, in reraise
    raise value
  File "/home/username/anaconda3/envs/become-yukarin/lib/python3.6/site-packages/chainer/training/trainer.py", line 306, in run
    update()
  File "/home/username/anaconda3/envs/become-yukarin/lib/python3.6/site-packages/chainer/training/updaters/standard_updater.py", line 149, in update
    self.update_core()
  File "/home/username/PycharmProjects/become-yukarin/become_yukarin/updater/sr_updater.py", line 77, in update_core
    loss = self.forward(**batch)
  File "/home/username/PycharmProjects/become-yukarin/become_yukarin/updater/sr_updater.py", line 61, in forward
    output = self.predictor(input)
  File "/home/username/PycharmProjects/become-yukarin/become_yukarin/model/sr_model.py", line 101, in __call__
    deco = self.decoder(self.encoder(x))
  File "/home/username/PycharmProjects/become-yukarin/become_yukarin/model/sr_model.py", line 85, in __call__
    h = F.concat([h, hs[-i - 1]])
  File "/home/username/anaconda3/envs/become-yukarin/lib/python3.6/site-packages/chainer/functions/array/concat.py", line 105, in concat
    y, = Concat(axis).apply(xs)
  File "/home/username/anaconda3/envs/become-yukarin/lib/python3.6/site-packages/chainer/function_node.py", line 243, in apply
    self._check_data_type_forward(in_data)
  File "/home/username/anaconda3/envs/become-yukarin/lib/python3.6/site-packages/chainer/function_node.py", line 328, in _check_data_type_forward
    self.check_type_forward(in_type)
  File "/home/username/anaconda3/envs/become-yukarin/lib/python3.6/site-packages/chainer/functions/array/concat.py", line 41, in check_type_forward
    type_check.expect(in_types[0].shape[d] == in_types[i].shape[d])
  File "/home/username/anaconda3/envs/become-yukarin/lib/python3.6/site-packages/chainer/utils/type_check.py", line 524, in expect
    expr.expect()
  File "/home/username/anaconda3/envs/become-yukarin/lib/python3.6/site-packages/chainer/utils/type_check.py", line 482, in expect
    '{0} {1} {2}'.format(left, self.inv, right))
chainer.utils.type_check.InvalidType: 
Invalid operation is performed in: Concat (Forward)

Expect: in_types[0].shape[2] == in_types[1].shape[2]
Actual: 511 != 512
DerrickHayman commented 6 years ago

私もまったく同じエラーで悩まされています。 ただ、私の場合は Actual: 6!= 7 になってます

Hiroshiba commented 6 years ago

ちょっと原因が想像つかないですね・・・お役に立てず申し訳ないです。

もしかしたら、chainerのバージョンが上がって、仕様が変わったのかもしれません。 私が実験していた際はchainerのv3.5.0を用いていました。

issueは一度閉じますが、進展等あればまた報告いただけると幸いです。

sim-mokomo commented 6 years ago

@Hiroshiba

環境 python=3.6.6 chainner=3.5.0 cupy=2.5.0

解決はしていませんが進展を報告します。

提供してくださったサンプルを用いての学習はエラーも出ずにうまく実行されることを確認いたしました。 しかし自分で用意した音源を元に学習を行った場合にエラーが出てしまいます。

このことから音源のフォーマットの問題かと思い、提供サンプルとの違いを調査しました。 サンプル音源との違いは以下の項目についてでしたので修正したのちに特徴量を抽出、学習を 回しましたところ同様のエラーがでました。ただし Actual: 2 != 3 となりました。

channels=2 => channels=1 sample_rate=44100 => sample_rate=22050

pythonのバージョンを推奨のバージョンに切り替えて再度試してみます。

sim-mokomo commented 6 years ago

@Hiroshiba

Pythonを推奨バージョン3.6.3に切り替えて実行してみましたがうまくいきませんでした。

Hiroshiba commented 6 years ago

サンプリングレートを変えているのであればそれが問題だと思います。 sample_rate=24000で一度試すとうまくいくかもしれません。

というのも、サンプリングレートでここの値が変わるためです。 https://github.com/Hiroshiba/become-yukarin/blob/7fe29af7a15dddcf8220733472cb985019aa1e87/scripts/extract_spectrogram_pair.py#L62

もしくは、サンプリングレートを変えた状態でfftlenを1024にしても学習は動くと思います。 ですが、他の部分にも修正を加える必要が出てくると思います。

YoshikazuOota commented 5 years ago

古い issueですが、一応の回避作があるので、書かせていただきます。

私もこのエラーを度々目にします。 npyデータ作り直していたりすると、勝手にエラーが消えたりして、 いまいち再現性がわかりません。

ただ、回避方法だけはわかっており config_sr.json の log_iteration の値をすごく大きな値にして、log生成をしないようにします。 "log_iteration": 100000000000,

該当エラーは、学習過程のデータを出力する log ファイルを処理する際のに発生します。 この設定で log ファイルは出力されなくなりますが、学習を回すことはできると思います。

以上、参考になれば幸いです。

miau commented 4 years ago

同じエラーで悩まされたので調べたのですが、LastPaddingProcess(data[time_axis] が config.train_crop_size 未満だったらパディングする処理?)の周辺を以下のように変えたら、エラーは起きなくなりました。 内容は理解せずに「time_axis が音源の長さに依存する軸のことなら、こんな感じかな?」と雰囲気でやってますので、適宜書き換えていただければと思います。短い音源を使った場合だけ発生するエラーなのかもしれません。

diff --git a/become_yukarin/dataset/dataset.py b/become_yukarin/dataset/dataset.py
index fd7bab2..a0798b4 100644
--- a/become_yukarin/dataset/dataset.py
+++ b/become_yukarin/dataset/dataset.py
@@ -365,7 +365,6 @@ class RandomPaddingProcess(BaseDataProcess):

 class LastPaddingProcess(BaseDataProcess):
     def __init__(self, min_size: int, time_axis: int = 1) -> None:
-        assert time_axis == 1
         self._min_size = min_size
         self._time_axis = time_axis

@@ -374,7 +373,10 @@ class LastPaddingProcess(BaseDataProcess):
             return data

         pre = self._min_size - data.shape[self._time_axis]
-        return numpy.pad(data, ((0, 0), (pre, 0)), mode='constant')
+        if self._time_axis == 1:
+            return numpy.pad(data, ((0, 0), (pre, 0)), mode='constant')
+        else:
+            return numpy.pad(data, ((pre, 0), (0, 0)), mode='constant')

 class RandomCropProcess(BaseDataProcess):
@@ -629,12 +631,12 @@ def create_sr(config: SRDatasetConfig):
         data_process_test.append(SplitProcess(dict(
             input=ChainProcess([
                 LambdaProcess(lambda d, test: d['input']),
-                LastPaddingProcess(min_size=config.train_crop_size),
+                LastPaddingProcess(min_size=config.train_crop_size, time_axis=0),
                 FirstCropProcess(crop_size=config.train_crop_size, time_axis=0),
             ]),
             target=ChainProcess([
                 LambdaProcess(lambda d, test: d['target']),
-                LastPaddingProcess(min_size=config.train_crop_size),
+                LastPaddingProcess(min_size=config.train_crop_size, time_axis=0),
                 FirstCropProcess(crop_size=config.train_crop_size, time_axis=0),
             ]),
         )))