2018年3月5日月曜日

Intel FPGAのOpenCLのオフラインコンパイル時にrestrictに関するエラーが出る

Intel FPGAでOpenCLを動かすためにゴニョゴニョいじっていたらこんなエラーに遭遇した.
aoc moving_average_many.cl -o bin/moving_average_many.aocx --board a10pl4_dd4gb_gx115 --report
aoc: Selected target board a10pl4_dd4gb_gx115
/home/ubuntu/opencl_program/moving_average2/moving_average_many.cl:1:51: warning: declaring kernel argument with no 'restrict' may lead to low kernel performance
__kernel void moving_average_many(__global int4 *values,
^
/home/ubuntu/opencl_program/moving_average2/moving_average_many.cl:2:52: warning: declaring kernel argument with no 'restrict' may lead to low kernel performance
__global float4 *average,
^
2 warnings generated.
とりあえず下記のように何も考えずにrestricを前につければ出なくなる.

__kernel void moving_average_many(__global int4 * restrict values,
__global float4 * restrict average,
int length,
int name_num,
int width)
(意味的には,引数にとってるポインタちゃんたちが同じ領域を示したりしないよっていう制約だった気がする.)

restrictを付ける付けないで,実行速度は1msecほど変化した.

付けない場合 -> 1.83933 [ms]
付けた場合 -> 0.95214 [ms]

※余談
カーネルの実行時間の計測に,clGetEventProfilingInfo()を使ってstart, endを計測.
しかし,計測してみると18446233763891.16797[ms] とか出てて,
なんじゃこりゃとか思ってendの中身を見ると,endに何も入ってないやないかーい😇
カーネルのキューイングは非同期なので,キューイング直後にevent時間取得したい場合は, clWaitForEvents()`が必要だったよ,という余談でした.

2018年3月2日金曜日

パーセプトロンの実装

パーセプトロンのアルゴリズムを学習するためにpythonでサクッと実装.


import numpy as np
def step(sum):
if sum>=0:
return 1
else:
return -1
def prediction(w, x):
sum = np.dot(w, x)
return step(sum)
def compare(y, l):
if y == l:
return True
else:
return False
def trainWeight(w, x, p, l):
new_weight = list()
for _w, _x in zip(w, x):
new_weight.append(_w + p * _x * l )
return np.array(new_weight)
def train(x, w, p, l):
for _x, label in zip(x, l):
prediction_res = prediction(w, _x)
if compare(prediction_res, label) is False:
w = trainWeight(w, _x, p, label)
return w
# 学習用データ
x = np.array( [[1, 8], [1, 2], [1, 5], [1, 3], [1,6]] )
# 重み
w = np.array( [0, 0] )
# ラベル
l = np.array( [1, -1, 1, -1, 1])
# 学習係数
p = 1
# エポック回数
epoch = 10
for i in range(epoch):
print ("epoc%d start w:%s" % (i+1, w) )
w=train(x, w, p, l)
print ("epoc%d end w:%s" % (i+1, w) )
for i in range(len(x)):
print ( compare(prediction(w, x[i]), l[i]) )
view raw perceptron2.py hosted with ❤ by GitHub

正しいかは未保証.グラフ書いたら分かるかもねー
とりあえず,何かしら学習が進んで分類されてる感じはする.

クラスが3つ以上の奴とか,ロジスティック回帰のアルゴリズムも勉強したい.
(数学的に深く理解したいとは言っていない)

2018年3月1日木曜日

仕事ではじめる機械学習 ─ 2.2 分類 パーセプトロン

仕事ではじめる機械学習を最近買ったので学習のメモ

とりあえず,パーセプトロンのページまで読み進めた.
この図が















下のソースに対応する .
本のソースをいじって,step関数だけ外に出した.

import numpy as np
w = np.array([2, 3])
x = np.array([4, 2])
def step(n):
if n >= 0:
return 1
else:
return -1
def predict(w, x):
sum = np.dot(w, x)
return step(sum)
print ( predict(w, x) )
view raw perceptron1.py hosted with ❤ by GitHub
いちいち図に書かないと理解できないのは自分のあたまがわるいから;;

バイアス項については省略されてしまっているが,詳しいアルゴリズムを追いたい場合は,本書にも書いてあるようにCourseraのMachine Lerningや「ゼロから作るDeep Learning」を読んだほうが良いかもね.(英語苦手なので,ずっと前にCoursera挫折😇)

2018年1月30日火曜日

もふもふの入力インタフェースの作成日記(その5)

前回のつづき
これで最後

Demo動画撮ったのでこれを見てもらえればと思います😊
それぞれ,左上(カメラ動画),左下(プログラム),右(キーボード入力)です



ときどき誤認識してるけど,入力インタフェースとして動作するようになりました〜

コンテンツ周りと繋げてないと,RとTしか入力できないゴミ入力インターフェイスですが💦
ゆくゆくはコンテンツ作成して使いたいなぁ

2018年1月22日月曜日

もふもふの入力インタフェースの作成日記(その4)

機械学習まわりについて書きたいと思う(すぐ忘れるので備忘録的な)

Arduinoがシリアル通信で出力したセンサの値をCSV形式で保存すると,
そのままAzure MLの機械学習のデータとして使かえるので便利.



Azure ML自体は学習コストが低くていい感じだった.
こんな感じにお絵描きすれば機械学習してくれる.



下にあるevaluate modelを右クリックして,evaluation resultsからvisualizeを選択すれば
この学習モデルの評価結果が見られる.



なでたときの誤認識が若干あるが,いい感じに認識してくれたかな?