すぐに試せる日本語BERTのDocker Imageを作ってみた
はじめに
学習済みBERTを試しに触ってみたいんだけど、日本語使えるBERTの環境整えるの面倒!っていう人向けに、お試しでBERTを使える Docker Image 作ってみました。
BERT はTransformers(旧pytorch-transformers、旧pytorch-pretrained-bert) を使用。
黒橋・河原研究室のWEBサイトに掲載されている、日本語pretrainedモデルのWhole Word Masking版を使ってます。
Transformers — transformers 2.2.0 documentation
BERT日本語Pretrainedモデル - KUROHASHI-KAWAHARA LAB
Docker Image
ここに置いてあります。
https://hub.docker.com/r/ishizakiyuko/japanese_bert_trial
(多分、重いです...。全然「すぐに試せる」じゃないかも。)
ファイル一式をGitHubにもあげてます。
https://github.com/yuko-i/japanese_bert_trial_dockerfile
----- 追記 -----
Imageがかなり大きいです。
GitHubからDockerfile一式をcloneしてbuildするのをお勧めします!!
言い訳
1. JUMAN++のv2がcmakeでコケるので、v1にしてます_:(´ཀ`」 ∠):_
2. CMDが想定通りに動かないのでdocker runのオプションで対応で _:(´ཀ`」 ∠):_
tag 1.0.1から、CMDを使って動きます。runオプションつけなくても大丈夫です。
3. Docker弱者なので、中身が諸々変かもです _:(´ཀ`」 ∠):_
起動
1. pull する
docker pull ishizakiyuko/japanese_bert_trial:1.0.1
3. run する
docker run -p 8888:8888 -itd
tag 1.0.1 からは sh 指定なしでjupyter動きます
docker run -p 8888:8888 -d ishizakiyuko/japanese_bert_trial:1.0.1
4. log から token 調べる
docker logs <conteiner id>
5. ブラウザからjupyter にアクセスする(http://localhost:8888)
6. 4.で調べた token を入れてログイン
7. コードを書いて BERT を試してみる
コード例
おなじみのMask予測を動かしてみます。
日本語対応はこちらを参考にしました。
pytorch-transformersを触ってみる② - 機械学習・自然言語処理の勉強メモ
import os import torch from transformers import BertForMaskedLM, BertConfig, BertTokenizer from pyknp import Juman BASE_PATH = './Japanese_L-12_H-768_A-12_E-30_BPE_WWM_transformers' BERT_CONFIG = 'config.json' BERT_MODEL = 'pytorch_model.bin' VOCAVULARY_LIST = 'vocab.txt' jumanpp = Juman() # 形態素解析 text = 'どんなに勉強しても全然頭が良くならない' result = jumanpp.analysis(text) tokenized_text =[mrph.midasi for mrph in result.mrph_list()] print(tokenized_text)
>> ['どんなに', '勉強', 'して', 'も', '全然', '頭', 'が', '良く', 'なら', 'ない']
# Mask tokenized_text.insert(0, '[CLS]') tokenized_text.append('[SEP]') masked_index = 6 # Maskしたいtextのindex tokenized_text[masked_index] = '[MASK]' print(tokenized_text)
>> ['[CLS]', 'どんなに', '勉強', 'して', 'も', '全然', '[MASK]', 'が', '良く', 'なら', 'ない', '[SEP]']
# Bert model config = BertConfig.from_json_file(os.path.join(BASE_PATH, BERT_CONFIG)) model = BertForMaskedLM.from_pretrained(os.path.join(BASE_PATH, BERT_MODEL), config=config) tokenizer = BertTokenizer(os.path.join(BASE_PATH, VOCAVULARY_LIST), do_lower_case=False, do_basic_tokenize=False) # token化 indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text) tokens_tensor = torch.tensor([indexed_tokens]) print(tokens_tensor)
>> tensor( [ [ 2, 1, 6547, 19, 23, 1, 4, 11, 4161, 371, 46, 3 ] ] )
# 予測 model.eval() tokens_tensor = tokens_tensor.to('cpu') model.to('cpu') with torch.no_grad(): outputs = model(tokens_tensor) predictions = outputs[0] _, predicted_indexes = torch.topk(predictions[0, masked_index], k=5) predicted_tokens = tokenizer.convert_ids_to_tokens(predicted_indexes.tolist()) print(predicted_tokens)
>> ['成績', '頭', '気持ち', '方', '態度']
それらしいのが、出力されました。
Multi lingualも試してみる
Multi lingual が存在し、日本語も含まれる 104 の言語対応している学習済みモデルが使えます。
Multi-lingual models — transformers 2.2.0 documentation
黒橋・河原研究室版の方が良いはずですが、一応、どんなものか試してみたいと思います。
上記のコードのtokenizerとmodelの部分を変更。
tokenizer = BertTokenizer.from_pretrained("bert-base-multilingual-cased") model = BertForMaskedLM.from_pretrained('bert-base-multilingual-cased')
形態素解析の結果も違っているので、masked_indexを9にしました。
# 形態素解析 tokenized_text = tokenizer.tokenize(text) print(tokenized_text)
>> ['ど', '##んな', '##に', '勉', '強', 'しても', '全', '然', '頭', 'が', '良', 'く', '##な', '##らない']
masked_index = 9 tokenized_text[masked_index] = '[MASK]' print(tokenized_text)
>> ['[CLS]', 'ど', '##んな', '##に', '勉', '強', 'しても', '全', '然', '[MASK]', 'が', '良', 'く', '##な', '##らない', '[SEP]']
あとは同じで、
>> ['愛', '心', '気', '方', '日']
と出てきました。
やっぱり、黒橋・河原研究室版の方が良いですね!
文章埋め込み
BertModelから文章埋め込みベクトルを取得したいと思います。
config, juman++は上と同じ
from transformers import BertModel text = '今日は朝から犬の鳴き声がうるさい' result = jumanpp.analysis(text) tokenized_text =[mrph.midasi for mrph in result.mrph_list()] print(tokenized_text)
>> ['今日', 'は', '朝', 'から', '犬', 'の', '鳴き声', 'が', 'うるさい']
# token化 bert_tokenizer = BertTokenizer(os.path.join(BASE_PATH, VOCAVULARY_LIST), do_lower_case=False, do_basic_tokenize=False) bert_tokens = bert_tokenizer.tokenize(" ".join(tokenized_text)) ids = bert_tokenizer.convert_tokens_to_ids(["[CLS]"] + bert_tokens[:126] + ["[SEP]"]) tokens_tensor = torch.tensor(ids).reshape(1, -1) print(tokens_tensor)
>> tensor( [ [ 2, 2281, 9, 599, 27, 2099, 5, 21245, 11, 4274, 8823, 3 ] ] )
# embedding config = BertConfig.from_json_file(os.path.join(BASE_PATH, BERT_CONFIG)) model = BertModel.from_pretrained(os.path.join(BASE_PATH, BERT_MODEL), config=config) model.eval() with torch.no_grad(): all_encoder_layers, _ = model(tokens_tensor) embedding = all_encoder_layers.numpy()[0][-1] primt(embedding)
>> [ 6.78906918e-01 2.64199853e-01 4.61503953e-01 -3.25612813e-01 ..... -2.42455140e-01 -1.16255842e-02]
最終レイヤーを取る形にしました。
おわり
日本語BERTのImageって既にあるかも?と思いましたが、勉強なので何番煎じでも良いと思い書きました╭( ・ㅂ・)و ̑̑
Dockerfile、ここ直した方がいいよ!みたいなのがあったらコメントいただけたら嬉しいです!
Kaggle Days Tokyo のオフラインコンペがNLP疑惑もあり、Google QUEST Q&A Labeling コンペも面白いという噂ですし、 NLP 機運?
おわり2
こちらのブログ記事、上記の黒橋・河原研究室WEBサイトの「公開モデルを試していただいたサイト」欄に掲載してくださいました!!
ご関係者の方には感謝です!!٩(ˊᗜˋ*)و
Kaggle 雲コンペ 反省録
はじめに
Kaggle で Understanding Clouds from Satellite Images Competition、通称、雲コンペに参加しました。
9月5日の First Sub からコンペ終了11月18日(GMT) までの約3ヶ月、真剣に取り組んだのですが 130位/1553で銅という辛い結果でした。
次に繋げたいと思い、自分に足りなかったことを考えてみました。
この記事では、特に有用なテクニックや解法の記載はありません。ただの反省録です。
コンペ概要
衛星画像から4種類の雲のタイプの領域を予測するコンペです。
雲のタイプは Sugar(砂糖), Flower(花), Fish(魚), Gravel(砂利)の4タイプがあります。
各画像には少なくとも1つのタイプの雲があり、4つとも含まれる場合もあります。
主催者(マックスプランク気象研究所)のモチベーションとしては、「これらの雲の位置を把握する事は、気候変動予測に役立つから」という事だそうです。
雲コンペの特徴
ノイジーなアノテーション
トレーニングデータのアノテーションが、本当に正しいのか疑わしいデータが多かったです。
アノテーターは3人いて、1つの画像に対してそれぞれ違う領域を指定した場合は、それぞれの領域を結合したものを正解データとしたそうです。
つまり、3人いても同じ場所を指定しないこともあり、かなり主観的なアノテーションと言えます。
少ないデータ
画像コンペとしては、データ数が少ないほうのコンペだったのではないでしょうか(多分)。
学習中も Overfit しやすかったです。また、終始 Public LB と local CV に相関を持たせることができませんでした。
一応、外部データは許可されていたので、データを増やすことも可能でした。しかし、有用な外部データは発見されなかった認識です。
また、NASAが出しているWorldViewという衛星写真が取れるものもあるのですが、あまり使われていないように思いました。
https://worldview.earthdata.nasa.gov/
リークなし
全く同じデータがトレーニングデータとテストデータに含まれていることはなかったです。
画像から、地図上のどの場所を写しているかを判別することができるので、その情報を取り入れて精度をあげようとしていた人もいました。しかし、同じ場所でも数時間違うだけで雲のタイプは全く異なり、逆に精度が下がったそうです。
パズル要素もなく、リークなしコンペでした。
最終局面でのハイスコアコードの共有
コンペ終了の10日前ごろに、HengさんによってDiscussion上でハイスコアコードが共有されました。
このコードを使えば、銀メダル圏内(コード公開時のPublic LB)に入れるとのこと。
見かねた Kha さんが「Don't be a hero」という題名の「コードの共有はいいけど、タイミングを間違えないで!」といった内容の Discussion Topic をたててました。
私はなんか後ろめたい気持ちになりそうだな、と思って、そのコードを使うことはしませんでした。(言い訳)
反省点
ここからは個人的な反省文です。
1. 思いつきじゃうまくいかない?
コンペだから人と違うことをしなければ!と思い、オリジナルNNを実装してみたのですが、ことごとく精度は上がりませんでした。
オリジナルNNはほとんど思いつきで実装していて、例えると、レゴブロックを組み立てて自分の好きなようにお城を作っているような感じで、実装中はすごい楽しいです。
しかし、そのように作られたオリジナルNN は Vanilla U-net を超えることすらできなかったです。完全な思いつきのオリジナルNNを作るより、論文で紹介されているネットワーク構造を丁寧に真似した方が良いのかもしれない...と後から気づきました。
2. 試行回数が少ない?
Heng さんが Discussion 内で、「私は 80の実験をした」と言っていました。実験のカウントの仕方も色々ですが、私はオリジナルNN は 4パターンしか作れなかったです(しかも思いつきの変なやつ)。Optimizerは4種類、Lossは2種類です。
過去の塩コンペ優勝者のブログなどを見ても「だいたい 2ヶ月で 100本程度読んで実装してました。」とあり、私は明らかに試行回数が少なすぎました。
単純に試行回数を多くすることで、うまくいくモデル・パイプラインを作り出せる確率も上がるのではないでしょうか。
そして、多くの実験をするにはスピードを伴った実装力が必要ですが、まだ足りない部分だと痛感しました。
3. アイディア不足
Hengさんのハイスコアコードも、現在出ている雲コンペ 3位のソリューションも、私よりずっとアイディアに富んでいます。
こういった有用なアイディアは、知識と経験からくるものでしょうか。
画像認識の基本的な知識と最近の傾向をおさえつつ、いろんな画像コンペに出たり、画像コンペの上位陣の解法から学んで、様々なアイディアが出せるようなベースを作りたいな、と思いました。
まとめ
- 実装力をあげて沢山の実験が出来るようにする
- 画像認識の最新の動向を追う
- 画像コンペに出て経験を積む
こう書くと、恥ずかしくなるぐらい当たり前という...
しかし、多分、これが出来ていても「スタート地点に立てた」ぐらいで、さらに金を取ろうと思ったらもっと飛び抜けた何かが無いとダメな気もします。それが何かは今はわかりませんが、まずはスタート地点に立つことを目標にやっていきたいです。
なぜ疑似ラベルが効果的か調べてみた
はじめに
なぜ疑似ラベル ( Pseudo-Label ) が効果的かを知るために、「Pseudo-Label : The Simple and Efficient Semi-Supervised Learning Method for Deep Neural Networks」を読んだので、内容を記載します。
http://deeplearning.net/wp-content/uploads/2013/03/pseudo_label_final.pdf
疑似ラベル ( Pseudo-Label ) とは
疑似ラベルを使った半教師あり学習の方法
1. ラベルづけされているデータで学習済みモデルを作る
2. 1.で作成したモデルを使って、ラベルづけされていないデータで予測値を出す
3. 2.の予測値を疑似的なラベル、疑似ラベルとし、疑似ラベルづきデータをラベルづきデータに混ぜて学習する
なぜうまくいくのか
Abstractを読むと「エントロピー正則化として作用するから」と書かれてました。
これだけだとよく分からなかったので、順を追って読んでみました。
多クラス分類問題を扱っています。
損失関数
損失関数を、ラベル付きデータと未ラベルデータで分けて表現すると、以下のように記載できます。
がラベル付きデータの個数で、が未ラベルデータの個数で、 がクラス数です。
第 1 項目がラベル付きデータのLoss、第 2 項目が未ラベルデータのLossで、その合計が全体のLossです。
ここで、未ラベルデータの疑似ラベルで、以下のように、ネットワークの出力の最大予測確率を持つクラスを選択します。
この損失関数 の はバランスを取るための係数で、徐々に大きくなるようにスケジューリングする必要があるそうです。あまりにも高いと学習を阻害し、低すぎると疑似ラベルの恩恵を受けられなくなるのだそう。
エントロピー正則化
エントロピー正則化は、エントロピーを最小化することで、クラス間の境界部分を低密度な状態 ( 境界にデータがあまりなくてが分類しやすい状態 ) にしてくれるそうです。
エントロピーは各クラスのデータのオーバーラップに対する評価値となります。
エントロピーは以下のように表されます。
: 未ラベルデータの個数
: クラスの個数
: 未ラベルデータ
: 未ラベルデータの疑似ラベル
先ほどの損失関数 (各: 交差エントロピー誤差) の両辺に負の値をとり、損失関数の最小化問題をMAP推定 ( 事後確率を最大化するようなパラメータを推定する問題 ) に置き換えるため、先ほどのエントロピーの式も合わせて、以下のように書き直して考えます。
これを最大化させるので、未ラベルデータのエントロピー(第2項)を最小化して、ラベル付きデータの対数尤度(第1項)を最大化することになり、ラベル付きデータだけの学習よりもパフォーマンスがよくなるそうです。
結果
MNISTのデータを使い、Pseudo-Labelを使ったものと使わなかったものとで、t-SNEにより比較しています。
確かに、Pseudo-Labelを使ったものの方が、各クラス間の境界部分が低密度な状態になっていると言えそうです。
終わり
完全に腑に落ちるところまで理解することはできなかったです( ˘ω˘ ; )
KaggleでもPseudo-Labelが上手くいく場合と、上手く行かない場合があるように見受けられ、疑似ラベル付きデータをどのくらいの数、どのタイミングで入れるかが難しいのかな、と思いました。
記載に誤りがあれば教えていただけたら嬉しいです。
終わり 2
転職して、まだ入社していないのですが ( 12月から入社です \( •̀ω•́ )/ ) 次の会社の勉強会に参加させてもらってます。めっちゃ面白いです。
今回のブログも、勉強会中で疑問になったことをきっかけに調べてみようと思って書きました。
ちなみに、勉強会の内容ですが、先輩がGitHubで公開してくれています!!良きです!
github.com
参考
https://papers.nips.cc/paper/2740-semi-supervised-learning-by-entropy-minimization.pdf
https://pdfs.semanticscholar.org/1ee2/7c66fabde8ffe90bd2f4ccee5835f8dedbb9.pdf
arxiv.org
推薦のアルゴリズムを調べた
はじめに
基本的な推薦のアルゴリズムについて勉強しました。
「推薦システム: 統計的機械学習の理論と実践」を参考に、一部ピックアップして、要点を記載しました。
Pythonで実装する場合、使えそうなライブラリも一緒に記載しています。
推薦のタスク
- コンテンツのフィルタリング
- ユーザ特性モデル
- スコアリング
- ランキング
古典的手法
bag-of-words
アイテム素性ベクトルを構成するためにbag-of-wordsベクトル空間モデルを使用。各単語を次元として扱う。
このベクトル空間に写像する方法。
バイナリ表現
単語の有無を0,1で表現
TF
単語の出現率
: 単語 t の文書 d 内での出現回数
TF - IDF
文書中に含まれる単語の重要度を表す。
まず IDF 逆文書頻度を以下とする。
: 全文書数
: ある単語 t が出現する文書の数
TF-IDF は以下であわらされる。
sklearn.feature_extraction.text.TfidfVectorizer — scikit-learn 0.21.3 documentation
次元削減
bag-of-wordsの表現は、次元が大きくなってスパースネスになってしまう。
それを抑える代表的な方法。
類義語拡張
類義語を加えてスパース性に対応
日本語 Wordnet
SudachiDict/synonyms.md at develop · WorksApplications/SudachiDict · GitHub
素性選択
過剰に出現率が高い/低い単語は無視する
ランダム射影
距離関係を保ったまま次元削減する。
sklearn.random_projection.SparseRandomProjection — scikit-learn 0.21.3 documentation
トピックモデル
文章からトピックを推定する。
LDAモデルが単語を生成する仕組みを学習するもの。
トピック分布
文章が各トピックに属する確率
トピック分布を以下のようにあわらす
ベクトルの和が 1 であるシンプレックス。
例 )
トピック0 が ゲーム なら、ゲーム に属する確率は0.3
トピック1 が 教育 なら、教育 に属する確率は0.2
トピックk が IT なら、IT に属する確率は0.1
潜在トピック
文章 d の各単語 0~n に対して、それぞれ潜在トピックが存在しており、それはトピック分布から生成される。
単語の生起確率
トピックk における、各単語 0~n の生起確率が存在し、各単語の潜在トピックとそのトピックの単語出現率から実際の単語が生成される。
トピック分布は、全トピック数の次元のベクトルをパラメータにもつ、ディリクレ分布から生成される。
単語の生起確率も、全単語数の次元のベクトルをパラメータにもつ、ディリクレ分布から生成される。
そのパラメータを変分近似またはギブスサンプリングで推定するらしいが....パラメータ推定の部分の理解は省略。
協調フィルタリング
アイテムの評価行動が似ている2人のユーザは嗜好が似ていると言える。ユーザ i に類似する他のユーザの集合を得て、アイテムを好む程度を予測する。
ユーザ間の類似度に基づいた手法
ユーザ i と似ているユーザがアイテム j に与えた評価を元に、ユーザ i がまだ評価していないアイテム j のレイティング(スコア)を以下のように表す。
: ユーザ i の平均レイティング
: ユーザ l の アイテム j に対すレイティング
: ユーザ i に似ていて、アイテム j を評価したユーザの集合
: ユーザ i がアイテム j を評価する時のユーザ j に対する重み
重み を一般的には以下のユーザ間の類似度で表す。
ユーザ間の類似度
ユーザ i とユーザ l の類似度。
: ユーザ i とユーザ l の両方に評価されたアイテムの集合
アイテム間の類似度に基づいた手法
アイテム j と似ているアイテムに与えられた評価を元に、ユーザ i がまだ評価していないアイテム j のレイティング(スコア)を以下のように表す。
: ユーザ i によって評価されたアイテム j と似ているアイテムの集合
探索と活用
多腕バンディット
複数のスロットマシーンで各マシーンの当たりが出る確率がわからない状況で、腕を選択する試行を繰り返し報酬を最大にする課題。
探索と活用のトレードオフ問題に対する、いくつかのアプローチがある。
ベイジアンアプローチやミニマックスアプローチがあるが、実践でよく使われる、ヒューリスティックなバンディット戦略を記載。
- グリーディ
の確率で探索をし、 で活用(報酬確率の推定値が最大となる選択)をする。
過度の探索をさせないために時間の経過と共に、 を減少させる。
例えば、今の時点で腕を引いた総数 に対して、とする。
SoftMax
腕を探索する確率を以下のようにする方法。 はハイパーパラメータ。良さそうな腕を多く探索できるが、分散を考慮できていない。
: 腕 i から得られた報酬の標本平均
Thompson Sampling
スロットマシーンごとにベータ分布を以下のように定めて乱数を発生させて、その値が大きかったマシーンを引く。
: そのマシーンで当たりがでた回数
: そのマシーンでハズレがでた回数
推薦システムの評価
オフライン評価
過去に観測されたアイテムへのレイティングにもとづいて行う。
データを様々な方法で分割する。無作為分割、時間ベース分割、ユーザベース分割、アイテムベース分割。
数値予測の指標
数値レイティングが推定対象の場合は、指標としてはRMSE、MAEが広く使われている。ユーザがアイテムにポジティブなレスポンスをする確率を予測するモデルでは、対数尤度がよく使われる。
: テストデータセット内の対のデータ (ユーザ i , アイム j ) の集合
: ユーザ i がアイテム j にポジティブなレスポンスをする予測確率
: ユーザ i がアイテム j にポジティブなレスポンスをしたかどうかの0,1
局所的ランキングの指標
AP(Average Precision)
その順位までの適合率を、適合したデータに限定して平均したもの。
: 適合データの数
: その位置 r での適合率
: 適合していれば 1 を返して、適合していなければ 0 を返す
sklearn.metrics.label_ranking_average_precision_score — scikit-learn 0.21.3 documentation
MAP(Mean Average Precision)
APの平均。ユーザに対する推薦であればユーザ数で平均をとる。
AP@nやMAP@nなど、@nがつく場合は、nまでの順位のみに限定する。
nDCG
正規化割引累積利得(nDCG)について記載する。
まず、割引累積利得(DCG)を以下のようにする
: 順位 k のアイテムにユーザ i が評価したレイティング。正なら1, 負なら0。
: ユーザ i が評価したアイテムの数。
: ユーザ i が正のレイティングとして評価したアイテムの数。
nDCGはユーザ i における最大DCG値によって正規化されたDCG。
オンラインバケットテスト
オンラインバケットテストとは、無作為に選択した一部のユーザに新しいモデルでサービスを提供し、ユーザがどのようなレスポンスをするかを観測すること。
ユーザベースでバケットを分けるパターンや、リクエストベースでバケットを分けるパターンがある。
一般的に使用されるオンラインパフォーマンのエンゲージメント指標には、CTR(クリック率)やユーザあたりの平均クリック数、クリックするユーザの割合、クリック以外のアクション(コメントを書き込むなど)、消費時間などがある。
オフラインシミュレーション
オフラインシミュレーションでは、オフライン環境でアイテムに対するユーザの応答をシミュレートできるグランドトゥルースモデル(GT)を構築することが基本的なアイディアであるが、かなり難しい。
省略。
ランク学習
ランク学習は素性ベクトルからアイテムのスコアリストへの写像を学習。
その写像を
とし、教師データは以下のように表す
Pointwise approach
1つのアイテムに対して、ランキングのどの位置かを予測するアプローチ。
損失関数の例
Pairwise approach
2つのアイテムに対して、どっちの方がランキングが上かを予測するアプローチ。
損失関数の例
はヒンジ関数や指数関数など。
Listwise approach
複数のアイテムに対して、それぞれのアイテムがランキングではどの位置かを予測するアプローチ。ランキング全体としての良さを求めている。
損失関数の例
は i 番目にランクづけされたオブジェクトをさす
RankNet
NNを利用したPairwise approach。
をモデルとし、2つのアイテム、 のスコアを 、 とする。
アイテム の方が よりランクが高いことを、 と書く。
となる確率を以下のように定める。
損失関数はクロスエントロピーとし、勾配降下法で最適化する。
は真の確率で、以下のように定める。
ListNet
NNを利用したListwise approach。
データの並び順の起こりやすさを確率分布 にして考える。
: クエリーあたりのデータ数
: 並び順
損失関数はRankNetと同じくクロスエントロピーとし、勾配降下法で最適化する。
Dataset
推薦のアルゴリズムで使えそうなデータセット
cseweb.ucsd.edu
おわり
まだ理解が粗く、範囲も不十分なところがあるので、落ち着いたら(雲コンペ終ったら) もう少し掘り下げたいです。
間違ってるところがあればご指摘いただけたら嬉しいです。
推薦って面白いなと思いました⸜( ‘ ᵕ ‘ )⸝⸜
参考
https://papers.nips.cc/paper/3708-ranking-measures-and-loss-functions-in-learning-to-rank.pdf
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr-2007-40.pdf
http://www.nactem.ac.uk/tsujii/T-FaNT2/T-FaNT.files/Slides/liu.pdf
ランク学習 Advent Calendar 2018 まとめ - 人間だったら考えて
画像認識でよく使われるライブラリ一覧
概要
画像コンペ初参加につき、画像認識でよく使われているライブラリを調べました。
言語はPython、ディープラーニング関連はPyTorchに限って記載してます。
今後も便利なライブラリを見つけ次第、追記していきますφ(・ω・ )
画像処理全般
速度比較
- 画像の読み込み速度はscikit-imageが一番速い
- リサイズや色彩変換の画像変換処理の速度はOpenCVが一番速い
PIL vs Opencv | Kaggle
【Python】画像処理の速度比較(scikit-image vs. OpenCV) | 加賀百万石ですが何か?
Pythonの画像読み込み: PIL, OpenCV, scikit-image - Qiita
データ拡張
Albumentation
- データ拡張用ライブラリ
- データ拡張バリエーションが多い
- 処理速度も他のデータ拡張系ライブラリに比べて早い
- torchvisionからの移行が容易
速度比較
CPU 1コアで 1秒間に処理できる枚数なので、多い方が高速
https://github.com/albu/albumentations#benchmarking-results
モデル
速度向上
こちらも画像専用ではないですが、便利なライブラリなのでメモ。