作成者別アーカイブ: hiroshi12

hiroshi12 について

小さな会社で確率や統計を扱う技術系の仕事をしております。

エッグタルト

[カスタードクリーム]
卵黄 2個
牛乳 100ml
生クリーム 100ml
グラニュー糖 100g
薄力粉 大さじ2

[生地]
薄力粉 140g
バター 85g
冷水 大さじ2
酢 小さじ1

[手順]
1. カスタードクリームを作る
2. 薄力粉とバターを混ぜる(スコーンの要領)
3. 冷水と酢を加えて生地を整える
4. 生地を型に敷き、底にフォークで穴を空ける
5. カスタードクリームを入れて、形を整える
6. 210度で20分焼く

[raspberry pi]djangoをwsgiでapache2によりdeployまで

raspberry pi
raspbian liteにsshで接続までできているものとする

1. 必要なモジュールをインストール
$sudo apt install apache2
$sudo apt install libapache2-mod-wsgi-py3
$sudo apt install django

2. djangoのプロジェクト作成
$sudo django-admin startproject mysite

3. mysite/mysite/wsgi.pyにパスを追加
import sys
sys.append.path(“/home/pi/mysite”)

4. apache2の設定
cp /etc/apache2/sites-avalable/000-default.conf /etc/apache2/sites-avalable/django.conf


LoadModule wigs_module “modules/mod_wsgi.so”
WSGiScriptAlias / /home/pi/mysite/mysite/wsgi.py



Require all granted

##注意##パスの”pi”が”py”になっていてうまくいかない経験あり!!

5. 設定の有効化
$sudo a2dissite 000-default
$sudo a2ensite django
$sudo service apache2 restart

ほろほろホワイトクッキー

栗原はるみさんのレシピをそのまま作ってみました。

バター 80g
粉砂糖 30g
コーンスターチ 50g
薄力粉 50g
アーモンドパウダー 50g

1. 溶かしたバターに粉砂糖を入れて混ぜる
2. コーンスターチ、薄力粉、アーモンドパウダーをふるって入れる
3. ある程度混ぜてから、手でまとめる
4. 10等分くらいで丸めて、クッキングシートに並べる
5. 160℃15分〜20分で焼く。焼き色をあまりつけないこと。
6. 熱いうちに粉砂糖をたっぷりとつける

tensorflow カテゴリデータのfeature column

画像や音声の話題が多いtensorflowですが、数値やカテゴリーデータの記事が少ないかもしれません。
以下はCSVファイルを読み込み、
COL1~COL4までは数値なのですが、カテゴリデータ、COL5を数値として扱います。
これらCOL1~COL5までの説明変数で、目的変数Yを推定させるというコード。

かなりぐちゃぐちゃなデータでも、割と簡単に推定してくれました。

import numpy as np
import pandas as pd
import tensorflow as tf
import scipy.stats as sp

steps=1
n_epochs=1

hidden_u=[500]

#モデルの保存フォルダを指定。estimatorのパラメータとなる。
md='/home/hiroshi/TEMP_TENSORFLOW'

dat=pd.read_csv('test.csv').dropna()
Y_COL='Y'
Y=dat[Y_COL]

#################################################################################
#カテゴリーデータを扱う場合。(入力が数値で、扱いがカテゴリーの場合)
COL1=tf.feature_column.embedding_column(tf.feature_column.categorical_column_with_hash_bucket("COL1",hash_bucket_size=999999,dtype=tf.int64),1)
COL2=tf.feature_column.embedding_column(tf.feature_column.categorical_column_with_hash_bucket("COL2",hash_bucket_size=999999,dtype=tf.int64),1)
COL3=tf.feature_column.embedding_column(tf.feature_column.categorical_column_with_hash_bucket("COL3",hash_bucket_size=999999,dtype=tf.int64),1)
COL4=tf.feature_column.embedding_column(tf.feature_column.categorical_column_with_hash_bucket("COL4",hash_bucket_size=9,dtype=tf.int64),1)

#数値データを扱う場合
COL5=tf.feature_column.numeric_column("COL5")

#feature columnを定義する
fc=[COL1,COL2,COL3,COL4,COL5]
#################################################################################

FEATURES=["COL1","COL2","COL3","COL4","COL5"]
X=dat.loc[:,FEATURES]


my_input_fn = tf.estimator.inputs.pandas_input_fn(
        x=X,
        y=Y,
        num_epochs=n_epochs,
        shuffle=False
        )

estimator = tf.estimator.DNNRegressor(
        feature_columns=fc,
        hidden_units=hidden_u,
        model_dir=md
        )

estimator.train(input_fn=my_input_fn,steps=steps)


#成績の表示
train_metrics=estimator.evaluate(input_fn=my_input_fn)
print(train_metrics["global_step"],"回目の学習  ave_loss:",train_metrics["average_loss"])

#テストデータの作成
temp_test_input_fn = tf.estimator.inputs.pandas_input_fn(
        x=pd.DataFrame({"COL1":[123],"COL2":[456],"COL3":[789],"COL4":[10],"COL5":[500]}),
        y=None,
        num_epochs=1,
        shuffle=False
        )

temp_ar=[]
temp_test_metrics=estimator.predict(input_fn=temp_test_input_fn)
for p,q in enumerate(temp_test_metrics):
    temp_ar.append(q['predictions'].item(0))
print('推定結果:',temp_ar)

tensorflow モデルの保存

estimatorのmodel_dirにフォルダのパスを指定するだけ。
学習を中断、再開した記録が残っていきます。
フォルダを消すと学習結果も全て消えます。

md=’/home/hiroshi/TEMP_MODEL’

estimator = tf.estimator.DNNRegressor(
feature_columns=fc,
hidden_units=hidden_u,
model_dir=md
)

tensorflow フィボナッチ数

tennsorflowのDNNRegressorを使って、一つ前の数字から次の数字を推定させてみました。
XとYの数列を変更すれば、結構色々な数列を推定します。

結果を10回目と10000回目の学習で出力すると、精度の違いがよく分かります。

import numpy as np
import pandas as pd
import tensor flow as tf

#フィボナッチ数列を12番目まで与えてみる
X=pd.DataFrame({'x1':[1,2,3,4,5,6,7,8,9,10,11,12]})
Y=pd.DataFrame({'y':[1,1,2,3,5,8,13,21,34,55,89,144]})
test_ar=[17,18,19]
ans_ar=[987,1597,2584]

#パラメータはこれだけ
steps=1000
n_epochs=10000
h_n=[100,100]

c=tf.feature_column.numeric_column('x1',shape=(1))

my_input_fn = tf.estimator.inputs.pandas_input_fn(
        x=X,
        y=Y,
        num_epochs=n_epochs,
        shuffle=False
        )

test_input_fn = tf.estimator.inputs.pandas_input_fn(
        x=pd.DataFrame({'x1':test_ar}),
        y=None,
        num_epochs=1,
        shuffle=False
        )

estimator = tf.estimator.DNNRegressor(
        feature_columns=[c],
        hidden_units=h_n
        )

for i in range(9):
    estimator.train(input_fn=my_input_fn,steps=i+1)
    train_metrics=estimator.evaluate(input_fn=my_input_fn,steps=i+1)
    print(i+1,'回学習しました。 平均誤差は',train_metrics['average_loss'],'です。')

estimator.train(input_fn=my_input_fn,steps=10)
train_metrics=estimator.evaluate(input_fn=my_input_fn,steps=10)
test_metrics=estimator.predict(input_fn=test_input_fn)
ar=[]
for p,q in enumerate(test_metrics):
    ar.append(q['predictions'].round(decimals=1).item(0))
result=pd.DataFrame({'正解':ans_ar,'推定':ar})
print('--------------------------------------------------')
print('10回学習しました。平均誤差は',train_metrics['average_loss'],'です。')
print('【推定結果】')
print(result)
print('--------------------------------------------------')
print('--------------------------------------------------')

estimator.train(input_fn=my_input_fn,steps=steps)
train_metrics=estimator.evaluate(input_fn=my_input_fn,steps=steps)
test_metrics=estimator.predict(input_fn=test_input_fn)
ar=[]
for p,q in enumerate(test_metrics):
    ar.append(q['predictions'].round(decimals=1).item(0))

result=pd.DataFrame({'正解':ans_ar,'推定':ar})
print(steps,'回学習しました。平均誤差は',train_metrics['average_loss'],'です。')
print('【推定結果】')
print(result)
print('--------------------------------------------------')

tensorflowのインストール(python)

インストール手順は以下のページを参考
https://www.tensorflow.org/install/install_mac#common_installation_problems

1. virtualenvによる環境構築
google公式ページによるとvirtualenvでの構築が進められている
$mkdir ~/tensorflow
$virtualenv –system-site-packages ~/tensorflow
$source ~/tensorflow/bin/activate
(tensorflow)$
(tensorflow)$deactivate

アンインストールは
$rm -rf ~/tensorflow

バイナリのurlを指定してもできる
(tensorflow)$pip install –upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-1.3.0-py2-none-any.whl
インストールまでできたが、実行するとエラーとなった。
何となくprotobufというのが影響しているらしいが、詳しく分からない

2. bash for windows
スタートの右クリック->設定->アプリと機能->機能の有効化で、それっぽいのを有効にして再起動
sudo pip –proxy=http://xxx.xxx.xxx.xxx:xxxx install –upgrade pip
・bash_profileで設定していても、ここでプロキシ設定をする必要がある
・sudoを忘れないこと!!
sudo pip –proxy=http://xxx.xxx.xxx.xxx:xxxx install tesorflow

[結論]

どんな環境であれ、virtualboxとかでUbuntuを入れてインストールするのが確実

チュートリアル

import tensorflow as tf
node1=tf.constant(3.0,dtype=tf.float32)
node2=tf.constant(4.0)

print(node1,node2)

sess=tf.Session() #ここでsessionを作る。

print(sess.run([node1,node2])) #これで[3.0,4.0]と表示される


node3=tf.add(node1,node2)
print(node3) #まだメタ情報が表示されるだけ
print(sess.run(node3)) #これで7.0が表示される

a=tf.placeholder(tf.float32) #aという変数ができるみたいな感じ
b=tf.placeholder(tf.float32)
adder_node=a+b #a+bを行う関数ができた感じ
print(sess.run(adder_node,{a:3,b:4.5})) #足し算がなされて7.5が表示される
print(sess.run(adder_node,{a:[1,3],b:[2,4]})) #ベクトルでも計算可能

add_and_triple=adder_node*3 #関数を用いた関数みたいな感じ
print(sess.run(add_and_triple,{a:3,b:4.5})) #22.5

W=tf.Variable([.3],dtype=tf.float32) #Variableは初期値を設定できる
b=tf.Variable([-.3],dtype=tf.float32)
x=tf.placeholder(tf.float32)
linear_model=W*x+b
print(sess.run(linear_model,{x:[1,2,3,4,]})) #そのまま実行するとエラーになる

#global variableの初期化
init=tf.global_variables_initializer() 
sess.run(init)

print(sess.run(linear_model,{x:[1,2,3,4,]})) #[0,0.3,0,6,0,9]のように計算される

[nasm]四則演算

add,sub,mul,divを用いて演算を行う。
もちろん出力はASCIIコードで31hが1となるように計算。

結果は
5
1
6
3
と表示される

bits 64
section .text

global _main
_main:

	;足し算 5を出力
	mov rbx, 33h
	mov rcx, 02h
	add rbx, rcx
	push rbx
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall

	xor rbx,rbx
	mov rbx, 10d
	push rbx
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall

	;引き算 1を出力
	mov rbx, 33h
	mov rcx, 02h
	sub rbx, rcx
	push rbx
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall

	xor rbx,rbx
	mov rbx, 10d
	push rbx
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall

	;掛け算mulは引数をraxと掛けてraxに格納
	mov rax, 3
	mov rbx, 2
	mul rbx  
	add rax,30h
	push rax
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall

	xor rbx,rbx
	mov rbx, 10d
	push rbx
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall

	;割り算 divは引数でraxを割ってraxに格納
	mov rax, 6
	mov rbx, 2
	div rbx  
	add rax,30h
	push rax
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall

	xor rbx,rbx
	mov rbx, 10d
	push rbx
	mov rdx, 02h
	lea rsi, [rsp] ;link stack point adress to rsi
	mov rax, 0x2000004
	mov rdi, 1
	syscall


	mov rax, 0x2000001
	mov rdi, 0
	sys call

コマンドによる簡易タイマー

applescriptを用いたシェルスクリプト

timer.sh

#!/bin/sh                                                                                        
osascript << EOF
tell application "Finder" 
activate
display alarm ("test")
end tell
EOF

$sleep 600;./timer.sh
で10分後にメッセージが表示される。

デスクワークで10分置きに想起して記憶術に用いたり、
断続的に目の休憩を取るのを忘れないなど、
使い勝手は非常に良い。

[nasm]文字を一文字ずつ出力

文字を一文字ずつ表示することで、レジスタやスタックの扱いに慣れる。

<解説>
基本はraxにシステムコール、それ以外で引数を入力。
rax0x2000004は標準出力で、
rbxに文字を一文字ASCIIの16進数で格納。
rsiは直接代入できないらしく、rbxをpushでスタックに格納して、leaで参照させている。
引数が全て揃ったらsyscallで実行。

bits 64
section .text

global _main
_main:
	mov rax, 0x2000004
	mov rbx, 32h
	mov rdx, 01h
	mov rdi, 1
	push rbx
	lea rsi, [rsp]
	syscall

	mov rax, 0x2000004
	mov rbx, 0ah
	mov rdx, 01h
	mov rdi, 1
	push rbx
	lea rsi, [rsp]
	syscall

	mov rax, 0x2000001
	mov rdi, 0
	syscall