2013/03/21
これまでPythonやC/C++でDeep Learningを実装してきましたが、Javaでも同様に実装しましたので、コードを紹介しようと思います。
実装したものは、DBN(Deep Belief Nets)およびSdA(Stacked Denoising Autoencoders)となります。
コードの掲載順序は下記のようになっています。
- DBN.java
- RBM.java(Restricted Boltzmann Machine,制約付きボルツマンマシン)
- SdA.java
- dA.java(Denoising Autoencoders)
- LogisticRegression.java(ロジスティック回帰)
- HiddenLayer.java(ニューラルネットワークの隠れ層を表すクラス)
RBMはDBNの教師なし学習部分、dAはSdAの教師なし学習部分となるクラスであり、LogisticRegressionおよびHiddenLayerは両者に共通のクラスです。
普段はEmacsをエディタに用いていますが、JavaはEclipseを用いて実装しましたので、インデントが深く、コードが見づらいかもしれません。予めご容赦ください。また、これまで同様、今回実装したコードはこちらのgithubリポジトリにまとめてあります。
Read More
2013/03/19
PCでもモバイルでも動作するアニメーションをウェブページに付ける場合、簡単な動きならばCSS3やJavaScriptを用いることで容易に作成することができると思います。
一方で、複雑なアニメーションを実現するのはCSS3やJavaScriptでは難しく、モバイルでもFlashが使えたらなあ…と感じることが多々あるのではないでしょうか。
今回はこうした問題を解決するために、JavaScript+コマ画像を使うことにより、どんなに複雑なアニメーションでもFlashなし(およびムービーファイルなし)で作成する方法を紹介したいと思います。
サンプルはこちらです。「START」ボタンをクリックすると、画面真ん中にある三角形の画像がズームするアニメーションが開始されます。Flashは使っていませんので、モバイルでも動作が確認できるかと思います。
サンプルページにも書いてありますが、今回紹介するアニメーションの作成の実装については「jquery.imotion.js」というjQueryプラグインを作成して公開していますので、そちらもご参考ください。READMEはこちらです。
Read More
2013/02/21
これまで、PythonでDeep Learningを実装したコードを紹介してきましたが、今回はCおよびC++で実装したコードを紹介したいと思います。
実装したものは、Deep Belief Nets(DBN)、Stacked Denoising Autoencoders(SdA)となります。
コード量が多いので分かりにくいかもしれませんが、
- DBN.c
- SdA.c
- DBN.cpp
- SdA.cpp
の順番で掲載しています。
C言語での実装は、こちらの、C言語によるオブジェクト記述法を参考にさせて頂きました。
ヘッダーファイルなどを切り離して可読性を上げたコードは、githubのリポジトリにまとめてありますので、そちらもご参考ください。
制約付きボルツマンマシン(Restricted Boltzmann Machine)、ロジスティック回帰(Logistic Regression)、Denoising Autoencodersそれぞれのコードも掲載されています。
Read More
2013/02/06
Deep Learningの実装に関する記事が連続していますが、今回はStacked Denoising Autoencoders(SdA)について紹介します。
SdAは、前回の記事で実装したDenoising Autoencoders(DA)の層を組み合わせていくことで特徴抽出を行い、
最後の層でロジスティック回帰を用いて教師あり学習を行います。一応、SdAはDeep Belief Netsよりも画像認識では高い精度が得られているみたいです。
ソースは以下。
Read More
2013/02/04
今回は、Deep Learningに用いられているDenoising Autoencoders (DA))のコードを紹介したいと思います。
細かな説明や数式の導出については前回の記事で紹介してありますのでそちらも参考にしてください。
今回も、Pythonで実装しており、numpyのみを使っています。(sysはstderrへの出力に用いているのみなので、なくてもよい)
コードは以下。
Read More
2013/02/03
Extracting and Composing Robust Features with Denoising Autoencoders [Vincent 2008] では、Deep Learning の一手法である、Denoising Autoencoders(DA)による学習手法が提案されています。
DAでは、入力データの一部をあえて損傷させ、損傷したデータを復元するような訓練を行います。その際、[Vincent 2008]には確率的勾配降下法(stochastic gradient descent, SGD)を用いればよい、との旨が書かれていますが、いざ実装しようとした時、数式が少し複雑でしたので、その導出過程についてまとめたいと思います。
記号等はなるべく文献に合わせてあるので、細かな説明は省いてあります。
また、[Vincent 2008]に従って、入力データがとる値は、0 or 1 の2値であることが前提となっています。
Read More
2013/01/11
前回、前々回とそれぞれロジスティック回帰(Logistic Regression)、制約付きボルツマンマシン(Restricted Boltzmann Machine, RBM)を紹介しました。
手法の説明については、各記事を参照してください。
今回は、これら2つを組み合わせて実装されている Deep Belief Nets (DBN) について紹介します。今回のコードは長いので、記事の最後の方に載せています。
DBNは Greedy Layer-Wise Training of Deep Networks [Bengio 2007] で提案されている手法ですが、こちらがDeep Learningのパイオニアと言っても過言ではありません。
DBNは多層ニューラルネットワークの形をしています。従来の研究では、多層にするほど精度が下がるという問題が指摘されていましたが(多層のため誤差の重みが少なくなってしまう)、DBNでは各層でそれぞれ学習を行い、次の層への入力を学習済のデータにすることで多層にするメリットを利用し、これまでの手法に比べ予測精度を高めています。
この、各層の学習にはRBMを用いています。RBMは教師なし学習であり、与えられたデータから特徴を抽出する手法です。なぜDeep Learningでは高い予測精度が得られるのかについては、まだ学術会でも完全に理解はされていませんが、各層でより抽象的な特徴を順番に学習していくからではないか、と考えられています。
RBMは特徴抽出に隠れ層を1つ用いますが、この隠れ層が次の層の入力層になり、次のRBMの学習で用いられます。この、ひとつひとつの層での特徴抽出が、徐々に抽象から具体になっていく感じです。
RBMで特徴抽出を繰り返していきますが、これでは教師あり学習は行えません。そこで、RBMの多層の上にロジスティック回帰の層を出力層としてくっつけたものがDBNとなります。[Bengio 2007]ではロジスティック回帰を使っていますが、ここはSupport Vector Machine(SVM)とかでも代用できるでしょう。コードの方は、[Bengio 2007]に倣ってロジスティック回帰を使っています。(ほぼシグモイド関数だけで全部実装できるので便利かもしれません)
学習が終わると、DBNは重みが調整された、ひとつの多層ニューラルネットワークになります。Deep Boltzmann Machine とは別物なので注意してください。
コードは以下。前回、前々回で実装したclassも合わせて書いています。
Read More
2013/01/05
機械学習の分野で最近話題になってきている Deep Learning。
Deep Learningでは、何層ものニューラルネットワークを用いて訓練・予測を行いますが、各層でそれぞれ学習を行い、段階的に特徴を抽出していくのがこれまでの機械学習手法と異なる点です。
最近の動向については、 Learning Deep Architectures for AI (Bengio 2009) で詳しくまとめられています。
今回は、Deep Learningにおける各層の学習で用いられている Restricted Boltzmann Machine (RBM, 制約付きボルツマンマシン)のコードを紹介します。
ソースは以下。
Read More
2012/10/29
JavaScriptのObjectやStringもprototypeで拡張できるので、
Rubyのcapitalizeに対応するJSコードをメモがてらに書いてみました。
とても簡単です。
Read More
2012/09/17
iPhoneのネイティブアプリでは画面方向を縦あるいは横方向に固定できますが、Safariでは、画面の回転を防ぐ方法がありません(注1)。
そのためかは分かりませんが、PCではよく見かける横スクロールのサイトを、モバイルでは見かけません。
そこで、iPhoneの向きによらず、「絶対に横向きになるウェブページ」を作ってみました。横スクロールができるようになっています。
サンプルはこちらです。iPhoneの向きを変えて試してみてください。
画面の向きによらずスクロールを実現するために、CSS3の -webkit-transform の rotate や translate3d(x, 0, 0) を使っています。
回転によってCSSファイルを分けることによりスクロール以外の動きをCSS3のみで記述することも可能ですが、振り分けが面倒だったので、JavaScriptでCSS部分も制御しています。
参考のために、ソースを下に載せます。CoffeeScript、Slim、Lessの順番で掲載します。
特筆すべきは、
- 画面の向きによってウインドウの幅や高さが変わるため、取得し直す必要がある
- 画面が縦向き(Portrait)のとき、-webkit-transform-origin の値を画面幅の半分にすることで、回転の中心をあわせる
- スクロールは、touchstart, touchmove, touchend でタッチ位置の座標を取得して制御する(注2)
また、サンプルページでは画像をフルサイズで使いたかったため、.full-imageを使ってsetFullImg関数を用いていますが、普通の横スクロールページを作りたい場合、.view を並べていくだけで大丈夫です。 setView の関数で position: absolute; の設置する場所を指定しています。
Read More
2012/09/08
FacebookのiPhoneアプリが先月下旬にアップデートされ、ニュースフィード上の画像の表示方法にも変化が見られました。
「〜さんが新しい写真を追加しました。」という表示がされるタイプのものです。
一方、モバイルサイトでの表示方法は従来のままで表示の仕方に違いがありましたので、iPhoneアプリの表示方法っぽく見せるjQueryプラグインを作ってみました。簡単なhtmlを書くだけで利用できます。使い方やソースコードの簡単な説明は、本記事下記をご参照ください。
サンプルはこちら。モバイルにのみ対応しています。iPhoneのSafariで動作確認済です。
Read More
2012/07/31
これまでは主にコーディングの記事を書いてきましたが、今回は趣向を変えて、Photoshopの簡単なTipsについて紹介したいと思います。
紹介するTipsは、タイトルにもあるように「文字のタトゥーを人の肌の上に描く」です。下に貼ってある画像が完成形となります。作り方は非常に簡単で、手順さえ覚えれば1分もかからず作ることができると思います。
以下に手順について述べていきますが、ページレイアウトの都合上、画像が小さく見づらいかもしれません。予めご了承下さい。
また、作業環境は Mac + Photoshop CS 5.1 となっています。
Read More
2012/07/05
以前に「動きのあるモーダルウインドウの実装」というタイトルの記事を書きましたが、そちらはJSをメインに使った実装方法を紹介しました。今回は、CSS3メインによる実装方法を紹介したいと思います。成果物としてはGoodpatchのお問い合わせフォームになりますが、ほとんどはPinterestのソースを参考にしました。Repinボタンを押したときに出てくるモーダルです。
ソースは以下。html, css, js (coffee)の順に載せています。以前の記事ではモーダルの中身をjsで構築するイメージで書いていましたが、今回は予めhtmlにモーダルを書き出しておいて、cssのdisplay要素で表示・非表示を切り替えます。もちろん、jsで構築することも簡単にできるでしょう。
まずはhtmlから。
Read More