第2開発室プログラミングで学んだことの覚書やら、考察ネタやら、なんでもありこの広告は、90日以上更新していないブログに表示しています。追記]ライブラリとしてPyTorchを使ったバージョンを公開しました。NotebookをGitHubに上げています。推定できるアイドルの人数を7人から50人に増やしました。精度は6割程度ですが...詳細は後日公開したいと思います。―Pythonで学ぶディープラーニングの理論と実装」を買って、1週間で1冊終わらせることを目標にちまちまとやっていました。次にコレを使って何か面白いことでもできないかな〜と思っていたところ、この本でも実装したCNNでテキスト分類ができることを知り、それじゃアイマスのセリフ判定でもやってみるか、と思い立ち実際にやってみました。深層学習とは書いてますが、そこまで深くないと思います。73.6%)で判定できたので顛末を書いてみます。したいこと入力されたセリフがどのアイドルっぽいか、つまり「このセリフはどのアイドルが言いそうか?」ということを目的としました。やりたいことの大まかな流れとしては、以下の通りです。既存のセリフを訓練データ、そのセリフに対応するアイドル名を訓練ラベル(教師データ)とし、教師あり学習を行う。未知のセリフを分類器に通して、各アイドルっぽさを確率として出力し、降順にソートする。CNNというものを使うことにしました。CNNは文字単位で処理を行うため、分かち書きをしなくてもいい(厳密には分かち書きを行う際にしばしば利用される辞書が不要)、「うっうー!」や「はわっ!?」のような特徴的な単語に強い、という有利な点を持っています。」の10スライド目を見ると分かりやすいと思います。CNNを使った際の分類の大まかな流れを具体的に示すと、以下の通りになります。入力された文を文字単位の配列に分解する。それぞれの文字をUnicodeポイントに変換する。1文の最大文字列長は200文字とし、200文字未満はゼロ埋めする。Unicodeポイントの配列をベクトルの配列に変換する(今回はKerasのEmbeddingレイヤーを利用)このベクトルの配列を畳み込みニューラルネットワークに流す。全結合層(1層)に流し、結果を得る。2.1.3Pythonはもちろん3系を使いました。ライブラリとしてbackendがTensorFlowのKerasを使いました。Anaconda環境でのTensorFlowのインストール方法が公式に丁寧に載っていたので、この方法でインストールしました。Cloudからインストールしました。データの準備セリフが無いと学習のしようがありません。芸能人はデータが命!です。Chromeを使い、とあるサイトをスクレイピングしてセリフデータの収集をしました。サーバに負荷をかけないように適度にウェイトを入れたので、データ収集には10時間かかりました。セリフデータの形式は、「(アイドルのID).txt」とし、各行に1セリフを格納したテキストファイルを作成しました。全アイドルの数字ID、アイドルID、アイドル名をJSON形式のデータとして作成しました。データ読み込みJSONデータを読み込んでアイドルを列挙したあと、対象アイドルのセリフデータを読み込みます。セリフ1文とそのセリフのアイドルの数字IDを組として、すべてのセリフを結合し巨大な2次元配列を作成します。その後は以下のコードのような流れです。APIを使い、定義しました。最大文字列長)なテンソルを出力する。Embeddingレイヤーは、Unicodeポイントの整数(=1文字)の1次元配列をembed_size次元のベクトルの配列に変換する。embed_size)なテンソルを出力する。CoreレイヤーのReshapeは、畳み込み層が受け取る入力を生成する。チャネル)なテンソルに変形し、出力する。複数の畳み込み層(ConvolutionalレイヤーのConv2D)に、同一な3.の出力を入力し、1〜5の異なる高さのカーネルをそれぞれの層で1文字ずつスライドさせて畳み込む。その後、プーリング層(PoolingレイヤーのMaxPooling2D)に流す。畳み込んだ結果を結合(Mergeレイヤーのconcatenate)し、平滑化(CoreレイヤーのFlatten)する。全結合層(CoreレイヤーのDense)に流し、1次元に変換して結果を出力する。活性化関数はReLUを使っています。厳密には、ZeroPadding2Dを使ってゼロ埋めしたり、Dropoutで正則化したりしています。Normalizationは使っていましたが、あまり効果は出ませんでした。畳み込み層が受け取る入力を生成する。同一の入力に対して、1〜5の高さの複数のフィルタを1文字ずつスライドさせて畳み込む。その後、プーリング層に流す。1〜5文字ぶんの高さのフィルタを適用している。これは、1-gram〜5-gramを模倣している。畳み込んだ結果を結合する。これは、複数のN-gramをまとめて利用していることと同じようになる。結合した出力を平坦にReshapeして、全結合層に流す。modelモデルを可視化すると以下のようになります。途中で学習を中断しても、中断したところから再開できるようにval_accが改善する度に重み(とモデル)をHDF5形式のバイナリファイルに保存するようにしました。epoch毎の損失と精度を保持し、それらを学習の終了後にグラフとして可視化するようにしました。最適化アルゴリズムはAdam、損失関数はpoissonとしました。4.0)を使って学習させました。3分程度(216秒)で終わりました。GPUってやっぱすごいですね...。検証データでは73.68%の精度となりました。8人に増やすと訓練データでは99%を超えるものの検証データに対して25%程度の精度と、過学習してしまう惨憺たる結果となってしまいました。判定してみる推論フェーズは、別ファイルに独立なコードとして書きました。2)))訓練データにはグリマスのデータを利用したため、ミリシタのデータを使って判定してみます。あの、プロデューサー。私に手伝えることがあれば、言ってください。私も、この劇場...765プロ劇場のために、何かしたいんです。'あの、プロデューサー。私に手伝えることがあれば、言ってください。私も、この劇場...765プロ劇場のために、何かしたいんです。0.01%千早っぽさの確率が65.22%で、正しく(?)判定できているようです。0.0%これもいい感じです。EC2で稼働させようと思ったのですが、メモリを食いまくって安いインスタンスだとPython自体がすぐkillされて使い物にならないので、当分は自宅PCで動かします。運が良ければ稼働していると思います。動かす予定はありません。1.xのAPIであったため、2.xのAPIに書き直す作業でかなり時間を使ってしまいました。Notebookを使いました。matplotlibで可視化したlossとaccuracyのグラフがひとつになってしまいました...。GitHubに全コードをアップしてあります。Colaboratoryで学習させたNotebookに差し替えました。精度6割で、ついに50人達成!PyTorchバージョンも公開しました。github.comバンナムでもミリマスのセリフを制作する際に深層学習や機械学習を利用しているようです。RNNを使っているみたいですね。cedec.cesa.or.jpこのセッションでは我々の行ったいくつかの取り組みと、特にアイドルマスターミリオンライブをモチーフに、これまでのセリフデータから「そのキャラらしさ」を人工知能に学習させ、新規セリフの制作や監修を支援するシステムを開発した事例をご紹介します。DeckKerasが2.0にアップデートされました。»プロフィールid:skypenguinsプログラミング、アイマスネタをつらつらと書いています。参加グループプログラミングはてなブログをはじめよう!skypenguinsさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。