htopコマンドはLinuxのプロセスおよびメモリ使用量のビューアである。macではtopコマンドのオプションがLinuxと異なるため、同様の情報をみたい場合に便利である。
導入も非常に簡単である。
以下が実際に表示した様子である。Linuxのtopコマンドのオプション1よりも視認性が良い。
2015年5月31日日曜日
1 minute intro: Intel TBB parallel_for (C++)
TBB(Threading Building Blocks)は C++で並列化プログラムを簡単に記述するためのライブラリである。Intelが基本的な関数の使い方のビデオを公開している。以下はparallel_forのもの。機械学習のコードで大変よく登場する。
コードは以下である。
Threading Building Blocks
コードは以下である。
Threading Building Blocks
2015年5月30日土曜日
stringstream(C++)
stringstreamは、C++のストリームをstringに結びつける機能をもつクラスである。
stringstreamはstringに対して、<< や >> 演算子を提供する。
ostringstreamは出力のみ提供する。逆にistringstreamは入力のみを提供する。
stringstreamはstringに対して、<< や >> 演算子を提供する。
ostringstreamは出力のみ提供する。逆にistringstreamは入力のみを提供する。
2015年5月29日金曜日
numeric_limits(C++)
numeric_limitsは数値型の取りうる値の範囲についての情報を得るときに利用する。
以下のように使用する。
最小値を得たい場合に注意が必要である。
min()は必ずしも-max()を返すわけではなく、整数型と浮動小数点型とで意味が異なる。
C++11からはlowest()を利用すると良い。
以下のように使用する。
最小値を得たい場合に注意が必要である。
min()は必ずしも-max()を返すわけではなく、整数型と浮動小数点型とで意味が異なる。
C++11からはlowest()を利用すると良い。
minmax_element (C++)
minmax_elementはC++11から追加された機能であり、最小値/最大値を一括して求めるアルゴリズムの実装である。Boostのminmaxとはことなるので注意。
minmax_elementはvectorなどのコンテナを対象として最小値/最大値を求める。
戻り値の型はstd::pair型である。要素はポインタである。
minmaxもstd::pair型であるが、要素はminmaxのテンプレートのclass型である。
minmax_elementはvectorなどのコンテナを対象として最小値/最大値を求める。
戻り値の型はstd::pair型である。要素はポインタである。
minmaxもstd::pair型であるが、要素はminmaxのテンプレートのclass型である。
2015年5月28日木曜日
プリミティブ型の最大値を超えた場合のstatic_castの動作(C++)
プリミティブ型の最大値を超えている場合、static_cast はどのように動作するか。
出力は以下のようになる。
出力は以下のようになる。
65535016553501
2015年5月25日月曜日
emplace_back(C++11)
emplace_backはvectorの要素の追加を効率的に行えるようにC++11から追加された。
暗黙的型変換を利用して emplace_back により値をコンテナに格納するとコピーコンストラクタが呼ばれない。その分効率的に処理することが可能だ。ただし、暗黙的型変換を利用せず、自ら引数のオブジェクトのコンストラクタを呼び出すとコピーコンストラクタが呼ばれるので注意。
set(C++)
C++のsetは要素の数が有限の集合である。また、setの中の要素はソートされて保持されており、順序づけされたオブジェクトの集合とかんがえることができる。つまり、数学の集合とは意味が異なる。
setの良い点は、findによって目的のオブジェクトがsetに含まれているかどうかすぐに判別できる点であり、ソートされて保持された性質を利用して、ソート用途としてsetを使ってはならない。vectorをalgorithm sortでソートするよりもオーバーヘッドが高いからである。オーバーヘッドは、setが指定した要素をfindですぐに見つけられるように要素をinsertする際にインデックスすることからも想像に難くない。
また、ソートされることからわかるように、setの要素となる型にはオペレータ < が定義されている必要がある。これはmapのキーと同じである。
stdexcept(C++)
stdexceptは標準的な例外クラスを提供する。
これらのクラス群に反映されているエラーモデルの種類
これらのクラス群に反映されているエラーモデルの種類
- runtime error 実行時エラー
- logic error 論理エラー
実行時エラーは、プログラムの制御の及ばない事象を起因とする。
論理エラーは、プログラムの内部的論理の誤りに起因する。
以下の様なクラスが定義されている。
- exception
- runtime error
- range_error
- overflow_error
- underflow_error
- logic error
- domain_error
- invalide_argument
- length_error
- out_of_range
explicit T(const string& what_arg){} 指定したメッセージをもつ例外オブジェクトの生成
explicit T(const char* what_arg){} C++11 指定したメッセージをもつ例外オブジェクトの生成
virtual const char* what() const noexcept; メッセージの取得
2015年5月23日土曜日
enum(C++)
C++における列挙型enumは数種類のint型の値しかとることができない型を宣言する。
関数の引数や戻り値の値の意図を記述できる。
関数の引数や戻り値の値の意図を記述できる。
- 値は明示しないと0から順に付けられる
- サイズは環境依存であるため、通信プロトコルでの利用などでは注意すること
explicit(C++)
explicitは引数を1つだけとる変換コンストラクタが暗黙的に呼ばれることを防ぐ。
よくあるケース
- explicitを記述しない変換コンストラクタをもつクラスは、= で初期化(コンストラクタ呼び出し)を記述できる
- クラスの参照を引数に受け取る場合、意図せずして暗黙的に変換コンストラクタが呼び出されることがある
2015年5月22日金曜日
overrideキーワード(C++11)
overrideキーワードは、意図せずして正しいオーバーライドになっていない状態を防ぐものである。
派生クラスの関数が、基底クラスの仮想関数をオーバーライドしていることを示す。
派生クラスの関数が、基底クラスの仮想関数をオーバーライドしていることを示す。
関数オブジェクト(C++)
()は関数呼び出しの演算子である。クラス定義中に、()をoperatorとしてオーバーロードすると、オブジェクトを関数呼び出しの形で呼び出せる。これが、関数オブジェクトである。
コンストラクタ初期化子(C++)
以下のように使用するコンストラクタのコロンは、後ろにメンバ変数や親クラスを初期化する処理を記述することができる。
コンストラクタの中に処理を記述する場合と異なるのは、変数の初期化を省略できることである。
1億回の繰り返し処理で比較した結果、初期化子(コロンを使用した初期化処理)のほうが高速であった(どのくらい高速化は環境によって異なる)。
ただし、プリミティブ型については初期化の必要がないため、初期化子と代入で効率の違いはでないが、記述方法の一貫性やconst対策、コードの可読性のために初期化子を使用するべきである。
親クラスの初期化についても以下のサンプルに記述しておく。
コンストラクタの中に処理を記述する場合と異なるのは、変数の初期化を省略できることである。
1億回の繰り返し処理で比較した結果、初期化子(コロンを使用した初期化処理)のほうが高速であった(どのくらい高速化は環境によって異なる)。
ただし、プリミティブ型については初期化の必要がないため、初期化子と代入で効率の違いはでないが、記述方法の一貫性やconst対策、コードの可読性のために初期化子を使用するべきである。
親クラスの初期化についても以下のサンプルに記述しておく。
2015年5月21日木曜日
alignment(C++11)
アラインメントとは、オブジェクトのための領域をメモリ上に確保する際のアドレスの境界位置のこと。
intのsizeが4バイトの環境では、intのデータを4の倍数のアドレスに配置すると、より高速にアクセスできる場合がある。
alignofの返すアライメント要求は、その型のオブジェクトをアドレス上に配置するためのものである。alignofが4の場合、該当のオブジェクトは4の倍数のアドレスに配置する必要がある。
アラインメントを指定するには、alignasを使う。変数及びメンバ変数のアラインメント属性を指定する。alignas(型名) は alignas(alignof(型名)) と同じである。
複数のアラインメントを指定すると、最も大きなアラインメントが選択される。
intのsizeが4バイトの環境では、intのデータを4の倍数のアドレスに配置すると、より高速にアクセスできる場合がある。
alignofの返すアライメント要求は、その型のオブジェクトをアドレス上に配置するためのものである。alignofが4の場合、該当のオブジェクトは4の倍数のアドレスに配置する必要がある。
アラインメントを指定するには、alignasを使う。変数及びメンバ変数のアラインメント属性を指定する。alignas(型名) は alignas(alignof(型名)) と同じである。
複数のアラインメントを指定すると、最も大きなアラインメントが選択される。
immintrin (C++)
immintrinはSIMD演算用の関数ヘッダーファイルである。
以下のようにすると、すべてのSIMD、AVX演算を利用することが可能である。
#include <immintrin.h>
SIMD -SIMDとは-
コンパイラ最適化入門 -明示的にベクトル化されたコードを記述する-
使いこなすの大変だなこれは。
Levenberg-Marquardt(レーベンバーグ・マーカート)
最適化(非線形最小化)手法の1つ。Deeplearning実装のために準備する。
非線形関数の最小値をみつける最適化を行うことが目的。
最も単純な方法は最急降下法であり、コスト関数を微分して小さくなる方向に進む。
最急降下法が大変遅いことを解決するのに、Gauss-Newton法(または単にニュートン法)を利用する。
Gauss-Newton法は、関数を2階微分して0になる箇所を探す。局所解に陥る危険はあるが高速に学習が進む。また、Gauss-Newton法が対象とする関数は2階微分を元の関数の1階微分の2乗で近似できる関数である。そのため、1階微分の2乗が0になる位置を探す。
上述の、Gauss-Newton法が局所解に陥る危険を減らしたものが、Levenberg-Marquardt法である。
コンピュータビジョン最先端ガイド3の岡谷先生によるバンドルアジャストメントの記述が丁寧である。
その他の最適化手法について、以下のスライドが詳しい。
- SGD、モーメンタム、etc・・・
http://www.slideshare.net/beam2d/deep-learningimplementation
その他の最適化手法について、以下のスライドが詳しい。
- SGD、モーメンタム、etc・・・
http://www.slideshare.net/beam2d/deep-learningimplementation
unordered_map (C++11)
unordered_mapは連想配列(キーと値をセットで保持)を簡単に利用できるライブラリである。JavaではHashMapが使われる。
unordered_mapは名前のとおり、keyの順序に関係なくHashを使って格納する。
keyの順序によってソートしたい場合は、std::map を使えば良い。
mapへの操作は、unordered_map も std::map も基本的に同じである。
以下に他の機能も詳しく記載されている。
http://program.station.ez-net.jp/special/handbook/cpp/stl/map.asp
unordered_mapは名前のとおり、keyの順序に関係なくHashを使って格納する。
keyの順序によってソートしたい場合は、std::map を使えば良い。
mapへの操作は、unordered_map も std::map も基本的に同じである。
以下に他の機能も詳しく記載されている。
http://program.station.ez-net.jp/special/handbook/cpp/stl/map.asp
2015年5月20日水曜日
virtual function(C++)
virtual function(仮想関数)について
継承関係のあるクラスの関数をオーバーライドしたい場合にポリモーフィズム実現のために利用する 仮想関数 だが(実装を持たない場合、純粋仮想関数)、なぜ 仮想関数 を定義したクラスのデストラクタは virtualでなくてはならないのか。
【復習】
仮想関数
仮想関数テーブル
virtual function table, vtable という隠しメンバ変数を使って実現される。
仮想関数を定義したクラスのデストラクタ
仮想関数の利用シーンは、「子クラスのポインタ」を「親クラスのポインタ」にキャストして使って、仮想関数の実装だけ入れ替えるようにして利用(ポリモーフィズム)がほとんどのはずである。
このとき、親クラスのポインタ(実体は子クラス)に対して delete した際、親クラスのデストラクタがvirtualでない場合、子クラスのデストラクタが呼ばれず、メモリリークが発生する。
また、親クラスが暗黙的に作成するデストラクタはvirutalでは無いので、内容がなかったとしても以下のように明示的に宣言すること。
継承関係のあるクラスの関数をオーバーライドしたい場合にポリモーフィズム実現のために利用する 仮想関数 だが(実装を持たない場合、純粋仮想関数)、なぜ 仮想関数 を定義したクラスのデストラクタは virtualでなくてはならないのか。
【復習】
仮想関数
仮想関数テーブル
virtual function table, vtable という隠しメンバ変数を使って実現される。
ある仮想関数を呼び出したとき、実装にはどの関数かを管理するテーブル仮想関数テーブルは実行時、コンストラクタで初期化されてデストラクタで破棄されるので、不要な場合はvirtualにしないほうが仮想関数テーブルの分だけメモリ使用量は節約できるし、効率もあがる。
仮想関数を定義したクラスのデストラクタ
仮想関数の利用シーンは、「子クラスのポインタ」を「親クラスのポインタ」にキャストして使って、仮想関数の実装だけ入れ替えるようにして利用(ポリモーフィズム)がほとんどのはずである。
このとき、親クラスのポインタ(実体は子クラス)に対して delete した際、親クラスのデストラクタがvirtualでない場合、子クラスのデストラクタが呼ばれず、メモリリークが発生する。
また、親クラスが暗黙的に作成するデストラクタはvirutalでは無いので、内容がなかったとしても以下のように明示的に宣言すること。
virtual ~ParentClazz() {}
2015年5月19日火曜日
cstdint(C++11)
cstdintには、bit数を指定できる整数が用意されている。
参考サイト
C++日本語リファレンス
http://cpprefjp.github.io/reference/cstdint.html
参考サイト
C++日本語リファレンス
http://cpprefjp.github.io/reference/cstdint.html
limits (C++)
プリミティブ型の最大値や最小値を取得する際、マクロ変数から取得することも可能だが、型安全な定数やメタ関数を利用して取得する。
メタ関数は、こんな形式の関数
参考サイト
C++のプリミティブ型が取りうる最大値を取得する。
https://www.c3.club.kyutech.ac.jp/archives/1203
メタ関数は、こんな形式の関数
meta-function<type ...>::value()typeに対してプリミティブ型でなく、typedefした型を入力すれば、型の変更に合わせてコードを書き換える必要なく値を取得できる。
参考サイト
C++のプリミティブ型が取りうる最大値を取得する。
https://www.c3.club.kyutech.ac.jp/archives/1203
decltype と type traits (C++11)
decltype
decltype(expression) で式の型を得ることができる。
利用シーン
- プロトタイプ宣言の型指定
- 関数の戻り値の型を得る
typeinfoを併用して使い方を見てみる。typeinfoは実行時型情報(RTTI RunTimeTypeIdentification)を取得する機能である。
また、C++のコンパイラが名前マングルした(シンボルがuniqueな名前となるように)文字列を閲覧するのではなく、デマングルして宣言した型であることを確認する。
libstdc++のcxxapi abi::__cxa_demangle()関数を利用する。
また、C++のコンパイラが名前マングルした(シンボルがuniqueな名前となるように)文字列を閲覧するのではなく、デマングルして宣言した型であることを確認する。
libstdc++のcxxapi abi::__cxa_demangle()関数を利用する。
type traits
型の特徴を調べたり、型の特徴を操作する関数C++11では、type_traitsをインポートして enable_if が使える。
template <bool B, Class T = void>enable_ifは、Bがtrueの時にtypedef T type;をもち、Bがfalseであればtypeをもたない。
struct enable_if;
SFINAE(Substitution Failure Is Not An Error)用途に使われる。
SFINAEは置き換え失敗はエラーにあらず、という意味で関数をオーバーライドする際、型変換がうまくいかなければオーバーライドの候補から自動ではずすことができる記述である。
ていうかいろんな書き方があってC++レベルが足りてない。以下の様な書き方があるってことを認識しておこう。
2015年5月18日月曜日
3年計画の途中経過
以下の目標を実現できそうなところで仕事させてもらえそうなので、とても嬉しい。
- 専門性(データマイニング・コンピュータビジョン)が活かせる、またはキャリア・スキルアップになる仕事をする。
- 世界で仕事が出来る場所にいく
前のプロジェクトが死ぬレベルで忙しすぎてストップしてた英語を再開。
- TOEIC 900点
DeepLearning 実装 準備編
DeepLearningの実装をスクラッチから行う。
まずは準備編として、3層多クラス分類のニューラルネットワークを実装した。
まずは準備編として、3層多クラス分類のニューラルネットワークを実装した。
- Androidアプリにも取り入れやすい
- C++への書き換えも割と容易
ということでJavaで実装した。
動作確認用の可視化用クラスは、以下のものが使いやすかったので、多クラス分類用に修正して利用させていただいた。
NN法っていいよね-きしだのはてな
以下がコード。
ニューラルネットワーク
【課題】
- 学習誤差を出力して、学習の進度を確認できるようにすること
登録:
投稿 (Atom)