<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>きのこる庭 &#187; ツール系</title>
	<atom:link href="http://kinokoru.jp/archives/category/%e3%83%84%e3%83%bc%e3%83%ab%e7%b3%bb/feed" rel="self" type="application/rss+xml" />
	<link>http://kinokoru.jp</link>
	<description></description>
	<lastBuildDate>Wed, 09 Jan 2019 03:18:33 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.2</generator>
		<item>
		<title>DockerでAngular+Nodeのサーバを立てた話</title>
		<link>http://kinokoru.jp/archives/1557</link>
		<comments>http://kinokoru.jp/archives/1557#comments</comments>
		<pubDate>Thu, 01 Mar 2018 12:54:02 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[サーバ・インフラ系]]></category>
		<category><![CDATA[ツール系]]></category>
		<category><![CDATA[Angular]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Node]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1557</guid>
		<description><![CDATA[<p>最近Win機を購入して 仮想環境どうしようかなーと思っていたのだが、「せっかくだし使い慣れたVagrantではなく思い切ってDockerでつくってみるか」と思い立ったので 勉強がてらDockerでサーバを立ててみた。 前 [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1557">DockerでAngular+Nodeのサーバを立てた話</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>最近Win機を購入して 仮想環境どうしようかなーと思っていたのだが、「せっかくだし使い慣れたVagrantではなく思い切ってDockerでつくってみるか」と思い立ったので 勉強がてらDockerでサーバを立ててみた。</p>
<h2>前提となる環境</h2>
<p>* Windows 10 Home Edition<br />
* Docker Toolbox</p>
<h2>やったこと</h2>
<p>1. Angular+Node用のDockerfile及びimageの作成<br />
2. 1で作成したimageをもとにコンテナを作成しつつ、ホストマシン上でコードをいじれるようマウント<br />
3. 実際にサーバを立ち上げてみる<br />
4. ホスト上からコードに修正を加えてみる<br />
<span id="more-1557"></span></p>
<h2>1. Angular+Node用のDockerfile及びimageの作成</h2>
<p>とりあえずNodeでサーバを立てて Angular動かしてみるかということになった。</p>
<p><a href="https://hub.docker.com/r/monostream/nodejs-angular-cli/" target="_blank">https://hub.docker.com/r/monostream/nodejs-angular-cli/</a></p>
<p>ひとまず ↑を参考にして以下のような感じでDockerfileを作成。</p>
<pre class="brush: plain; title: ; notranslate">
FROM node:alpine

RUN apk add --quiet --no-cache bash &amp;&amp; \
    yarn global add @angular/cli &amp;&amp; \
    yarn cache clean &amp;&amp; \
    rm -rf /var/cache/* /tmp/*

EXPOSE 4200

WORKDIR /home/node

COPY ng_apps ng_apps

CMD [&quot;/bin/sh&quot;]
</pre>
<p>Angularでserveした際のデフォルトのポートが4200なので、4200番を開放している。<br />
また、ng_apps という空ディレクトリをコピーしているが、これはホストマシンとの共有を想定したディレクトリ。Angularアプリケーションを配下に置いておくことでホストマシンから直接コードをいじれるようにしたかった。Dockerfileを作成したら、同ディレクトリにて以下コマンドを実行。</p>
<pre class="brush: plain; title: ; notranslate">
docker build -t angular-test .
</pre>
<p><b>Successfully tagged angular-test:latest</b>という文言とともにイメージが作成される。</p>
<h2>2. 1で作成したimageをもとにコンテナを作成しつつ、ホストマシン上でコードをいじれるようマウント</h2>
<p>以下のようにdocker run でコンテナを作成する。</p>
<pre class="brush: plain; title: ; notranslate">
docker run --name angular_test_server -d -it -p 80:4200 -v $(pwd)/ng_apps:/home/node/ng_apps angular-test
</pre>
<p>-v オプションにて ng_appsディレクトリをマウントしつつ、ポートは80番で叩けるようにした。<br />
引き続き以下のコマンドを実行し、作成したコンテナに入り、Angularが適切にインストールされているかどうかを確認する。</p>
<pre class="brush: plain; title: ; notranslate">
docker exec -it angular_test_server /bin/sh
ng --version
</pre>
<p><a href="http://kinokoru.jp/wp-content/uploads/2018/03/angular_cli_1.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2018/03/angular_cli_1.jpg" alt="angular_cli_1" width="781" height="377" class="aligncenter size-full wp-image-1560" /></a></p>
<h2>3. 実際にサーバを立ち上げてみる</h2>
<p>コンテナに入ったままng_appsディレクトリに移動し、ng new コマンドによって myappというアプリケーションを立ち上げる。<br />
ここで一つ問題が発生する。Windowsの場合、Virtualbox経由で共有ディレクトリをつくった場合ゲストマシン側でそのディレクトリにシンボリックリンクを貼ることができない。これにより<b>共有ディレクトリ上で npm install が通らず、結果的に ng new myapp がコケる</b>という事態に陥る。そこで npm install の際に <b>&#8211;no-bin-links</b> オプションをつける必要があるのだが、Angularでこれをやりたい場合は以下のようにする模様。</p>
<pre class="brush: plain; title: ; notranslate">
ng new myapp --skip-install
cd myapp
npm install --no-bin-links
</pre>
<p>これによって共有ディレクトリ上でも無事Angularアプリケーションを置くことができた。あとはnpm installが完了したら以下のコマンドでサーバの立ち上げを行う。</p>
<pre class="brush: plain; title: ; notranslate">
ng serve --host 0.0.0.0
</pre>
<p>今回はDockerのデフォルトネットワーク経由のため、ホストマシンのブラウザから 192.168.99.100 にアクセス。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2018/03/voila.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2018/03/voila-1024x627.jpg" alt="voila" width="1024" height="627" class="aligncenter size-large wp-image-1561" /></a></p>
<p>表示された。</p>
<h2>4. ホスト上からコードに修正を加えてみる</h2>
<p>せっかくマウントしたわけだし、ホスト上からコードをいじってみる。とりあえず簡単な例として初期に表示されるページのタイトルを変えてみることにする( パスはmyapp/src/index.html )。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2018/03/koushin.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2018/03/koushin.jpg" alt="koushin" width="856" height="345" class="aligncenter size-full wp-image-1562" /></a></p>
<p>こんな感じでいじって再度ゲストマシン側にて<b>ng serve &#8211;host 0.0.0.0</b>を実行すると…</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2018/03/voila2.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2018/03/voila2-1024x725.jpg" alt="voila2" width="1024" height="725" class="aligncenter size-large wp-image-1563" /></a></p>
<p>無事更新が反映された模様。</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1557">DockerでAngular+Nodeのサーバを立てた話</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1557/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TensorFlowでモデル構築して学習させる際のイメージ</title>
		<link>http://kinokoru.jp/archives/1507</link>
		<comments>http://kinokoru.jp/archives/1507#comments</comments>
		<pubDate>Tue, 26 Sep 2017 22:16:04 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[ツール系]]></category>
		<category><![CDATA[雑記]]></category>
		<category><![CDATA[DeepLearning]]></category>
		<category><![CDATA[TensorFlow]]></category>
		<category><![CDATA[ニューラルネットワーク]]></category>
		<category><![CDATA[機械学習]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1507</guid>
		<description><![CDATA[<p>　なんとなく機械学習周りのツールをいじってみて、いざ学習モデルを組んでみようとTensorFlowのコードを見てみた所、なにやら奇妙で膨大な処理がつらつらと書き連ねられていて圧倒された…なんて経験をされた方も少なくないと [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1507">TensorFlowでモデル構築して学習させる際のイメージ</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>　なんとなく機械学習周りのツールをいじってみて、いざ学習モデルを組んでみようとTensorFlowのコードを見てみた所、なにやら奇妙で膨大な処理がつらつらと書き連ねられていて圧倒された…なんて経験をされた方も少なくないと思われます。確かにTensorFlowのコードは一見すると複雑怪奇ですが、プログラムの背景に存在している以下の4つの概念を抑えてしまえば 膨大なコードもうまく紐解いてゆくことが可能です。</p>
<div style="backgdound: #EEE; padding: 10px; border: 1px solid #CCC; font-size: 12px;">
・モデル<br />
・モデルを用いた計算<br />
・学習<br />
・データセット
</div>
<p>　この記事ではTensorFlowによる学習のコードを見て どこでどういう処理が行われているのかなんとなくイメージできる事を目標として、簡単なモデルの例からTensorFlowにおける学習の導入まで段階的に議論を進めていきます。<br />
<span id="more-1507"></span></p>
<h2>モデル</h2>
<p>　TensorFlowでモデル構築…といえばよくある多層パーセプトロンがパッと頭に思い浮かびそうですが、TensorFlowで構築できるモデルは何もニューラルネットに限ったものではありません。例えば以下のコードを見てみましょう。</p>
<pre class="brush: python; title: ; notranslate">
# -*- coding: utf-8 -*-
import tensorflow as tf

x = tf.placeholder(dtype=tf.float32)
y = tf.placeholder(dtype=tf.float32)
addition = tf.add(x, y)
</pre>
<p>　このコードを図で表すと以下のようなグラフ構造になります。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/09/neural_network_3.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/09/neural_network_3.jpg" alt="neural_network_3" width="553" height="320" class="aligncenter size-large wp-image-1510" /></a></p>
<p>　この addition は「二つの数を足し算する」という単純なものですが、これも立派なモデルと言えます。ここで重要な事として、<strong>このモデル自体は「学習」や「実行」の意味合いを持ちません</strong>。実際の所、具体的にどのような2つの数を足し算するかも定められていませんし、ただ「二つの数を足し算する」という事を表しているだけです。このことに注目すると、TensorFlow関連の書籍でモデル構築をする際によく出てくる以下のようなコード(以下は単純な多層パーセプトロンの例)がどういうものか、何となく分かってきますね。</p>
<pre class="brush: python; title: ; notranslate">
x1 = tf.placeholder(dtype=tf.float32) # 入力層
w1 = tf.Variable(dtype=tf.float32)
b1 = tf.Variable(dtype=tf.float32)
h = tf.nn.relu(tf.add(tf.matmul(x1, w1), b1)) # 隠れ層

w2 = tf.Variable(dtype=tf.float32)
b2 = tf.Variable(dtype=tf.float32)
y = tf.nn.softmax(tf.add(tf.matmul(h, w2), b2)) # 出力層
</pre>
<p>　隠れ層の部分を見てみましょう。これを言葉にすると「x1とw1を掛け合わせたものにb1を足し算したものを ReLUという関数で変換する」というグラフ構造です。これをhとして、今度は出力層を見てみましょう。出力層では、「hとw2を掛け合わせたものにb2を足し算したものを softmaxという関数で変換する」というグラフ構造になります。この y をモデルとして採用したものがいわゆる多層パーセプトロンです。</p>
<p>　このように、様々な計算を処理するための雛形となるものがモデルです。以下は様々なモデルのイメージです。このようにTensorFlowではグラフ構造に基づく柔軟なモデル構築が可能です。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/09/neural_network_11.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/09/neural_network_11.jpg" alt="neural_network_1" width="599" height="425" class="aligncenter size-full wp-image-1517" /></a></p>
<h2>モデルを用いた計算</h2>
<p>　一旦先ほど定義した単純なモデルである addition の例に戻りましょう。モデルを構築した所で、今度は実際に何かしらの入力を加えて実際にモデルを使ってみます。以下の例では additionモデルを使って5+3の結果を出力しています。</p>
<pre class="brush: python; title: ; notranslate">
sess = tf.Session()
output = sess.run(addition, feed_dict = {
  x: 5.,
  y: 3.
})
print(output) # 結果は8.0
</pre>
<p>　sess.run() にて 実際に計算に使用するモデルを定義し、その際に入力値を与えています。この時点でも、上記計算に「学習」という意味合いは存在しておらず、ただ単純にモデルとデータを元に計算を実行しただけであることに注意してください。</p>
<h2>学習</h2>
<p>　ただ計算を実行するだけだと味気ないので、今度は学習を行ってみましょう。先ほどadditionモデルを「二つの数の和を計算するモデル」として定義しましたが、今回はこのモデルにちょっと変更を加えて「入力xと変数yを足し算する」というようにしてみましょう。</p>
<pre class="brush: python; title: ; notranslate">
# -*- coding: utf-8 -*-
import tensorflow as tf

x = tf.placeholder(dtype=tf.float32)
y = tf.Variable(tf.constant(1.))
addition = tf.add(x, y)
</pre>
<p>　最初のadditionモデルと異なる点として、最初のadditionモデルでは モデルを用いて計算する際にxとyの両方を入力していましたが、新しいadditionモデルで入力するのは xだけである点です。yには初期値として1が代入されているので、このadditionモデルは最初の段階で「x + 1.0」を計算するものとなります。x = 5.0 なら additionの出力は6.0、という具合です。</p>
<p>　さて、ここで この新しいadditionモデルを用いて、どんな実数値xを入れても「x + y = 8.0」となるようなモデルを得たいとしましょう。しかし、このモデルにおけるyはそのままだと初期値 1.0 のままなので、x = 7.0の時以外では理想の結果が得られません。理想の結果を得るためには yの値がうまいこと増減しないといけません(例えばx=12なら、12.0 + y = 8.0 を得るために yの値は初期値である1.0よりも小さい方向にずらす必要がある…等といった具合です)。</p>
<p>　この時点で初めて「<strong>学習</strong>」という概念を導入します。…とすると、additionはここで初めて「学習前のモデル」という形で認識できます。では y の学習はどのようにして行われるのでしょうか？</p>
<p>　ここで「<strong>損失</strong>」という概念を導入してみましょう。学習中のモデルによって予測値を計算した際、当然本当の値との誤差があります。この誤差が大きければ大きいほど損失も大きく、小さければ小さいほど損失も小さいと考えます。値が正解から離れれば離れる程損失が大きくなっていく…という仕組みを定量化するために機械学習ではよく二乗誤差を用います。というわけで慣例に従って以下のように損失関数を定義します。</p>
<pre class="brush: python; title: ; notranslate">
loss = tf.square(tf.subtract(addition, 8))
</pre>
<p>　学習の目的はこの損失を限りなく少なくしていくことです。ここで損失が限りなく少なくなるということは、予測値が実際の値に限りなく近づいていくことと考えて下さい( ただし、適切でない損失関数の設定が行われた場合等はこの限りではありません )。</p>
<p>　損失を算出する方法はlossによってうまく定義できたものの、「lossによって算出された損失をもとに yの値を修正する」という仕組みが無ければ学習が行えません。幸い、TensorFlowでは予めデフォルトでこの機能を提供してくれます。それが以下のコードにて示す <strong>GradientDescentOptimizer</strong> という機構です。</p>
<pre class="brush: python; title: ; notranslate">
optimizer = tf.train.GradientDescentOptimizer(0.2)
train_step = optimizer.minimize( loss )
</pre>
<p>　GradientDescentOptimizerの引数にある 0.2 というのは<strong>学習率</strong>のことで、イメージとしては損失関数からの情報を一回の学習でどれだけ参考にして取り入れるかを示すものです( 学習率が高すぎると予測値が振動・発散してしまうリスクが高くなるし、低すぎるといつまでも予測値が正解に近づかないため、状況に応じて適切な学習率の設定が必要です。ただこの辺りの議論に関しては本題の範疇を超えてしまうためここまでにしておきます )。</p>
<p>　ここで、前述の「モデル」の項にて説明した通り、この時点でのtrain_stepはグラフ構造として定義されているだけで、まだ実際の入力値を与えられてもいないし、学習自体も行われていないことを思い出して下さい。実際に計算をする場合は以下のようにします。</p>
<pre class="brush: python; title: ; notranslate">
sess = tf.Session()
sess.run( tf.global_variables_initializer() ) # 変数の初期化

output = sess.run(train_step, feed_dict = { x: 5.  }) # モデルの学習を行う
y_val = sess.run(y, feed_dict = {x: 5. }) # 学習済のモデルを使って y の値を計算
print(&quot;y = %f&quot; % ( y_val )) # y = 1.800000
</pre>
<p>　x = 5.0 の場合、 y = 3.0 が正解となりますが、train_stepにより一回学習を回してみた所、yは初期値の 1.0 から 1.8 となり、確かに正解に近づいていることが分かります。<br />
　ところで、基本的に学習は複数回数行うものなので、前の例では単純化のためtrain_stepを一回だけ実行するような形にしていましたが、以下のコードのような形に修正して 30回程train_stepによるイテレーションを回してみることにします。この時、yの値はどのように遷移するか見てみましょう。</p>
<pre class="brush: python; title: ; notranslate">
sess = tf.Session()
sess.run( tf.global_variables_initializer() ) # 変数の初期化

for i in range(30):
  output = sess.run(train_step, feed_dict = { x: 5.  })
  y_val = sess.run(y, feed_dict = {x: 5. })
  addition_val = sess.run(addition, feed_dict = {x: 5. })
  print(&quot;5.0 + %f = %f&quot; % ( y_val, addition_val ))
</pre>
<p>　このコードを実行した結果は以下のようになります。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/09/Screen-Shot-2017-09-27-at-01.45.59.png"><img src="http://kinokoru.jp/wp-content/uploads/2017/09/Screen-Shot-2017-09-27-at-01.45.59.png" alt="Screen Shot 2017-09-27 at 01.45.59" width="189" height="424" class="aligncenter size-full wp-image-1522" /></a></p>
<p>　学習を重ねるにつれて確かにyの値が 3.0 に近づいていることが確認できます。では今度は入力値を変えてみて、 x=11 とした場合どうなるでしょう。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/09/Screen-Shot-2017-09-27-at-01.52.37.png"><img src="http://kinokoru.jp/wp-content/uploads/2017/09/Screen-Shot-2017-09-27-at-01.52.37.png" alt="Screen Shot 2017-09-27 at 01.52.37" width="200" height="423" class="aligncenter size-full wp-image-1527" /></a></p>
<p>　x=11にしても、ごく僅かな誤差はあるもののほぼ正解に近い値になっています。これがTensorFlowによる学習です。</p>
<h2>データセット</h2>
<p>　今回の学習モデルでは簡単のため 入力値・正解をただ一つだけ設けましたが、実際にTensorFlowで学習を行う際には 一般的にまとまった複数の入力値・正解のセットをモデルに与えて学習させていきます。<br />
　実際のデータセットを扱う上で重要な観点の一つが、一つのデータセットを「<strong>学習用データ</strong>」「<strong>テスト用データ</strong>」の二つのデータ群に分離することです。これは、学習させたモデルで実際でどれくらいの精度が出るのかを確かめるためのデータが必要となるからです。<br />
　一つのデータセットを学習用データ群・テスト用データ群に分ける上で手動でプログラムを構築する必要はなく、scikit-learnがこれに相当する機能を提供してくれているので、こうしたものを使用するのが懸命です。</p>
<pre class="brush: python; title: ; notranslate">
from sklearn.cross_validation import train_test_split

:
x_train, x_test, y_train, y_test = train_test_split(dataset_x, dataset_y, test_size=0.2, random_state=42)
:
</pre>
<p>ここで、dataset_x, dataset_y はそれぞれ 入力データ群、入力データに対する正解の群を表しています。</p>
<h2>まとめ</h2>
<p>　というわけで、一つの塊として見ると膨大で複雑なTensorFlowのコードですが、一つ一つ丁寧に要素を分解して見ていくと意外とそこまで複雑ではありません。ここで説明した概念は単純な多層パーセプトロンに止まらず再帰ニューラルネット等様々なモデルにも適用可能な基礎となるものなので、ぜひ抑えておきたい所です。</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1507">TensorFlowでモデル構築して学習させる際のイメージ</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1507/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kerasで多層パーセプトロンのモデル構築する際のイメージ(数式無し)</title>
		<link>http://kinokoru.jp/archives/1470</link>
		<comments>http://kinokoru.jp/archives/1470#comments</comments>
		<pubDate>Thu, 27 Jul 2017 11:10:53 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[ツール系]]></category>
		<category><![CDATA[雑記]]></category>
		<category><![CDATA[Keras]]></category>
		<category><![CDATA[ニューラルネットワーク]]></category>
		<category><![CDATA[機械学習]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1470</guid>
		<description><![CDATA[<p>最近Kerasに関して勉強をする機会があったためまとめました。 Kerasで多層パーセプトロンを構築されている方は 幾何的な理解の助けにご利用下さい。 ( どちらかというと学習メモ用に走り書きしただけなので 難解な部分, [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1470">Kerasで多層パーセプトロンのモデル構築する際のイメージ(数式無し)</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>最近Kerasに関して勉強をする機会があったためまとめました。<br />
Kerasで多層パーセプトロンを構築されている方は 幾何的な理解の助けにご利用下さい。<br />
( どちらかというと学習メモ用に走り書きしただけなので 難解な部分, 認識の誤り等残っている可能性があります。<br />
その際にはお手数ですがTwitter(<a href="https://twitter.com/irration" target="_blank">@irration</a>)までご連絡いただけましたら幸いです )</p>
<p>また、今回はモデル構築部の幾何的な理解を目標としているため、実際のKeras部分を用いた学習に関しては省略しております。ご了承下さい。</p>
<p><span id="more-1470"></span></p>
<h2>通常の多層パーセプトロンの場合</h2>
<pre class="brush: python; title: ; notranslate">
# -*- coding: utf-8 -*-
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD
</pre>
<p>何はともあれインポート。これらのインポートしたものがそれぞれどういう意味を持つのかは後述します。</p>
<pre class="brush: python; title: ; notranslate">
num_input_layer  = 3 # 入力層のニューロンの数
num_hidden_layer = 4 # 隠れ層のニューロンの数
num_output_layer = 3 # 出力層のニューロンの数
</pre>
<p>入力層、隠れ層、出力層のニューロンの数を変数として持たせておきます。</p>
<pre class="brush: python; title: ; notranslate">
model = Sequential()
</pre>
<p>Sequentialインスタンスを作成しました。<br />
このSequentialというやつは、以下の画像のような複数の層を持つデータをモデル化するためのインスタンスです。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/07/neural5.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/07/neural5.jpg" alt="neural5" width="600" height="400" class="aligncenter size-full wp-image-1480" /></a></p>
<p>ネットワークの左側の緑色は「入力層」、右側の緑色が「出力層」、(存在する場合)入力層と出力層の間に挟まれているのが「隠れ層」です。<br />
普通のKerasの用途としては隠れ層を複数導入してディープニューラルネットワークのように使うのが通常かと思われますが、一応モデルとして隠れ層を持たない入力層・出力層だけのネットワークのモデル(図の左側に浮いているやつ)も定義できるっぽいです。</p>
<p>というわけで、インスタンスを定義したので早速ですが多層パーセプトロンをつくってみます。</p>
<pre class="brush: python; title: ; notranslate">
model.add(Dense(num_hidden_layer, input_dim=num_input_layer))
</pre>
<p>DenseというのはDensely-Connected なニューラルネットの層を指す。<br />
Densely-Connected の イメージとしては上図のようにそれぞれの層の入力と出力同士が全て互いにくっついている感じ。認識が間違っていなければ Fully-Connectedと同義のはず。<br />
( 一応確かめました: <a href="http://forums.fast.ai/t/dense-vs-convolutional-vs-fully-connected-layers/191/2" target="_blank">dense-vs-convolutional-vs-fully-connected-layers</a> )</p>
<p>今回は入力層が3つ、隠れ層が4つのニューロンからなるため上記のコードにより以下のような図のネットワークができたことになります。<br />
( 因みに この時点で定義されているネットワークにおいて、下記にて隠れ層として描かれているものは モデル上では隠れ層でなく出力層となっています )</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/07/neural6.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/07/neural6.jpg" alt="neural6" width="600" height="400" class="aligncenter size-full wp-image-1483" /></a></p>
<p>次は活性化関数を追加します。活性化関数というのは、あるニューロンが複数の(各ニューロンごとに重みがついた)ニューロンからの入力を受け取り、受け取った値を合計した後 そのニューロン自身を0～1の間の値に落とし込むための関数です。これは連続値の場合もありますし、離散値(0,1)の場合もあります。離散値の場合は「ステップ関数」と言われており、ニューロンが「発火」= 他のニューロンからの入力の合計が閾値を上回りステップ関数が1になる というイメージのものです。活性化関数に関する具体的な議論に関しては他の方の記事に譲ります。</p>
<pre class="brush: python; title: ; notranslate">
model.add(Activation('sigmoid'))
</pre>
<p>今回は活性化関数によく使われるシグモイド関数という関数を使用しました。<br />
( なお、最近だとReLU関数というのが使われるのが割とメジャーな方法になってきているっぽいですね )</p>
<p>これにより、ネットワークは以下のような状態になりました。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/07/neural7.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/07/neural7.jpg" alt="neural7" width="600" height="400" class="aligncenter size-full wp-image-1484" /></a></p>
<p>今回は多層パーセプトロンを組みたいので、隠れ層の次に出力層を追加します。</p>
<pre class="brush: python; title: ; notranslate">
model.add(Dense(num_output_layer))
model.add(Activation('softmax'))
</pre>
<p>出力層の活性化関数には「ソフトマックス関数」を使用します。ソフトマックス関数は多クラス分類問題においてよく使われる関数で、「これが一番大きい！」と最大の1つを決定する挙動をより緩やかにして、「これが全体の中で結構大きいよね。5つのアウトプットを相対的に表現すると ( 0, 0, 0.03, 0.94, 0.03 ) くらいかな。といった形で「マックス」を「ソフト」にする効用があるため「ソフトマックス」と呼ばれています。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/07/neural4.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/07/neural4.jpg" alt="neural4" width="600" height="400" class="aligncenter size-full wp-image-1486" /></a></p>
<p>上記コードの追加により、最終的にこんな感じのネットワーク構造ができました。<br />
最後にこのネットワーク構造をコンパイルします。</p>
<pre class="brush: python; title: ; notranslate">
model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01),metrics=['accuracy'])
</pre>
<p>( このあたりのコードは後述の書籍(『詳解ディープラーニング』)を参考にさせていただいております。 )<br />
コンパイル時に、どのようにネットワークの学習に際して必要となる情報を併せて引数として渡します。</p>
<p><strong>loss</strong> は誤差関数です。テスト時に予測が実際の結果とどれくらいずれていたかをはかる指標です。</p>
<p style="color:#999;">【発展的な議論】<br />
因みに誤差関数は何でも良いというわけではなく、活性化関数と対応させる必要があります。<br />
例えば多クラス分類問題を解く際にはソフトマックス関数を活性化関数として選びますが、この場合多クラス用のクロスエントロピー誤差関数を選ぶのが一般的です。<br />
( その他 最小二乗法を用いた回帰問題であれば二乗誤差関数、2クラス分類ならクロスエントロピー誤差関数等 )</p>
<p><strong>optimizer</strong>というのは学習の際どのように精度を高めていくかを表す関数です。今回は<strong>SGD(Stochastic Gradient Descent; 確率的勾配降下法)</strong>という最適化問題における有名な手法を使用します。またこの際<strong>lr</strong>という引数をSGDに渡していますが、これはlearning rate、すなわち学習率を表し、学習率が大きいほど 誤差をより大きく修正しようという方向で動きます。</p>
<p><strong>metrics</strong>はモデルの評価指標です。Kerasではmetrics=['accuracy']という形で設定して、訓練時・テスト時にモデル精度の高さを測る方法がよく使われるようです。</p>
<p>まとめると、以下のようになります。</p>
<pre class="brush: python; title: ; notranslate">
# -*- coding: utf-8 -*-

from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD

num_input_layer  = 3 # 入力層のニューロンの数
num_hidden_layer = 4 # 隠れ層のニューロンの数
num_output_layer = 3 # 出力層のニューロンの数

model = Sequential()

model.add(Dense(num_hidden_layer, input_dim=num_input_layer))
model.add(Activation('sigmoid'))

model.add(Dense(num_output_layer))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01),metrics=['accuracy'])
</pre>
<h2>隠れ層を増やしてみる</h2>
<p>上記コードの入力層と出力層との間に同じ手順でもう一つ追加するだけです。</p>
<pre class="brush: python; title: ; notranslate">
model.add(Dense(num_hidden_layer))
model.add(Activation('sigmoid'))
</pre>
<p>なお、今回は 隠れ層に含まれるニューロンの数をいずれも num_hidden_layer で固定していますが、隠れ層の各層によってニューロンの数を変化させても問題ありません。</p>
<p>結果的にどういうネットワーク構造になるかというと…</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2017/07/neural2.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2017/07/neural2.jpg" alt="neural2" width="600" height="400" class="aligncenter size-full wp-image-1490" /></a></p>
<p>こんな感じです。<br />
コードをまとめると、</p>
<pre class="brush: python; title: ; notranslate">
# -*- coding: utf-8 -*-

from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD

num_input_layer  = 3 # 入力層のニューロンの数
num_hidden_layer = 4 # 隠れ層のニューロンの数
num_output_layer = 3 # 出力層のニューロンの数

model = Sequential()

model.add(Dense(num_hidden_layer, input_dim=num_input_layer))
model.add(Activation('sigmoid'))

model.add(Dense(num_hidden_layer))
model.add(Activation('sigmoid'))

model.add(Dense(num_output_layer))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.01),metrics=['accuracy'])
</pre>
<p>となります。Keras、ちょっと触っただけだけど、割と直感的に書けていいな～と思いました。</p>
<p>※ 一部コードは以下の書籍を参考にさせていただいております。RNN, LSTM, BRNN, seq2seq 等の話題も豊富で、且つコードの例も豊富に載っているためオススメです。</p>
<p><a href="https://www.amazon.co.jp/詳解-ディープラーニング-TensorFlow-Kerasによる時系列データ処理-巣籠-悠輔/dp/4839962510/" target="_blank">詳解-ディープラーニング-TensorFlow-Kerasによる時系列データ処理 &#8211; 巣籠 悠輔(著)</a></p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1470">Kerasで多層パーセプトロンのモデル構築する際のイメージ(数式無し)</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1470/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>家庭内のタスクをRedmineとSlackを連携させて管理するようにしたらうまくいった話</title>
		<link>http://kinokoru.jp/archives/1198</link>
		<comments>http://kinokoru.jp/archives/1198#comments</comments>
		<pubDate>Fri, 11 Mar 2016 09:52:26 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[ツール系]]></category>
		<category><![CDATA[検証・考察]]></category>
		<category><![CDATA[Redmine]]></category>
		<category><![CDATA[Slack]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1198</guid>
		<description><![CDATA[<p>先日無事入籍を終え、結婚式に向けてあれこれ準備が必要になるということで、友人の何人かがやっていたように家庭内でRedmineを導入した。「結婚式準備」プロジェクトを立ち上げて暫く運用していて 最近ようやく運用が落ち着いて [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1198">家庭内のタスクをRedmineとSlackを連携させて管理するようにしたらうまくいった話</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p><a href="http://kinokoru.jp/wp-content/uploads/2016/03/shared-img-thumb-YUUKI150321200I9A4368_TP_V.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2016/03/shared-img-thumb-YUUKI150321200I9A4368_TP_V-1024x703.jpg" alt="-shared-img-thumb-YUUKI150321200I9A4368_TP_V" width="1024" height="703" class="aligncenter size-large wp-image-1209" /></a></p>
<p>先日無事入籍を終え、結婚式に向けてあれこれ準備が必要になるということで、友人の何人かがやっていたように家庭内でRedmineを導入した。<strong>「結婚式準備」プロジェクト</strong>を立ち上げて暫く運用していて 最近ようやく運用が落ち着いてきたため、今度は少し欲が出てきた。<br />
現状、チケットが更新されるタイミング・何のチケットが更新されたか等タイムラインでしか把握できない状態になっているので、<strong>Slackを使って チケットが更新されたらリアルタイムに通知が飛ぶようにした</strong>。最近一部の界隈では家庭内でこういうツールを導入するのもよくある流れになってきたのかなあとは思う(ねーよ)ので、流行に便乗してみようといった所だ。導入・設定に苦戦するかなあと思ったら、<strong>元々Redmineが入っている状態から15分くらいで意外とサクッと導入できた</strong>。</p>
<p><span id="more-1198"></span></p>
<h2>これまで</h2>
<p>家庭内でRedmineを導入したのはおよそ一ヶ月前のことだ。使い方としては、以下のような感じでチケット毎にタスクの進捗状況などを書き込んだりして使用していた。<br />
暫く回してみた感じ、中々良い感じに管理できているなという手ごたえがあった。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2016/03/redmine_3.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2016/03/redmine_3.jpg" alt="redmine_3" width="538" height="281" class="aligncenter size-full wp-image-1201" /></a></p>
<p>そこに今回、より利便性を高めるためSlackを導入しようという算段である。<br />
導入に際し、今後何かとライフイベントが発生する可能性を考慮して、「結婚式準備」「引越し」等プロジェクトごとにチャットルームを作成し それぞれに通知が飛ぶようにした。</p>
<h2>結果</h2>
<p>以下のような感じでRedmine側で更新をかけると･･･</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2016/03/redmine_1.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2016/03/redmine_1.jpg" alt="redmine_1" width="764" height="373" class="aligncenter size-full wp-image-1199" /></a></p>
<p>以下のようにリアルタイムで通知が飛ぶ。デスクトップ上にNotificationも飛んでくれるので便利ですね。</p>
<p><a href="http://kinokoru.jp/wp-content/uploads/2016/03/redmine_2.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2016/03/redmine_2.jpg" alt="redmine_2" width="753" height="260" class="aligncenter size-full wp-image-1200" /></a></p>
<h2>まとめ</h2>
<p>大人になると色々と比較的大きめの取り決め事を並行して消化していかないといけない事が多くなってくるので、こういう風に家庭の事も管理しておくと「あーこれも準備しておかなきゃいけなかったー」みたいな抜け漏れも防ぐことができ、且つ計画的・効率的にタスクをこなしていくことができて結構良いのではないかと思った。</p>
<h2>参考にさせていただいたサイト様</h2>
<p>● Redmineの変更をSlackで通知できるようにする<br />
<a href="http://liginc.co.jp/web/programming/other-programming/97710" target="_blank">SlackとRedmineを連携し、登録したチケットの更新を通知する方法 &#8211; LIG INC.</a></p>
<p>● Redmine上の複数プロジェクトをSlackのチャットルームごとに通知<br />
<a href="http://blogs.zealot.co.jp/archives/763" target="_blank">SlackにRedmineのチケット更新を通知する &#8211; ZEALOTエンジニアブログ</a></p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1198">家庭内のタスクをRedmineとSlackを連携させて管理するようにしたらうまくいった話</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1198/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vagrant + Django でrunserverするまで</title>
		<link>http://kinokoru.jp/archives/1188</link>
		<comments>http://kinokoru.jp/archives/1188#comments</comments>
		<pubDate>Sat, 23 Jan 2016 03:59:36 +0000</pubDate>
		<dc:creator>Nisei Kimura</dc:creator>
				<category><![CDATA[ツール系]]></category>

		<guid isPermaLink="false">http://kinokoru.jp/?p=1188</guid>
		<description><![CDATA[<p>機械学習等で最近国内でも徐々に人気の高まりつつあるPythonだが、雑多なタスクの自動化等しているうちに Pythonが結構しっくり来ている。 せっかくならWebアプリケーションもPythonでつくれるようになりたいなあ [...]</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1188">Vagrant + Django でrunserverするまで</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></description>
				<content:encoded><![CDATA[<p>機械学習等で最近国内でも徐々に人気の高まりつつあるPythonだが、雑多なタスクの自動化等しているうちに Pythonが結構しっくり来ている。<br />
せっかくならWebアプリケーションもPythonでつくれるようになりたいなあということで Flask, Pyramid 等色々調べていたが、まずはDjangoでしょ という事で Djangoを始めた次第。</p>
<p>そんなDjangoだが、Vagrantによる導入時点で早速ハマった事があったので備忘録として残しておく。</p>
<p>環境は以下を使用しました。</p>
<p>・Python 3.4.3<br />
・Django 1.7<br />
・Vagrant 1.7.4 </p>
<p>※ 前提として Python, Django, Vagrantは既にインストール済みであること。<br />
<span id="more-1188"></span></p>
<h3>プロジェクトをつくる</h3>
<pre class="brush: bash; title: ; notranslate">
$ django-admin.py startproject blog
</pre>
<p>このコマンドを使用することによってカレントディレクトリ上に blog というDjangoプロジェクトのディレクトリができる。<br />
ディレクトリ下には プロジェクト名と同様の名前のディレクトリが存在し(blog/blog)その下にベースとなる設定(DB設定、ディレクトリパス設定等)、ベースとなるルーティング設定 等のファイル群が置かれている。</p>
<h3>ローカルPCからアプリケーションにアクセスできるようにする</h3>
<p>blogディレクトリ下で以下のように実行したものの、繋がらず。</p>
<pre class="brush: bash; title: ; notranslate">
$ python manage.py runserver
</pre>
<p>厳密に言うと、サーバは立ち上がっているのだけど、デフォルトのままrunserverを打つと サーバが127.0.0.1:8000で立ち上がってしまい、仮想環境内で閉じているから外部からアクセスできないという状態になっている。<br />
サーバ内でアクセス可能な様子は サーバ上で 127.0.0.1 にpingを打つ事で確認できる。</p>
<p>ローカルPCのブラウザから表示させる場合は、まずVagrantfileの設定を確認する必要がある。<br />
Vagrantfile内に以下のようなポートフォワードの記述があることを確認してほしい。</p>
<pre class="brush: bash; title: ; notranslate">
  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing &quot;localhost:8080&quot; will access port 80 on the guest machine.
  config.vm.network &quot;forwarded_port&quot;, guest: 8000, host: 8080
</pre>
<p>ローカルのブラウザで 127.0.0.1:8080 と打つ → 仮想環境の 8000番ポートにアクセスしますよ、という意味となる。<br />
人によっては guest と hostの設定が異なる場合があるので、逐一数値を変換して読んで欲しい。</p>
<p>では あとは仮想環境側で待ち受ければよいのだが、ここでサーバ側を 127.0.0.1:8000 として待ち受けても繋がらない(127.0.0.1は自身のマシン内で処理するもののため)ので、代わりに 0.0.0.0:8000 を指定する必要がある。</p>
<p>指定の仕方は簡単で、runserverの引数に与えるだけでよい。</p>
<pre class="brush: bash; title: ; notranslate">
$ python manage.py runserver 0.0.0.0:8000
</pre>
<p>これでサーバを立ててブラウザにアクセスすると…<br />
<a href="http://kinokoru.jp/wp-content/uploads/2016/01/django_worked1.jpg"><img src="http://kinokoru.jp/wp-content/uploads/2016/01/django_worked1.jpg" alt="django_worked" width="569" height="537" class="aligncenter size-full wp-image-1193" /></a><br />
ひとまずうまく動いた模様。</p>
<p>The post <a rel="nofollow" href="http://kinokoru.jp/archives/1188">Vagrant + Django でrunserverするまで</a> appeared first on <a rel="nofollow" href="http://kinokoru.jp">きのこる庭</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://kinokoru.jp/archives/1188/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
