[7週間]プロジェクト準備

6813 ワード

最後のプロジェクトを行うためにチームを特定する必要があります.
興味のあるガンを提案すると、残念なことに、
ガンにあまり興味を持っている人はいません.
3つの選択肢があります
  • の注目度の低い他のトピックを選択してチームに参加します.
  • 1と並行して、GANのサブプロジェクトの処理を別途準備する.
  • 独自のプロジェクトを準備します.
  • 1就職先は変えられると思うので2と3を考えて、どうせ2をやるなら頑張ろう(2項目やるから)
    することにしました.
    他のチームの3~4人以上が一人で仕事を終えなければならないので、事前に準備することにしました.
    大事を準備するには計画が必要だ.
    計画通りにすべてを実現することはできませんが、
    しかし、これは計画がないわけではない.
    今判断すると、巨大な茎がリストされています.
    計画は段階的に進める.
    準備するプロジェクトの大きなフレームワーク.
    これは自然言語音声生成プロジェクトです.
    サービス面では、
    ビデオ+字幕ファイルの場合、
    字幕ファイルの内容により
    ビデオの各字幕位置で字幕コンテンツに適合する音声が生成され、ビデオにマージされる.
    音声生成はGANに基づく.
    声をイントネーション+アクセントに分ける場合、
    アクセントにはもっとデータが必要です.
    少なくとも少ないデータを受信
    データと似たような音を実現することが目標です.
    今から基礎内容から勉強します.
    具体的な中間目標は以下の通り.

    Webサーバは存在する必要があります。


  • Webサーバは、ビデオファイル、字幕ファイルを入力できます.

  • 基本的にいくつかのサンプル音を提供します.

  • (最も重要なのは)任意の音声ファイル(録音または音声ファイル)を提供することによって、対応する音声ファイルに基づいて音声を生成することができる.
  • 単純な声の類似性が基本前提
  • が提供する音声トーン情報は、データが少ない場合によく表現されますか?これはサーブの目標です.
  • ビデオを入力すると、手動で時間順にビデオを閲覧し、字幕を入力することができます.
  • サーバは、プログラマのサポートの下でAWSを使用する予定です.
  • Webサーバを配備する必要があります.
  • で予想される問題:アップロード、バッファ時間が長い(ビデオファイルの容量は通常大きい):商用サービスではないため、重要な考慮対象ではないが、どのように最小化するかを考慮すべきである.
  • GANベースの音声合成

  • 本事業は、商業化を目指したものではなく、自分の能力向上を目指したものです.

  • したがって,最も有効なアルゴリズムである必要はない.

  • 目標は、最新の、顕著な効果を有する、独自の利点を有する技術を使用することである.
  • どのテクノロジーを使用しても、独自の理由が必要です.この過程で、最大の改善点を見つけましょう.

    能率が高い

  • の商用化は目的ではありませんが、導入を前提としたサービスですので、使用上の深刻な問題を回避するために、できるだけ効率的に作成する必要があります.
  • 審美性


  • 従来の技術的な問題を解決した後、UIはより直感的で使いやすいように改善されるべきである.

  • シンプルで便利なデザインを目指します.
  • プロジェクトの進捗


    深さ学習モードが用意されていなければ、他はハウジングプロジェクトにすぎません.
    そのため、
    1.GANの基礎知識を学ぶ
    2.音声合成GANモデルの実装例
    現在、次のモデルを使用する予定です:HiFi-GAN
    3.例示的なデータを用いて実施形態のサービス適合性を評価する
    4.対応モデルを設計するサービスフロー
    5.データの準備とトレーニングの準備前のパターン
    5.Webサーバ実装(ベースUI)
    6.サーバを使用したWebおよびモデルの導入
    7.UIの改善とモデルの改善
    進行を計画する.

    Generative Advancial Networks,GANベース


    一般的に、ニューラルネットワークは情報を減少させ、停滞させ、収縮させる.
    例えば、画像分類の問題では、
    n*mは、画像画素データをk個の出力(分割タイプ)に変換する.
    これを逆にしたらどうですか.
    個入力すると、n*m画像の画素データが出力されますか?
    基本的にはbackqueryと呼ばれています.
    逆クエリによって生成される画像には、基本的に次の特性があります.
  • などの1つの熱符号化ベクトル面の結果を出力する.
  • ラベルを表示するすべてのトレーニングデータの平均画像が出てきました.
  • しかし、理想的な目標は上記ではなく、以下の内容である.
  • は、それぞれ異なる画像を生成する.(その他の結果)
  • は、元の入力されたトレーニングデータのように見える画像を生成する.
  • 一般的なクエリーでは、これらのターゲットを達成できません.
    しかし、それを可能にしたのはGAN.
    ガンから
    既存のより大きく、より広く、またはより深いニューラルネットワーク構造
    または新しいアクティブ化関数
    または新しい最適化方法
    GANは構造的に性質が異なることに発展した.

    判別器は入力値が真か否かを区別しなければならない.
    ジェネレータは、自分が生成した仮象を判別器を通過させるべきである.
    ジェネレータが作成した画像が判別器をだました場合,ジェネレータに奨励される.
    だまされなければジェネレータを罰します.
    この過程を繰り返す.
    判別器とジェネレータを互いに性能を向上させる(敵対関係)
    この場合、判別器とジェネレータは同時に類似のレベルに成長しなければならない.
    GANは基本的に以下の手順で構成される.
  • 判別器に実データを入力して分類する.結果は1で、誤差が発生した場合は判別器の更新に使用します.
  • 判別器に生成したデータを入力し分類する.結果はゼロで、誤差が発生した場合は判別器のみ更新します.

  • 訓練
  • ジェネレータ.

  • 似たようなレベルに達しなければならない.
    ジェネレータのニューラルネットワークは判別器のコピーから始まることが多い
    (もちろん、入出力は逆)
  • 11010 GAN例
  • 1、0、1、0の入力が真のデータであると判別する例.
    class Discriminator(nn.Module):
        def __init__(self):
            super().__init__()
            self.model = nn.Sequential(
                nn.Linear(4, 3),
                nn.Sigmoid(),
                nn.Linear(3, 1),
                nn.Sigmoid()
            )
            self.loss_function = nn.MSELoss()
            self.optimiser = torch.optim.SGD(self.parameters(), lr=0.01)
            
            self.count = 0
            self.progress = []
            
        def forward(self, inputs):
            return self.model(inputs)
        
        def train(self, inputs, targets):
            outputs = self.forward(inputs)
            loss = self.loss_function(outputs, targets)
            
            self.count += 1
            if (self.count % 10 == 0):
                self.progress.append(loss.item())
            if (self.count % 10000 == 0):
                print("counter : ", self.count)
                
            self.optimiser.zero_grad()
            loss.backward()
            self.optimiser.step()
            
        def plot_progress(self):
            df = pandas.DataFrame(self.progress, columns=['loss'])
            df.plot(ylim=(0, 1.0), figsize=(16, 8), alpha=0.1, marker='.', grid=True, yticks=(0, 0.25, 0.5))
    class Generator(nn.Module):
        def __init__(self):
            super().__init__()
            self.model = nn.Sequential(
                nn.Linear(1, 3),
                nn.Sigmoid(),
                nn.Linear(3, 4),
                nn.Sigmoid()
            )
            
            self.optimiser = torch.optim.SGD(self.parameters(), lr=0.01)
            
            self.counter = 0
            self.progress = []
            
        def forward(self, inputs):
            return self.model(inputs)
        
        def train(self, D, inputs, targets):
            # 신경망 출력 계산
            g_output = self.forward(inputs)
            # 판별기로 전달
            d_output = D.forward(g_output)
            loss = D.loss_function(d_output, targets)
            
            self.counter += 1
            if (self.counter % 10 == 0):
                self.progress.append(loss.item())
                
            self.optimiser.zero_grad()
            loss.backward()
            self.optimiser.step()
    ジェネレータのtrainを上図の3つのステップと比較すると、
    トレーナ時に判別器を更新しない
    %%time
    image_list = []
    D = Discriminator()
    G = Generator()
    # train Discriminator and Generator
    
    for i in range(10000):
        
        # 1단계 : 참에 대한 판별기 훈련
        D.train(generate_real(), torch.FloatTensor([1.0]))
        
        # 2단계 : 거짓에 대한 판별기 훈련
        # G의 기울기가 계산되지 않도록 detach 함수를 이용
        # G의 출력에 적용되어 계산 그래프에서 생성기를 떼어내는 역할
        # D에서 호출된 backward에서 시작된 기울기 계산이 생성기까지 이어지는데, 이를 떼어냄으로써 방지
        # 이는 결과에 영항을 주는 것이 아니라, 사실 이 계산이 필요없는 행위인데
        # 큰 신경망 구조에서 시간 복잡도에 영향을 주기 때문
        D.train(G.forward(torch.FloatTensor([0.5])).detach(), torch.FloatTensor([0.0]))
        
        # 3단계 : 생성기 훈련
        G.train(D, torch.FloatTensor([0.5]), torch.FloatTensor([1.0]))
        
        # add image to list every 1000
        if (i % 1000 == 0):
          image_list.append( G.forward(torch.FloatTensor([0.5])).detach().numpy() )
    
        pass
    GANトレーニング3段階後
    はつでんき
    だんだん、パターンがきつくなっていくのが見えます
    plt.figure(figsize = (16,8))
    
    plt.imshow(numpy.array(image_list).T, interpolation='none', cmap='Blues')