software_development」カテゴリーアーカイブ

機械学習の勉強を始める前に

機械学習の勉強を始める前に、自分の昔(30年くらい前)の知識の整理をする。

大学の研究室で、同じ研究室の同級生がニューロを卒業研究で研究していた。
それを少し聞いただけなので、知識としては古いし、正確には分かってないと思う。

まず、ニューロ(ニューロコンピュータ、ニューラルネットワーク)は、脳細胞(ニューロン)の働きを模した素子を多数ネットワーク状に結合して演算する演算器である。
人間の脳のように(?)学習させることにより、学習させたとおりの演算結果を出力するようにトレーニングすることができる。

素子のニューロンは、こんな感じに細胞体本体(soma)とシッポ状の部分(axon)からできている。
ニューロン 画像 – Google検索

image1
1つのニューロン素子は、近傍の他の複数のニューロン素子にくっついている。

脳全体で3次元的にニューロン素子が組み合わさってネットワークを形成している。

これを数学的なモデルで表して、コンピュータでシミュレーションする。
続きを読む

LLVM-IR(LLVM中間コード)用コンパイラの改良を考え中

LLVM-IR(LLVM中間コード)用コンパイラの改良を考え中だ。

・C言語で書いているのを、C++で書き直す?
 yaccないしbisonを使って作っていので、そのためC言語で書いている。
 うまくラッパーとか作ってC++で書き直したらどうだろうか?
 既存のそういうラッパーもありそうなので、それを流用すればいいのかもしれない。
 うまくオブジェクト/クラスに切り分けて作るにはどうするのかちょっと悩む。

・yacc(bision)だけではなく、lex(flex)を使ってみる?
 上記のC++化にも絡んでくる話だが、基本的にはC言語でのコンパイラ開発用に作られたツールなので、C++化しようとすると使いにくい。

・LLVM-IR用コンパイラ以外も統合する?
 以前作ったJavaバイトコード出力版のものや、.NET中間言語MSIL(CIL)出力版のものがあり、コードの半分くらいは共通になっている。
 統合して、1つのコンパイラで3種類に対応という形にしてしまったほうがいいのかもしれない。
 少なくとも、共通部分は整理して分離したほうがよさそうだ。

LLVM-IR(LLVM中間コード)用コンパイラの作り方 その11

前回の続き

配列変数の実装について、書くのを忘れていた。

10 DIM A(10)
みたいにTinyBasicで配列宣言をしたときに、LLVM-IRでそれに対応したコードを生成する。
通常の変数の場合は、最初に出現した時に生成するのだが、配列はDIM文で宣言が必要という仕様だ。

  %_A0 = alloca [11 x i32], align 4

というように11個の32bit整数のメモリ空間を割り当てる。
10個で無いのは、A(0)~A(10)まで11個だからだ。
続きを読む

LLVM-IR(LLVM中間コード)用コンパイラの作り方 その10

前回の続き

INPUT文の実装について。

10 INPUT A
みたいなINPUT (変数)という構文を実装する。

入力を促すためのプロンプト表示として”?”を出力する。
これは前回のPRINTと同様にコード出力すればよい。

そのあとは、C言語のgets関数をcall命令で呼び出して、文字列を入力し、atoi関数で整数に変換する。
セキュアなコードではないのだけど、手抜きをして作ったのでこんなもので。
そして、そのatoiの戻り値をstore命令で変数%aのメモリに格納する。

まとめると、このようになる。

  %1 = call i32(i8*,...)* @printf(i8* getelementptr inbounds([3 x i8]* @.2, i32 0, i32 0)) nounwind
  %2 = call i8* @gets(i8* getelementptr inbounds ([1024 x i8]* @buf, i32 0, i32 0)) nounwind
  %3 = call i32 @atoi(i8* getelementptr inbounds ([1024 x i8]* @buf, i32 0, i32 0)) nounwind
  store i32 %3, i32* %a ,align 4

続きを読む

マスク形のウェアラブル機器というのは作れないだろうか?

ウェアラブル機器として、自然に身につけて、他人に警戒されないようなものというのはどういうのがいいのだろうか?

メガネ形というかサングラス形というのは結構いいような気がする。
あと、帽子とかヘッドホン形とか。

花粉症が流行っていてマスクをして外を歩いている人が多いので、マスクの中に機器を埋め込んだマスク形ウェアラブル機器というのは大丈夫そうな気がする。
マスク形ビデオカメラとか。
こういうカメラを使って作れないかと考えてる。

他には、マイクとスピーカーを埋め込んだマスク形翻訳機とかマスク形ボイスチェンジャーとか。
呼気をチェックするヘルスケア系のデバイスとか。

LLVM-IR(LLVM中間コード)用コンパイラの作り方 その9

前回の続き

PRINT文の実装について。

10 PRINT A+1
みたいなPRINT (数式)という構文のみを実装する。

本当は文字列の表示にも対応させたいのだけど、文字変数とか文字定数を実装しないといけないので、結構な手間になる。
手抜きの為に、数式のみ実装することにした。
続きを読む

LLVM-IR(LLVM中間コード)用コンパイラの作り方 その8

前回の続き

前回、IF文の分ができたので、繰り返しのFOR~NEXT文の実装について

IF文では、ざっくり書くと
(1)数式左辺の値を計算するコード
(2)数式右辺の値を計算するコード
(3)2つの値を比較して結果をBool値で得るコード (条件式の示す値)
(4)条件式の示す値(Bool値)が真ならば THENの部分のラベルにジャンプ
(5)偽ならば ELSEの部分にジャンプ
(6)THEN部分のコードとENDIFへのジャンプ
(7)ELSE部分のコードとENDIFへのジャンプ
(8)ENDIFのラベル
というコードが生成される。

FOR~NEXT文についてもほとんど同様だ。
続きを読む

LLVM-IR(LLVM中間コード)用コンパイラの作り方 その7

前回の続き

前回、GOTO文の分ができたので、条件分岐のIF文の実装について

IF B=1 THEN A=2
というTinyBasicのソースをコード生成の仕方を説明する。

まず、
比較演算子(=)について、左辺と右辺のコードを生成する。

	%1 = load i32* %_V1, align 4
	store i32 %11, i32* %acc
	%2 = load i32* %acc, align 4
	store i32 1 , i32* %acc, align 4
	%3 = load i32* %acc, align 4

として、変数Bの中身をレジスタ的な使い捨て変数の%2に取り出し、即値の1を%3に入れる。

そして、icmp命令で比較を行う。

	%4 = icmp eq i32 %2, %3

比較した結果はBool値で%4に入る。
続きを読む

Nagoya ComCamp 2016 powered by MVPsに行ってきた

Nagoya ComCamp 2016 powered by MVPsという勉強会に行ってきた。
去年も行ったのだった。(→ MicrosoftのMVP Community Camp 2015 名古屋に行ってきた)
今年は、会場はNSCではなく、別の場所だ。NSCのランディ-さんの勉強会もずっと開催されていないが、どうしてしまったのだろうか?
20160220_101016
内容は、
・Windows 10の魅力と真価
JavaScript で作る! UWP アプリ
・OSSとオープンイノベーション
・2016年初頭のWebフロントエンド技術おさらい – Edgeもあるよ –
.NET Core5から概観する、.NETのOSSへの取り組み
Azure Machine Learning実践入門
とLTだった。
続きを読む