layout |
---|
default |
- Chapter 1-1: Image Processing and Visualization (pp.224-256)
- Chapter 1-2: Audio Processing and Visualization
- Chapter 1-3: Preprocessing for Machine Learning
- Chapter 2-1: Image Classification with Transfer Learning and Fine Tuning
- Chapter 2-5: Image Generation with GANs
- Chapter 2-7: NLP with Transformer
- Chapter 3-1: TransformerからVision Transformerへの進化
- Chapter 3-2: Vision Transformerの基礎と実装
- Chapter 3-3: 実験と可視化によるVision Transformerの探究
- Chapter 2-6: Anomaly Detection with GANs
- Chapter 4-1: Diffusion Probabilistic Models
- Chapter 1: 下山 輝昌、伊藤 淳二、露木 宏志 著「Python実践 データ加工/可視化 100本ノック」(秀和システム)
- Chapter 2: 小川雄太郎 著「つくりながら学ぶ!PyTorchによる発展ディープラーニング」(マイナビ出版)
- Chapter 3: 山本晋太郎、徳永匡臣、箕浦大晃、邱玥、品川政太朗 著「Vision Transformer入門」 (技術評論社)
Load an image using cv2.imread and show it.
Check out the shape of an image and pixel values in the blue channel.
Crop an image between (700,300) and (1200,800).
Visualize the color histogram of an image using cv2.calcHist.
Change the channel order from RGB -> BGR using cv2.cvtColor.
The following script was written to make an image underexposed.
img_dim = img_rgb * 0.5
plt.imshow(img_dim)
However, the result seems strange:
Please figure out why the problem has occurred, and modify the script to achieve the desired result:
- Take a photo using your smartphone.
- Implement color scrambling.
- Apply color scrambling to the photo.
- Any block size can be used.
- Upsample and downsample an image.
- Try various interpolation methods and compare the results.
- Rotate an image.
- Flip an image (both horizontal and vertical).
- Convert a color image to a grayscale one.
- Binarize an image.
- Apply a smoothing filter to an image (use cv2.bulr).
- Draw a text on an image.
- Draw a rectangle on an image.
- Save an image using cv2.imwrite
- Take a photo using your smartphone.
- Implement block scrambling.
- Apply block scrambling to your photo.
- Load an RGB image and transform its color space to YCbCr.
- Processing time limitation is within 4 second.
- Color space transform equations are
Y = 0.29900 * R + 0.58700 * G + 0.11400 * B
Cb = -0.16874 * R + -0.33126 * G + 0.50000 * B
Cr = 0.50000 * R + -0.41869 * G + -0.08100 * B
- TIPS: np.reshape and matrix multiplication would be helpful.
- HOMEに課題を解くための雛形をアップロードしましたので下記の手順からダウンロードしてください
git pull
git checkout main
- HOMEディレクトリに、新しいChapができてるので,そこから必要なファイルをコピー(自分のマシンのデスクトップなどに一時的にペースト)
git checkout 自分のブランチ名
で自分のブランチにもどる- デスクトップなどに一時的にペーストしたファイルを自分の作業ディレクトリにコピペ
- 発表では、音声がzoomで聞けるように工夫をお願いします
- 2つの音声を比較するときは,立て続けに再生して比較するようにしましょう(2つの音声再生の間に,話したりしないようにしましょう)
- librosaを使用して"音声.mp3"と"携帯電話着信音.mp3"を読み込んでください(ノック72)
- "音声.mp3"と"携帯電話着信音.mp3"を再生してください(ノック71)
- vscode+jupyter環境では音源を再生できないので注意してください(ノック71)
- 音源ファイルのサンプリングレートを確認してください(ノック72)
- ロードした音源を配列に格納し、shape/max/minを確認してください(ノック72)
- "音声.mp3"と"携帯電話着信音.mp3"を1秒間のデータに切り出してください
- 編集したファイルを再生してみましょう
- サンプリングレートとは何かを説明してください
- サンプリングレートを22050Hzにして"音声.mp3"と"携帯電話着信音.mp3"を読み込んで再生してみましょう
- サンプリングレートを8000Hzも読み込んで再生してみましょう
- サンプリングレートを変更したら,配列の形状を確認してみよう
- getsamplerate()で元のファイルのサンプリングレートを表示してみよう
- librosa.display.waveshowを使って,"音声.mp3"の音声波形を可視化してみましょう(44100/22050/8000Hzそれぞれ可視化してください)
- "携帯電話着信音.mp3"の音源波形を確認してみましょう(44100HzのみでOK)
- RMSとは何かを説明してください
- numpyを使って,"音声.mp3"のデータ全体に対してのRMSを計算してください
- "音声.mp3"と"携帯電話着信音.mp3"の時間別のRMSを算出してください
- "音声.mp3","携帯電話着信音.mp3"のRMSデータ(全体・時間別ともに)を可視化してください
- "音声.mp3"を,soundfileを使って,WAV形式で音データを保存してください
- 出力したWAVファイルを再度ロードし,その音を確認してください
- ノック80なので注意してください
- wavデータを読み込んでください(wavデータは,dataフォルダを参照)
- pydubのAudiosegmentを使って,flacおよびmp3で音源ファイルを保存(出力してください)
- wav/flac/mp3について説明してください
- wav/flac/mp3のデータの圧縮率を確認してください
- 圧縮率に違いがあれば,その理由を考察してください
- フーリエ変換とは何かを説明してください
- "音声.mp3"をフーリエ変換してみましょう
- "音声.mp3"の振幅スペクトルを表示してみましょう
- "音声.mp3"(サンプリングレート22050Hz)の振幅スペクトルを表示してみましょう
- "携帯電話着信音.mp3"の振幅スペクトルを表示してみましょう
- スペクトログラムとは何かを説明してください
- librosaのライブラリを使って,"音声.mp3"のスペクトログラムを表示してみましょう
- librosaのライブラリを使って,"携帯電話着信音.mp3"のスペクトログラムを表示してみましょう
- librosa.effects.pitch_shiftを使い,"音声.mp3"をピッチのステップ数10で,音を変換してみましょう
- librosa.effects.pitch_shiftを使い,"音声.mp3"をピッチのステップ数-5で,音を変換してみましょう
- librosa.effects.time_stretchを使い,"携帯電話着信音.mp3"をレート数0.5で,音を変換してみましょう
- librosa.effects.time_stretchを使い,"携帯電話着信音.mp3"をレート数2で,音を変換してみましょう
- VTLNとClippingについて説明してください
- "音声.mp3"を読み込みましょう
- "音声.mp3"にVTLNとClippingを施し,音を再生してみましょう
- VTLNとClippingのパラメータを調節して,結果がどう変わるかを確認してみましょう
- HOMEに課題を解くための雛形をアップロードしましたので下記の手順からダウンロードしてください
git pull
git checkout main
- HOMEディレクトリに、新しいChapができてるので,そこから必要なファイルをコピー(自分のマシンのデスクトップなどに一時的にペースト)
git checkout 自分のブランチ名
で自分のブランチにもどる- デスクトップなどに一時的にペーストしたファイルを自分の作業ディレクトリにコピペ
- この章では,タイタニック号の生存状況のデータに基づき,海難事故にあった場合どういった顧客が生存できるのかを予測するモデルを作成します.
- seabornのload_datasetを使って,'titanic'のデータセットを読み込みましょう
- 'titanic'のデータセットが,どのようなデータセットなのか簡単に説明してください(各カラムの意味など)
- "目的変数"および"説明変数"とは何かをそれぞれ説明してください
- データセットから,目的変数の列のみを取り出してみましょう
- "教師あり学習"と"教師なし学習"とは何かをそれぞれ説明してください(具体的なモデル名が分かればそれを例示してください)
- "Trainデータセット"および"Testデータセット"とは何かをそれぞれ説明してください("Validationデータセット”など,その他の種類があればそれも説明してください)
- sklearnのtrain_test_splitを使って,データセットをTrainデータ(train_ds)とTestデータ(test_ds)に分割してください
- train_test_splitの仕様(引数など)を簡単に説明してください
- 分割したデータを確認してみましょう
- 今回のタスクにおける"データリーク"の意味を説明してください(ラベル"survived"とカラム"alive"の関係を例に説明するとよいでしょう)
- 予測モデルを作成するにあたって,必要なデータと不要なデータがそれぞれ何かを説明してください
- dropを用いて,不要な変数名をデータセット(train_ds)から削除しましょう
- "One-hotエンコーディング"および"labelエンコーディング"とは何かをそれぞれ説明してください
- Trainデータセット(train_ds)をone-hotエンコーディングしてみましょう
- Trainデータセット(train_ds)をlabelエンコーディングしてみましょう
- Labelエンコーディングの問題点を挙げてください
- train_dsの"pclass"列をone-hotエンコーディングしてみましょう
- train_dsのTrue/Falseを1/0の数値に変換しましょう
- 欠損値とは何かを説明してください
- 欠損値はどのように処理されるのか調べてみましょう(テキスト参照)
- データセット(train_ds)に欠損値がないか確認してください(各カラムごとの欠損値の合計数を確認してください)
- train_dsの欠損値を中央値で補完で補完しましょう
- sklearn.imputeのSimpleImputer使用
- 作成したSimpleImputer(age_imputer)をpickleを用いて保存してください
- Testデータセット(test_ds)の内容を確認しましょう
- Testデータセットの不要な項目を削除しましょう(aliveとembark_town)
- Testデータセットをカテゴリカル変数に変換しましょう
- TestデータセットのTrue/Falseを0/1に変換しましょう
- 今週は、merge関数を用いてTrainデータセットとTestデータセットのカラム違いを解消する必要はありません
- 今週は、スケーリングを行う必要はありません
- train_dsの欠損値補完に使用したage_imputerをpickleでロードして、test_dsの欠損値を補完してください(図7-40参照)
- 加工したtest_dsを確認してください
- sklearn.svm.SVCを用いて、モデルを訓練してみましょう
- Trainモデルに対する精度を評価しましょう(モデル名.scoreで評価できるはずです)
- Testモデルに対する精度を評価しましょう
- 今週は,SVMの詳しい説明は不要です(2週間後にまとめて勉強します)
- 外れ値とは何かを説明してください
- 箱ひげとIQRについて簡単に説明してください
- 箱ひげとIQRに基づいて,外れ値に該当するデータの件数を調べましょう
- スケーリングとは何か説明してください(特に,正規化・標準化・ロバストスケーリングについて説明してください)
- 正規化・標準化・ロバストスケーリングは,それぞれどのような分布に対して有効なのか説明してください
- train_dsの基本統計量を確認してください
- データ分布の違いをヒストグラムで可視化しましょう
- 統計学の検定(カイ二乗検定とシャピロ-ウィルク検定)について説明してください
- カラムageについて,カイ二乗検定/シャピロ-ウィルク検定のp値を算出してください(さらに,一様性と正規性を判定してください)
- カラムsidspについて,カイ二乗検定/シャピロ-ウィルク検定のp値を算出してください(さらに,一様性と正規性を判定してください)
- カラムparchについて,カイ二乗検定/シャピロ-ウィルク検定のp値を算出してください(さらに,一様性と正規性を判定してください)
- カラムfareについて,カイ二乗検定/シャピロ-ウィルク検定のp値を算出してください(さらに,一様性と正規性を判定してください)
- age,sidsp,parch,fareについて,それぞれどのようなスケーリング手法を行うのが良いか,理由とともに検討してください
- 変数間で分布が同じ場合は,どのようなスケーリングを行うのが良いでしょうか;一方で,変数間で分布が異なる場合は,そのようにスケーリングすれば良いでしょうか(テキストp.306 参照)
- age,sidsp,parch,fareをスケーリングしてください(sklearn.preprocessingにスケーラーがあります)
- スケーリングしたデータの分布をヒストグラムで可視化しましょう
- os.makedirsでフォルダを作成し,スケーラーをpickle形式で保存してください
- スライドでの説明は不要です
- 学習時のデータのサンプル比率を調整する必要性について説明してください
- アンダーサンプリングとオーバーサンプリングについて説明してください
- 目的変数のデータ件数を調べてみましょう
- train_dsをアンダーサンプリング/オーバーサンプリングしてください
- Q.5 テストデータの前処理をしよう(ノック90)-パート1-をもう一度行いましょう
- 今週は、カラム違いの解消・スケーリングを行ってください
- Pandasのmergeを用いて、TrainデータセットとTestデータセットのカラム違いを解消してください(その原因が分かれば簡単に説明してください)
- カラム解消で用いた、Pandasのmergeについて説明してください(特に、how='left'の部分について)
- SVMとは何か説明してください
- sklearn.svm.SVCを用いて、モデルを訓練してみましょう
- Trainモデルに対する精度を評価しましょう(モデル名.scoreで評価できるはずです)
- Testモデルに対する精度を評価しましょう
- Q.6 追加課題1の精度と比較してみましょう
- 特に指定がない限り、教科書で用いているPytorchのサンプルコードを利用してください
- 「簡単に説明してください」は口頭での説明のみでも構いません
- GPUマシンが混雑している場合は、代表者1〜2名のみが学習を行い、その結果をシェアして発表する形式でも構いません(全員がGPUマシンで学習スクリプトを実行&精度を出すことを行わなくても良いです)
- 学習スクリプトを回さない人でも、コーディングとエラーがないかのチェックは行いましょう
- ImageNetデータセットについて説明してください(クラス数・訓練データ数・ベンチマークなど)
- データセットと関連が深い、ミニバッチ学習について説明してください(なぜそれをやるとよいのかなど)
- この課題で利用するパッケージをimportしてください
- Pytorchのパージョンを確認してください
- スライドの説明はなしで構いません
- 畳み込み層・プーリング層・全結合層について説明してください
- Dropout層について説明してください
- 活性化関数とReLUについて説明してください
- VGG-16を説明してください(発表年・モデル構造・解決しようとした主な問題など)
- featureモジュールとclassifierモジュールについて説明してください
- VGG-16の学習済みモデルをロードしてください
- Pythonの
__call__()
メソッドについて簡単に説明してください - torchvisionの
transform.resize()
、transform.CenterCrop()
、transform.ToTensor()
、transform.Normalize()
についてそれぞれ説明してください transform.ToTensor()
を実行すると、PIL形式の入力画像のサイズ(Shape)はどのように変化するか説明してください- 上記のメソッドを使って、画像を224x244にリサイズおよびセンタークロップしてください
- 画像の色情報を平均(0.485, 0.456, 0.406)、標準偏差(0.229, 0.224, 0.225)で標準化してください
- なぜこのリサイズと標準化が必要なのか説明してください(ヒント:学習済みモデル)
./data/goldenretriever-3724972_640.jpg
を読み込み、前処理を行う前後の画像を比較しましょう
Q.5~Q.6を通しで実行した後で下記の質問を考えるほうが良いと思います
- VGG16の出力サイズ(shape)とそのデータ型は何でしょうか(Q.6を実行するとわかります)
- VGG16の出力をNumPy型に変換してください
- np.argmax()について説明してください
- ラベルとnp.argmax()の関係について説明してください
./data/imagenet_class_index.json
を読み込んで、その中身について簡単に説明してください- 読み込んだjsonを使って、VGGの出力からラベルを得るクラスを作成してください
- unsqueeze_()メソッドを行う理由を説明してください(ヒント:バッチサイズ)
./data/goldenretriever-3724972_640.jpg
を分類してみましょう
- 図1.2.1 (p.15) を参考に,Pytorchによるディープラーニング実装の流れを説明してください
- ネットワークモデルの順伝搬関数 (forward)とは何かを説明してください
- 損失関数について説明してください(計算方法・損失関数の種類など)
- 誤差逆伝播と最適化手法について説明してください(2つの関係性・最急降下法の式・最適化手法の種類など;ただしSGD,Adamなどの個々の詳解は不要です)
- ネットワークモデルの重み(パラメータ)の初期値は,どのような値であるか説明してください
- 過学習とは何かを説明してください
- Validationデータセットとは何か説明してください(Testデータセットとの違いなど)
- early stoppingとは何かを説明してください(導入の目的など)
- 転移学習とは何かを説明してください(ファインチューニングについて調べるとより違いが明確になります)
- 今回のタスクについて説明し、転移学習をどのように適用したかを説明してください
- 必要なパッケージをimportしてください(説明は不要)
- 乱数のシードとは何か簡単に説明してください(特に、機械学習との関係について)
- 前処理クラスImageTransformを作成してください
- データ拡張(オーギュメンターション)とは何かを説明してください
RandomResizedCrop
とRandomHorizontalFlip
について説明してください- ImageTransformを施した前後の画像を比較してください
- アリとハチの画像へのファイルパスリストを作成し、それらの画像のDatasetを作成してください
- 作成したDatasetを使ってDataLoaderを作成してみましょう
- 学習済みのVGG-16モデルをロードしましょう
- 転移学習を行うために、VGG-16モデルを加工してください
- softmax関数について説明してください
- Cross Entropy誤差関数について説明してください
- Cross Entropy誤差関数を実装しましょう
- Momentum SGDについて説明してください
- 最適化手法を実装しましょう
- 転移学習を用いて学習・検証を実行してください
- LossとAccuracyを確認してください
- 今回はスキップします。興味のある方は読んでみてください。
- ファインチューニングとは何かを説明してください
- 転移学習のときと同様に、DatasetとDataLoaderを作成してください(説明は不要)
- 学習済みのVGG-16モデルをロードしましょう
- ファインチューニングを行うために、VGG-16モデルを加工してください
- 転移学習のときと同様に、Cross Entropy誤差関数を実装しましょう(説明は不要)
今回は、各層ごとに学習率を変更します
- 学習させる層のパラメータ名を指定し、パラメータごとに各リストに格納してください
- 最適化手法を、パラメータごとに設定してください
- PytorchでGPUを用いた演算を有効化する方法を簡単に説明してください
- ファインチューニングを用いて学習・検証を実行してください
- LossとAccuracyを確認してください
- ネットワークモデルの変数
net
からパラメータを取り出し、保存してください - 保存した重みを、再度ロードしてみましょう(CPU、GPUでそれぞれ計算されたパラメータの違いに注意してください)
- 特に指定がない限り、教科書で用いているPytorchのサンプルコードを利用してください
- GPUマシンが混雑している場合は、代表者1〜2名のみが学習を行い、その結果をシェアして発表する形式でも構いません(全員がGPUマシンで学習スクリプトを実行&精度を出すことを行わなくても良いです)
- 学習スクリプトを回さない人でも、コーディングとエラーがないかのチェックは行いましょう
- 下準備として,make_folders_and_data_downloads.ipynbの実行が必要です
- MNISTデータセットについて簡単に説明してください
- 画像生成とは,どのようなタスクであるか説明してください(必要であれば,MNISTデータセットを例にして,画像分類との違いを説明しても良いです)
- GAN(オリジナル)・DCGANについて調査し,そのモデルの構造を説明してください(両者の違いなど)
- DCGANのGeneratorについて説明してください(モデルの構造など)
- 転置畳み込み層について説明してください
- Generatorの入力は何ですか
- Batch Normalizationとは何かについて説明してください
- DCGANのGeneratorを実装してみましょう
- 学習なしでGeneratorから画像を生成し,結果を確認しましょう
- Discriminatorについて説明してください(モデルの構造,Discriminatorは何を識別するのか,Generatorとの関係性など)
- Discriminatorを実装してみましょう
- 活性化関数であるLeakyReLUについて説明してください
- DCGANのDiscriminatorの損失関数について説明してください(テキストの式を解説してください)
- Discriminatorの損失関数を実装してみましょう
- DCGANのGeneratorの損失関数について説明してください(テキストの式を解説してください)
- Generatorの損失関数を実装してみましょう
- DCGANでは,なぜLeakyReLUを活性化関数に利用したのでしょうか? ※ 損失関数は,実装のみで,動作確認はエラーとなりできません(この時点では,入力がないためです)
- MNISTデータセットのDataLoaderを実装しましょう(説明は簡単で構いません)
- 今回は,MNISTデータセットの一部のみを使ってGANを学習させる点に注意してください
- DCGANのモデルの初期化を行いましょう
- Generator・Discriminatorを学習するための関数 train_modelを実装しましょう
- 200epochでGenerator・Discriminatorの学習を行ってください
- 生成画像と訓練データを並べて表示し,その結果を確認しましょう
- GANの欠点について調べましょう(2つ以上,その1つにモード崩壊を含めて可)
- モード崩壊とは何か説明してください ※ x.float()でデータの型を修正する必要があるかもしれません
- 転置畳み込み層を用いたGANが持つ問題点について説明してください
- Self-Attentionを導入することで解決される問題は何ですか
- Self-Attentionを式と図を用いて説明してください(特徴マップは1次元化されていることに注意)
- 以上の説明を踏まえて,Self-Attentionの概念を今一度まとめてみましょう→p.269(転置畳み込み層にどのような制約がつくのか,大きなカーネルサイズを用いることがなぜ難しいのかなど)
- pointwise convolutionの処理について説明してください
- Self-Attentionを使用する前段階でpointwise convolutionを用いる2つのメリットを説明してください
- Spectral Normalizationの概要について説明してください(Batch Normalizationとの違いなど)
- リプシッツ連続性について説明してください
- Self-Attentionモジュールを実装してみましょう
- Generatorを実装してみましょう
- Spectral Normalization・Self-Attentionに重点をおいて説明してください
- Discriminatorを実装してみましょう
- 上記と同じく,Spectral Normalization・Self-Attentionに重点をおいて説明してください
- DataLoaderを実装しましょう(前回と同じなので説明は不要)
- Self-Attention GANの損失関数(hinge version of the adversarial loss)について説明してください
- Generator・Discriminatorを学習するための関数 train_modelを実装しましょう
- Self-Attention GANのモデルの初期化を行いましょう(説明は不要)
- 300epochでGenerator・Discriminatorの学習を行ってください
- 生成画像と訓練データを並べて表示し,その結果を確認しましょう
- 生成画像とAttention mapを並べて表示し,その結果を確認しましょう ※ x.float()でデータの型を修正する必要があるかもしれません
- 特に指定がない限り、教科書で用いているPytorchのサンプルコードを利用してください
- GPUマシンが混雑している場合は、代表者1〜2名のみが学習を行い、その結果をシェアして発表する形式でも構いません(全員がGPUマシンで学習スクリプトを実行&精度を出すことを行わなくても良いです)
- 学習スクリプトを回さない人でも、コーディングとエラーがないかのチェックは行いましょう
- 下準備として,make_folders_and_data_downloads.ipynbの実行が必要です
- CUDA10.2非対応のGPU(RTX3090など)では,バージョンの問題で学習スクリプトが動作しない可能性があります(学習以外であれば動作します)
- 必要ライブラリ| janome, torchtext, gensim, spacy(おそらく不要ですがエラーが出ればインストールをお願いします)
- バージョン依存の制約がかなり強いため,自分が試して動いたライブラリのバージョンを列挙します(記載以外でライブラリ〇〇のバージョンを知りたいなどの希望があれば連絡ください)
- 最低限、torchtextが
0.11.x
以下であれば、その他のライブラリのバージョンは何でも問題ありません(ただし、torchtextがとの依存があるため、torchは0.10.x
以下でなければなりません)。
gensim 4.2.0
Janome 0.4.2
numpy 1.19.4
six 1.15.0
spacy 3.4.1
spacy-legacy 3.0.10
spacy-loggers 1.0.3
torch 1.10.2+cu111
torchfile 0.1.0
torchtext 0.11.2
zipp 3.4.0
- requirements.txtを用意しました|このファイルを任意のディレクトリにコピーし、そのディレクトリで以下を実行する (必ず個人のvenv内で実行すること)
python3 -m venv "任意の名前" # 新規でvenvを作る場合
source "venv作ったディレクトリのパス名"/bin/activate
pip install --upgrade pip
pip install -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cu111
- 自然言語処理(NLP)におけるコーパスとは何か説明してください
- 機械学習における自然言語処理の流れを説明してください(クリーニング,正規化,形態素解析,見出し語化,ストップワード除去,単語の数値化)
- 単語分割のライブラリであるJanomeについて説明いてください
- Janomeを使って単語分割を実装してください(入出力結果や関数群の簡単な説明を含む)
- 単語分割のライブラリであるMeCabおよびNEologdについて説明いてください
MeCabを使って単語分割を実装してください(環境構築が面倒なので今回はスキップします)
- 使用するデータについて簡単に説明してください
- Janomeを使って、単語分割を行う関数を定義しましょう(説明は不要)
- 前処理を行う関数を定義しましょう(前処理の内容を説明してください)
- 前処理→単語分割を行う関数 tokenizer_with_processing を実装し、結果を確認してください
- torchtextのバージョン違いによるエラーを回避する場合は、
import torchtext.legacy as torchtext
でtorchtext
をインポートしてください torchtext.data.Field
の引数や処理の役割を簡単に説明してください- ./data/text_train.tsvを読み込んで、テキストとラベルからなるデータセット
train_ds
を作成しましょう
- NLPにおける単語の数値化について説明してください(なぜ数値化が必要なのかなど)
- ID0の
<unk>
について説明してください - ID1の
<pad>
について説明してください - ボキャブラリーを作成し、結果を確認してください
- DataLoaderを作成しましょう(バッチ化してください)
- 出力結果を確認しましょう(ボキャブラリーと照らし合わせて、単語が正しくid化されていることを確認しましょう)
- 単語のid化が抱える2つの問題を説明してください
- 単語のベクトル表現について説明してください(ベクトル化によって,2つの問題はどのように解消されますか)
- CBOWとSkip-gramについて違いなどをそれぞれ説明してください
- Skip-gramの方が,CBOWよりも優れている理由を説明してください
- fastTextについて簡単に説明してください
- サブワードについて説明してください(英語・日本語での違いなど)
11/22(火)までの課題はここまで
- 注意 | 教科書はMeCabですが,使用しません
- Janomeを使ったtokenizer_with_preprocessing(p335~の7.2)からコピーしてきましょう(説明は不要)
- DataLoaderを以下の通り定義しましょう(説明は不要)
import torchtext.legacy as torchtext
# tsvやcsvデータを読み込んだときに、読み込んだ内容に対して行う処理を定義します
# 文章とラベルの両方に用意します
max_length = 25
TEXT = torchtext.data.Field(sequential=True, tokenize=tokenizer_with_preprocessing,
use_vocab=True, lower=True, include_lengths=True, batch_first=True, fix_length=max_length)
LABEL = torchtext.data.Field(sequential=False, use_vocab=False)
# フォルダ「data」から各tsvファイルを読み込みます
train_ds, val_ds, test_ds = torchtext.data.TabularDataset.splits(
path='./data/', train='text_train.tsv',
validation='text_val.tsv', test='text_test.tsv', format='tsv',
fields=[('Text', TEXT), ('Label', LABEL)])
- word2vecを実装し,簡単にコードの説明をしてください
- 1単語あたりの次元数と,単語数を調べてください
- ベクトル化したバージョンのボキャブラリーを作成し,結果を表示してみましょう
- ボキャブラリー単語の順番を確認してください(この確認は重要です)
姫 - 女性 + 男性
のベクトルを計算し,王子
とのベクトルが近くなることを確認しましょう- 注意 | Janomeの使用により,単語のインデックスが教科書のものとずれていますので,インデックスを確認して修正してください
王子
以外にも,女王
,王
,機械学習
のベクトルと比較しましょう
- fastTextを実装し,簡単にコードの説明をしてください(以下,word2vecと同様です)
- 1単語あたりの次元数と,単語数を調べてください
- ベクトル化したバージョンのボキャブラリーを作成し,結果を表示してみましょう
- ボキャブラリー単語の順番を確認してください(この確認は重要です)
姫 - 女性 + 男性
のベクトルを計算し,王子
とのベクトルが近くなることを確認しましょう- 注意 | Janomeの使用により,単語のインデックスが教科書のものとずれていますので,インデックスを確認して修正してください
王子
以外にも,女王
,王
,機械学習
のベクトルと比較しましょう
- IMDbデータセットについて簡単に説明してください
- csv,tsvについて簡単に説明してください
- IMDbデータセットを,tsv形式に変換するプログラムを実装してください(処理の内容なども説明してください)
- 前処理と単語分割の関数を実装してください
- どのような文字整形を行なったかなど説明してください
- torchtextのバージョン違いによるエラーを回避する場合は、
import torchtext.legacy as torchtext
でtorchtext
をインポートしてください - torchtext.data.Fieldの使用を簡単に説明してください
- torchtext.data.Fieldを用いて,tsvを読み込んでTEXTとLABELに施す処理を定義してください
- torchtext.data.TabularDataset.splitsを使って,Datasetを作成しましょう
- Datasetの数が25000であることを確認しましょう
- Datasetを訓練・検証用のデータセットに分割しましょう(それぞれ20000件と5000件)
- ボキャブラリーを作成しましょう
- 1単語あたりの次元数と,単語数を調べてください
- ボキャブラリーの内容を確認しましょう
- DataLoaderを作成し,作成されたDataLoaderからの出力を確認しましょう
- DataLoaderからの出力がベクトル表現でない理由を説明してください
11/29(火)までの課題はここまで
- テキスト分類など,NLPにはどのようなタスクがあるか調べましょう
- 今回は,どのNLPタスクに挑戦しますか?
- 画像データと言語データの違いについて説明してください
- 再帰的ネットワーク(RNN,LSTM)について説明し,その問題点もあげてください
- 言語データへCNNを使用する方法について説明し,その問題点もあげてください
- 今回使用するTransformerの全体像を説明してください(入出力なども含めて)
- Embedderモジュールについて説明してください(pp.369~371)
- Embedderモジュールを実装してみましょう(pp.371~372)
- PositionalEncoderモジュールについて説明してください(pp.373~374)
- Transformerモジュールについて,maskも含めて説明してください(pp.375~378)
- ClassificationHeadモジュールについて簡単に説明してください(pp.379)
- 各モジュールを組み合わせて,Transformer(全体)を実装してください
- DataLoaderとTransformerを実装してください(過去に使用したコードを使い回せます)
- 損失関数と最適化手法を定義(実装)してください
- 訓練および検証を行う関数を実装しましょう
- 実行結果(損失や精度など)を表示しましょう
- 訓練したTransformerを用いて,テストデータでの正解率を確認しましょう
- 説明可能な人工知能(XAI)について簡単に説明してください
- Attentionの可視化の関数を実装してください(説明は不要)
- indexを制御して,テストデータミニバッチ中のあるデータに対するAttentionの結果を可視化しましょう
- 正解できたテストデータ,正解できなかったテストデータをそれぞれ可視化してみましょう
- 可視化した2つのテストデータについて簡単に分析してみましょう
12/6(火)までの課題はここまで
- 特に指定がない限り、教科書で用いているPytorchのサンプルコードを利用してください
- GPUマシンが混雑している場合は、代表者1〜2名のみが学習を行い、その結果をシェアして発表する形式でも構いません(全員がGPUマシンで学習スクリプトを実行&精度を出すことを行わなくても良いです)
- 学習スクリプトを回さない人でも、コーディングとエラーがないかのチェックは行いましょう
- NLPのTransfromer,BERT,ViBERT,DALL•E,DETR,ViTの関係を調べましょう
- 特に,NLP→Vision and Language→Computer visionのタスクの関係について説明してください
- 関係性が説明できれば十分であり,各手法を詳しく説明する必要はありません
- 教科書の2-2を参考に,ViTの全体像を説明してください
- Input Layer,Encoder,MLP Headについてそれぞれ簡単に概要を説明してください
- Input Layerでは,主に4つ処理を行いますが,それらは何であるか調べましょう(教科書の2-3を写して構いません)
- パッチ分割とFlattenについて説明してください(なぜパッチ分割・ベクトル化が必要なのかなども含めて)
- 以下を踏まえて,Patch Embeddingについて説明してください
- 「One-hotベクトル」と「より良いベクトル」をそれぞれ説明しましょう
- より良いベクトルを作るには,どうすれば良いのか説明しましょう
- より良いベクトルを作ることのメリットを簡単に説明してください
- クラストークンについて説明してください(何を示すものなのか,使い道など)
- 以下を踏まえて,Positional Embeddingについて説明してください
- なぜそれが必要なのか
- Positional Embeddingの値について(学習可能なパラメータか否か,どのような値を初期値に取るのかなど)
- Input Layerへの入力を数式で表してみましょう
- Input Layerを実装しましょう
- 特に,4つの処理とコードとの対応関係,実装方法を説明してください
- (W,H,Ch)=(32,32,3)の画像を入力し,Input Layerからの出力shapeを確認してください
12/13(火)までの課題はここまで
- Self-Attentionのモチベーションについて説明してください
- 必要であれば,教科書の力作の4コマ漫画の例を引用しても構いません
- Self-Attentionの全体像を簡単に説明してください
- Query,Key,Valueはどのようにして使われるか説明してください
- 内積について説明してください(教科書にある例を使って構いません)
- 内積と類似度の関係性について説明してください
- 内積の計算と行列の積の関係性について説明してください
- 内積の後にsoftmaxを計算する理由を説明してください(何を計算したいのか,計算後の結果は何に使うのか)
- 以上を踏まえ,QueryとKeyの計算方法の全体像をおさらいしてください
- Self-Attentionの加重和の概要を説明してください
- なぜSelf-Attentionはグローバルな画像の特徴量を学習できると言われているのでしょうか?
- Multi-Head Self-Attentionの概要を説明してください
- Multi-Head Self-Attentionを使う利点はなんですか
- Self-Attentionを数式で表してみましょう
- √Dh で除算する理由を説明してください
- Multi-Head Self-Attentionにおいて, W^O を導入する理由を説明してください
- Multi-Head Self-Attentionを実装しましょう
- 特に,2-4-6(前項)で説明した数式とコードとの対応関係,実装方法を説明してください
- Input Layerからの出力をMulti-Head Self-Attentionに入力し,出力shapeを確認してください
12/20(火)までの課題はここまで
- Encoder Blockの概要と3つの処理について簡単に説明してください
- Batch NormalizationはなぜViTでは有効でないのか簡単に説明してください
- Layer Normalizationについて,数式を含めて説明してください
- Batch NormalizationとLayer Normalizationの違いを説明してください
- MLPの概要について簡単に説明してください
- GERUについて簡単に説明してください
- Encoder Blockを数式で表してみましょう(スキップコネクションがあることに注意)
- Encoder Blockを実装しましょう
- 特に,2-5-4(前項)で説明した数式とコードとの対応関係,実装方法を説明してください
- Input Layerからの出力をEncoder Blockに入力し,出力shapeを確認してください
- MLP Headについて,その構造などを簡単に説明してください
- 教科書のpp.66~67を参考にし,ViTを数式で説明してください
- これまで学んだことをまとめて,ViTを実装を完成させましょう
- 2-6-2(前項)で説明した数式とコードとの対応関係を説明してください
- Input Layer,Encoder Block,MLP Headとコードの対応関係を説明してください
- ViTに任意の画像(バッチ)を入力し,出力shapeを確認しましょう(前にも触れましたが,Pytorchではshapeが(batch_size, ch, h, w)になることに注意!)
- ImageNet・FractalDB-1K・CIFAR10データセットについてそれぞれ簡単に説明してください
- ImageNetで事前学習されたViTをCIFAR10データセットで学習させましょう
- Lossの挙動を確認してください
- CIFAR10のテストデータに対する精度を確認してみましょう
- ハイパーパラメータは自由に決めて構いません(教科書に細かく書いてあるので,必要であれば参考にしてください)
- ImageNet,FractalDB-1K,CIFAR100の学習・テストは不要です
1/10(火)までの課題はここまで
- 特に指定がない限り、教科書で用いているPytorchのサンプルコードを利用してください
- GPUマシンが混雑している場合は、代表者1〜2名のみが学習を行い、その結果をシェアして発表する形式でも構いません(全員がGPUマシンで学習スクリプトを実行&精度を出すことを行わなくても良いです)
- 学習スクリプトを回さない人でも、コーディングとエラーがないかのチェックは行いましょう
- 下準備として,make_folders_and_data_downloads.ipynbの実行が必要です
- 異常画像検出とは何かと,その重要性について説明してください
- AnoGANの処理の流れを説明してください
- AnoGANの特徴をまとめましょう(どのようなGANがAnoGANとして利用できるのか,学習済みの識別器Dだけで異常検出を行うことは可能か,など)
- DCGANを使用して,AnoGANの実装してください
- AnoGAN実装にあたって,DCGANの変更した点があれば,それを説明してください
- テスト画像に最もよく似た生成画像を生み出すノイズzの求め方について説明してください
- 生成乱数zを求めるプログラムを実装しましょう
- AnoGANの損失関数の概要を説明してください
- Residual lossとdiscrimination lossについて,それぞれ説明してください
- AnoGANの損失関数を実装してください
- 今回の実験設定(どのような画像を異常画像とするのか,など)について説明してください
- 実験設定を踏まえて,テスト用のDataLoaderを実装してください(説明は簡単で構いません)
- テストデータを表示するプログラムを実装しましょう
- テスト画像に最もよく似たzを生成しましょう(上の設問で作成したプログラムを使用)
- 生成したノイズzを使って,Generatorから画像を生成し,lossと生成画像を表示させましょう
- AnoGANの問題点を調査しましょう
/(火)までの課題はここまで
- Efficient GANのテクニックの概要について説明してください
- 生成器Gを学習させた後に,その逆変換を学習するモデルEを構築することが難しい理由を説明してください
- 必要であれば,VAEについても調査し,簡単に説明してください
- BiGAN(Bidirectional GAN)について,Efficient GANとの関係性も含めて説明してください
- 識別器Dの損失関数について式を含めて説明してください
- 生成器Gの損失関数について式を含めて説明してください
- エンコーダEの損失関数について式を含めて説明してください
- Efficient GANの生成器Gを実装し,動作を確認しましょう
- Efficient GANの識別器Dを実装し,動作を確認しましょう
- これまでに実装してきたGANと大きく異なる点があれば,それを説明してください
- エンコーダEを実装し,動作を確認しましょう
- DataLoaderを実装しましょう(6.2節とほぼ同じなので説明は不要)
- 生成器G・識別器D・エンコーダEを学習するための関数 train_modelを実装しましょう
- 学習率の設定値とその値を選んだ理由について説明してください
- 生成器Gから画像を生成し,教師データと生成データを表示し,比較しましょう
- Efficient GANによる異常検知を行うために,異常度を計算する関数(Anomaly_score)を改変してください
- テスト画像とEfficient GANで再構成した画像を比較しましょう
- 異常度を計算し,比較しましょう
- AnoGANと比較して,生成ノイズzの計算時間はどのように変わりましたか ※ x.float()でデータの型を修正する必要があるかもしれません
/(火)までの課題はここまで
- Reference 1 - survey paper | Diffusion Models in Vision: A Survey
- Reference 2 - paper | Deep Unsupervised Learning using Nonequilibrium Thermodynamics
- Reference 3 - paper | Denoising Diffusion Probabilistic Models
- Reference 4 - website | What are Diffusion Models?
- Reference 5 - website | Improving Diffusion Models as an Alternative To GANs
- Reference 6 - github | Denoising Diffusion Implicit Models (DDIM)
- Reference 7 -book | 須山敦志 著 ベイズ深層学習(講談社)
- 研究室にあります
- 本設問に関するスライドの作成は強要しません(自習として使ってください)
- いずれも,拡散モデルを学ぶ上で知っていると役立つ知識です
- 決定論(的)モデルと確率(的)モデルについて
- ベイズ推論と深層学習の独立性・共通点
- 条件付き確率・事前確率・事後確率・事前分布・事後分布
- マルコフ過程
- DPMsの特徴,DPMsを使うメリットについて説明してください → Ref.2(1.1)
- Denoising Diffusion Probabilistic Models (DDPMs)とStochastic Differential Equations (SDEs)について簡単に調べましょう → Ref.1(2.1〜2.3)
- Noise Conditioned Score Networks (NCSNs)については,列挙のみで説明は不要です
- 数式不要で,2〜3文程度に要約するだけで構いません
- いずれも,DPMsの表現方法に関係しています
- DPMsの拡散過程(diffusion process)・生成過程(reverse process)の全体像を説明してください → Ref.1(図2),Ref.2(図1),Ref.3(図2)
- ここでは,DDPMsにターゲットを絞ります
- DDPMsの学習について説明してください → Ref.1,Ref.3(Algorithm1)
- DDPMsの目的関数について調べましょう(簡素化された目的関数の説明のみで可)→ Ref.1(式4),Ref.3(式14)
- DDPMsによるサンプルの生成(reverse process)について説明してください → Ref.1,Ref.3(Algorithm2)
- DDPMsのを数式で説明してみましょう → Ref.1(式1と2),Ref.3(式2と1)
※拡散過程=拡散モデルの学習ではないので注意(拡散過程はニューラルネットなどによるパラメータを必要としません)
※ただし,生成過程で必要なモデルの学習は,ある時刻tにおけるモデルの出力がノイズになるように学習しているという点で,拡散過程にやや似ているところがあります
- GANやVAEと比較して,DPMsの違いや良い点,劣っている点をまとめましょう → Ref.1(2.4),Ref.4,Ref.5
- DDIMとDDPMの違い・関係性を簡単に説明してください → Ref.1(3.1の特にp.8)
- 数式不要で,1文程度に要約するだけで構いません
- DDIMのリポジトリをクローンしましょう
- DDIMの学習に該当する実装を見つけ,上での説明(Q.2)との対応関係を解説してください
- DDIMの目的関数(損失の計算)に該当する実装を見つけ,上での説明(Q.2)との対応関係を解説してください
- DDIMによるサンプルの生成(reverse process)に該当する実装を見つけ,上での説明(Q.2)との対応関係を解説してください
- DDIM(DDPMs)のリポジトリを使って,画像を生成してみましょう(データセットは任意)
- 学習済みのパラーメータを利用して構いません(学習は不要です)
- CelebAの学習済みパラメータ
- CIFAR10およびLSUN ←リンク元
- 生成例↓