新着記事
K近傍法をスクラッチ実装してみる
k近傍法とはなにか クラス分類の機械学習の一種のアルゴリズムのこと. k近傍法は学習させるデータ(クラス属性含めて)一つ一つに対して入力データとの類似度(距離)を求め,類似度が高いデータのクラスを入力データのクラスとする. 手順は すべてのデータに対して類似度を求め,高いものから順にk個データを選ぶ. それらのデータのクラスを多数決で決定し,そのクラスとする. なお,距離はユークリッド距離でもよいし,マハラノビス距離でもよい(らしい) kの値は,線形探索や,交差検証などによって,決定する.(ハイパラメータなので) スクラッチ実装 上記手順を見ればまったく難しくなさそうなので,簡単に実装してみる. import numpy as np ## データとクラス(属性)の構造体替わり class Data: def __init__(self,vec:np.array,spector:str) -> None: self.vec=vec self.spec=spector ## 学習データ A=np.random.randint(0,100,(10)) B=np.random.randint(0,100,(10)) C=np.random.randint(0,100,(10)) D=np.random.randint(0,100,(10)) E=np.random.randint(0,100,(10)) VectorsArray=[Data(A,'A'),Data(B,'B'),Data(C,'A'),Data(D,'B'),Data(E,'A')] ## 類似度(ユークリッド距離)を求める関数 def getDistance(vec:np.array,vec2:np.array): r=np.linalg.norm(vec-vec2,ord=2) return r ''' - K近傍法メインルーチン 引数 vec:入力データ(np.array) VectorsArray:Data構造体のリスト k : 整数 返却値 {str(クラス):count(クラスの数)...} 利用時は,max関数でkeyを指定する. 詳細は__main__()で ''' def getNearVecSpec(vec:np.array,VectorsArray=VectorsArray,k=3) : distance=[] for v in VectorsArray: d=getDistance(vec,v.vec) distance.append((v.spec,d)) distance.sort(key=lambda X: X[1]) print(distance) diss={} for i in range(k): v=distance[i] spec=v[0] if spec in diss: diss[spec]+=1 else: diss[spec]=1 return diss if __name__ == "__main__": a=np.
企業賞とオーディエンス賞GETした
ハッカソンで初めて賞を獲得 ハッカソンとはITのモノづくり大会のことであるが、今回、最終選考まで勝ち残り、企業賞とオーディエンス賞を獲得した。
<AI開発 part2>転移学習によるCNNの学習
なぜつくるのか 日本人に最適化された年齢と性別認識モデルはかなり少なく,たいていは有料またはアジア人全般の顔で学習されたモデルといった汎用的なモデルが多くを占めます. そこで,ディープラーニングの練習ということもあり,日本人のデータセットのみで学習させたモデルを公開します. (追記)内容削除 以前の内容は大人の事情により削除されました。 学会発表などの発表後に実験結果、モデル構造を発表します。 (さらに追記) 学会発表について,コロナ禍であることや,私個人の予定や都合,家庭事情等によって現在未定になりました. よってOSSとしてモデルとそのデモプログラムを公開します. リポジトリはこちら 私の検証範囲では,Microsoftの顔認識サービスよりも日本人の判定において,高い精度を叩き出しました. 嘘だと思った方はぜひ,検証し,報告やIssue,プルリクをお願いいたします. OSSとして公開予定しました。 ロボカップ大会が終了後、自作のAIはオープンソースとしてGitHubに公開する予定公開しました。 また、現在は、顕著性マップ[Grad-Cam]、またはAttention構造を取り入れたモデルの開発を行っている。 これにより、AIはどこを注視して年齢を判定したかが人間が直感的にわかるようになる。 リポジトリはこちら