【AWS】知識ゼロから理解するRDS超入門
AWSのデータベースサービス「Amazon RDS」を初心者にもわかるように解説します。未経験には難しいMultiAZ構成やレプリケーションは、マスター/スレ...
2018-04-23 17:26 2018-05-29 21:02
「プログラミング未経験の私がPythonの機械学習で手書き文字の識別を行うまで」というテーマで、機械学習について全く知識のない人もプログラミング未経験者の人にもわかりやすく、プログラミング歴の浅い私だからこそできる説明をしていきたいと思います。
前回は、ニューラルネットワークとはなにか、どんな構造なのかを簡単な例を踏まえて解説しましたので、今回は実際に機械学習をプログラミングへ落とし込み、Pythonで手書き文字(MNIST)識別するプログラムを実装していきます。
前回の「知識ゼロで機械学習・AIを理解するために必要なニューラルネットワークの基礎知識」では、ニューラルネットワークの仕組みとその構造について説明していました。
>>前半:「知識ゼロで機械学習・AIを理解するために必要なニューラルネットワークの基礎知識」はコチラ
簡単におさらいしていきます。
ニューラルネットワークの構造は、入力層・隠れ層・出力層の3つの階層からできて、それぞれに役割があります。
入力層では、ニューラルネットワークに入るように工夫したデータxをインプットします。その値xを隠れ層で、重みWと掛け合わして、バイアスbを足した値を活性化関数に入れることで特徴量を抽出します。
そして、最終的に予測値yを出力層で、(全てのW*隠れ層から出てきた値+b)をした値をソフトマックス関数に入れることで得ることができます。
さらに、この予測値yの精度を上げるためにコスト関数を用いて、Wとbを更新して予測値と正解ラベルとの誤差を最小にしていくように学習を行います。
これが、一連のニューラルネットワークの流れです。
私はPythonを使って機械学習で、0から9の手書き文字を認識してくれるプログラミングを作りました。
例えば、手で書かれた0-9の10コの数字から1つ、例えば「8」を作成したモデルに入ると、「あなたが書いた数字は"8"です。」といった判別結果を返してくれるといったようなプログラミングです。
今回は、MNIST(エムニスト:Mixed National Institute of Standards and Technology database)と呼ばれる0から9の手書き文字が無数に含んだデータセットを使用しました。
私が作ったモデルは、MNISTを用いて識別率92%を得ることができ、プログラミング初心者の私でもかなり精度の高い識別器が作れました!
皆さんもニューラルネットワークの仕組みをしっかりと理解していれば決して難しくないので、ぜひ手を動かしてチャレンジみて下さい。
0から9の手書き文字を認識する識別器の機械学習で行うためには、
の大きく4つのステップに分けられます。順を追って説明していきます。
通常は、自分でデータセットを作成する必要がありますが、今回のデータセットは先程述べたMNISTを使用します。MNISTデータセットの取得は後述に記載しています。
このデータセットには、0 から 9 までの数字について手書き数字のグレースケール 28×28 ピクセル画像がテスト用に10,000枚、トレーニング用に55,000枚、検証用に5,000枚用意されています。
テスト用データセットは、学習したモデルの精度を調べるために使います。
トレーニング用データセットは、その名の通り、学習をさせるために何度も使用して、モデルに正解ラベルを覚えさせます。
検証用データセットは、テスト用との区別がしづらいのですが、一定のトレーニングが終わるごとに精度を検証するために使います。
コレを使用する時は、学習はさせません。そのため、一定の学習が済んだところに毎回トレーニングに使用していないまっさらなデータで精度を確かめることができます。
MNISTデータセットの扱い方の詳しい内容については、別の記事でも解説を行いますのでこのくらいにしておきます。
ここが最も重要なステップで、0から9を判別するモデルを作成します。モデルとは、ニューラルネットワークの構造を含むメインとなるプログラムを指します。
最も大事なステップではありますが、ニューラルネットワークの仕組みと構造を理解していれば、そこまで難しくないので心配ありません。
入力層・隠れ層・出力層の3つの階層に分けてニューラルネットワークを構築します。重みWとバイアスbはこのモデルの構造中に組み込まれます。
そして、出力層から出てきた予測値と正しい値を比較して誤差の平均値を計算し、その誤差を最小にするように誤差逆伝播法を用いて、重みWとバイアスbを更新していきます。
詳しい原理や仕組みについては前半の「知識ゼロで機械学習・AIを理解するために必要なニューラルネットワークの基礎知識」で解説していますので、そちらをご覧ください。
作成したモデルを実際に学習を行わせていきます。
トレーニング用の55,000枚の画像から任意の枚数(今回は100枚)分取り出して画像の塊を作成します。これをバッチ(batch)と言います。
このバッチ毎モデルに画像を入力して、学習を行わせます。バッチを用いるメリットは、バッチの枚数分ずつの誤差の平均値を使用して、誤差を最小にするように作用するため、1枚ずつ学習させるよりも画像の違いによる学習のばらつきを抑える役割があります。
これをミニバッチ学習といい、これを繰り替えることによってモデルを学習させます。この際に、検証用のデータを使用して予測させることによって、現在の精度を確認することができます。
検証用のデータを入力する際には学習はさせないことで、常にトレーニングに未使用なデータとして精度を正確に検証することができます。
学習したモデルをテストして精度を検証します。
テスト用に10,000枚のデータセットをモデルに入力して、推測値が10,000枚分のうち正しく推定できたのかを精度として示します。
ここで、自分が期待するような精度が得られなかった時は、ハイパーパラメータ(学習率α、重みWとバイアスbの初期値、隠れ層のノード(ニューロン)数、最適化関数(オプティマイザー)etc.)を変更して再学習を行うことでよりよい精度を目指しましょう。(※今回はその必要はありません。)
まだ、このままではPythonで機械学習を使ったプログラムを実装することはできないので、必要な道具を揃えるための準備を行っていきましょう。
Anacondaとは、Python本体とPythonでよく利用されるライブラリがセットになったPythonパッケージです。
これを使うことで簡単に環境設定を行え、すぐに高度な数値計算やデータ分析、機械学習等でできるようになります。
Anacondaの公式ホームページからダウンロードを行いましょう。自分が使っているPCのOSを選択して、Python3.6 version(2018/04/23現在)を選んで下さい。Python3系とPython2系は同じようにみえてかなり違うので注意してください。
また、Anacondaのパッケージの中にはjupyter notebook(ジュピターノートブック)というブラウザで動作するプログラムの対話型実行できるツールがあります。
これは、プログラムを書いたり、実行したりするのがとてもわかりやすくて便利で初心者から研究者まで使用している機能です。これから書いていくコードもjupyter notebookを使うと簡単に実装していくことができます。
詳しくは、AnacondaでのTensorFlow環境構築と基礎的な使い方で解説しています。
次に、機械学習を行うのに便利なライブラリTensorFlow(テンサーフォロー)をインストールしていきます(テンソルフォローとも言う)。
TensorFlowがなくても、Pythonの基本的なライブラリのみで機械学習を実装することもできるので、別の記事でそれも解説したいと思っていますが、今回は便利なこのライブラリをコードを書いていきます。
TensorFlowとは、機械学習をする際に必要である複雑な計算を手軽に行うことができるオープンソフトウェアライブラリです。
ぶっちゃけコレを使うと、前半で説明した数学的な理解がなくても実装できてしまいます。笑
ただし、理解をしていないとどうして動いているのか分からないといった事態にもなりかねないので、原理を理解した上で進めていくことを強くおすすめします。
TensorFlowは、先程インストールしたAnacondaで簡単にインストールできます。
>>TensorFlowのインストール方法と基礎的な使い方はコチラ
Yann LeCun's MNIST DATEBASEでダウンロードして下さい。ダウンロードしたデータセットは、コードを書いているファイルと同じ階層にMNIST_dataという名前をつけたファイルを作り、そのファイルの中に入れておいてください。
MNISTデータセットの詳しい扱い方は、「MNISTデータセットを実践的に使うためには(執筆中)」で改めて説明します。これで準備は整いました!
それでは、「0から9の手書き文字を認識してくれる識別器」の解説を行っていきます。
今回、ココで使用するのは、MNIST beginner(リンクは英語版)というTensorFlowのチュートリアルとして使用させるサンプルコードを使用していきます。
このMNIST beginnerはかなりシンプルなモデルとなっており、隠れ層と活性化関数がなく、入力層で入ってきたデータをそのまま、出力層に入れ込むカタチになっています。(下の図)
まずは、モデルの学習結果を見てください。
以下のグラフがトレーニング時の予測成功確率です。縦軸が予測成功確率で、横軸がバッチの試行回数を表しています。
5,000回バッチを入れて学習を行ったところで、すでに90%以上の予測成功率を叩き出しています。5,000回の試行をするのにかかったPCの処理時間も約7秒ほどなので、比較的簡単に0から9の数字の特徴量を抽出することができたことがわかります。
機械学習には膨大な処理時間がかかり、GPUを使わないといけないというイメージを持っている人も多いと思いますが、ここでの30,000回の試行にかかった時間は、約44秒でした。これは、入力層と出力層のみであったため、計算がそれほど複数にならなかったと考えられます。
ちなみに、TensorFlowのツールの1つであるTensorBoard(テンサーボード)を使用すれば、このような学習中の推移も簡単に見ることができます。TensorBoard(テンサーボード)の使い方も、別の機会に紹介したいと思います。
次に、トレーニング時の誤差のグラフをみていきましょう。
この図の縦軸は、コスト関数から出てきた値を表しているのですが、直感的に試行を重ねるごとに誤差が減少していることがわかるのではないでしょうか。
そして、このようなトレーニングを終えた後に、学習で使用していないテスト用データセットを用いて、予測成功確率を検証しました。
つまり、初めてモデルが出会った画像データでも92.2%の確率で正しい値を予測することができるまで学習することができました。
まとめると、30,000回の試行では以下のような結果になります。
処理時間 | トレーニング時の予測成功確率 | テスト時の予測成功確率 |
---|---|---|
44s | 94.0% | 92.2% |
実際に使用したコードは、
の5つに分けて考えることができます。
では、実際のコードを見てもらいましょう。
# ===========import===========
import tensorflow as tf
import os
from tensorflow.examples.tutorials.mnist import input_data
# GPUの無効化
os.environ['CUDA_VISIBLE_DEVICES'] = ""
def main():
# ===========init===========
image_size = 28*28
output_num = 10
learning_rate = 0.001
loop_num = 30000
batch_size = 100
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# ===========model===========
with tf.device("/cpu:0"):
x = tf.placeholder(tf.float32, [None, image_size])
W = tf.Variable(tf.zeros([image_size, output_num]))
b = tf.Variable(tf.zeros([output_num]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, output_num])
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
init = tf.global_variables_initializer()
sess = tf.InteractiveSession()
sess.run(init)
# ===========training===========
for i in range(loop_num):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
if i % 1 == 0:
print("step", i, "train_accuracy:", sess.run(accuracy, feed_dict={x: batch_xs, y_: batch_ys}))
# ===========test===========
print("test_accuracy:", sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
if __name__ == "__main__":
main()
# ===========import===========
import tensorflow as tf
import os
from tensorflow.examples.tutorials.mnist import input_data
# GPUの無効化
os.environ['CUDA_VISIBLE_DEVICES'] = ""
Pythonでは、ライブラリをインポートすることで便利なツールを手軽に使うことができます。
また、自分で書いたコードもインポートすることによって他のファイルで使うことができます。
ここでは、先程インストールしたtensorflowとMNISTの使用する上での処理が書かれているinput_data.pyというPythonファイルをインポートします。
osというライブラリもインポートするのですが、これは今回CPUを用いて実行していくのでGPUを無効化するコードを書くために使います。コレがなくても、CPUを使ってくれることもあるのですが、念のために書いておきます。
def main():
# ===========init===========
# 入力する画像のサイズ(28pixel*28pixelのグレースケール)
image_size = 28*28
# 出力する値の数(数字予測なので、「0,1,2,3,4,5,6,7,8,9」の10コ)
output_num = 10
# 学習率(今回は、α=0.001を設定)
learning_rate = 0.001
# バッチの試行回数
loop_num = 30000
# バッチ1つに対する画像の枚数
batch_size = 100
def main():の配下に書かれている部分は、このPythonファイルを実行した時に動くというふうに理解して下さい。
ここでは、予め決まっている初期値を定義していきます。例えば、入力する画像のサイズであるimage_sizeは28*28、出力する値の数ouput_numは10といったように定義します。
この作業をせず、output_numが入る部分に10と書いても全く問題はないですが、何度も出てくるものや「ここでの10の意味はなんだっけ」と思い出すためにこのような初期値の定義を行っておくとラクです。
# MNISTデータセットを読み込む
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
Pythonでの「.」の接続には複数の意味がありますが、ここではinput_data.pyの中のread_data_setsという関数と解釈して下さい。
つまり、mnistの中には、input_data.pyの中の関数であるread_data_setsを引数("MNIST_data/", one_hot=True)とした時の返ってくる値が入っています(本当はオブジェクトですが、ややこしいので値という認識でもOK)。
この値とは、train、test、validationのそれぞれの画像データ(images)、正解ラベル(labels)です。
データセット名 | 内容 |
---|---|
mnist.train.labels | トレーニング用データセット(55,000枚)の画像データ(28*28pixel) |
mnist.train.images | トレーニング用データセット(55,000枚)のラベルデータ |
mnist.test.labels | テスト用データセット(10,000枚)の画像データ(28*28pixel) |
mnist.test.images | テスト用データセット(10,000枚)のラベルデータ |
mnist.validation.labels | 検証用データセット(5,000枚)の画像データ(28*28pixel) |
mnist.validation.images | 検証用データセット(5,000枚)のラベルデータ |
例えば、以下のようにすると、トレーニング用データセットの1枚目のラベルを確認することができます。
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
print(mnist.train.labels[0])
# 実行結果:[ 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.] ===>> "7"
1枚の画像データは、28*28pixelなので、28*28の数列が含まれています。
一方で、ラベルデータは、one-hot表現を使用しており、例えば、「7」を表現するには[0, 0, 0, 0, 0, 0, 0, 1, 0, 0]と表記されます。
one-hot表現を使うことで、計算する誤差値のばらつきを無くすことができます。
この場合、予測値は8つ目の要素、正解ラベルは2つ目の要素で予測値と正解ラベルは違うとわかって、誤差では「1-0=1」となり、どんな値同士での誤差は均一になります。
仮にone-hot表現を使用しなかった場合は予測値が7で、正解ラベルが1である時、誤差は「7-1=6」となり、誤差が不均一となってしまいます。
# ===========model===========
# GPUではなくて、CPUを使う場合に書くおまじない
with tf.device("/cpu:0"):
# 入力する値x(Noneには、実際に入れる画像の枚数が自動的に入る)
x = tf.placeholder(tf.float32, [None, image_size])
# 重みW(初期値は、image_size*output_numのゼロのみが入った配列)
W = tf.Variable(tf.zeros([image_size, output_num]))
# バイアルb(初期値は、output_numのゼロの身が入った配列)
b = tf.Variable(tf.zeros([output_num]))
# 全てのxとWを掛け合わして、bを足した値out
out = tf.matmul(x, W) + b
# ソフトマックス関数に代入することで予測値が出力
y = tf.nn.softmax(out)
# 正解ラベル (Noneには、実際に入れる画像の枚数が自動的に入る)
y_ = tf.placeholder(tf.float32, [None, output_num])
# コスト関数
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
# 最適化関数を用いて誤差逆伝播法を行う
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)
# 予測値と正解ラベルが同じ値であるかを確かめる
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
# 予測精度を計算
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# TensorFlow独特の仕様(ここではおまじない)
init = tf.global_variables_initializer()
sess = tf.InteractiveSession()
sess.run(init)
ここで、もう一度モデル全体像をおさらいしましょう。上記のコードはこのモデルを完全に落とし込んでいるので、この図をしっかりと理解することが大切です。
そして、それぞれの値は図のどこに対応しているのかを下の表と照らし合わせてみてください。
値 | 内容 | 配列の大きさ(shape) |
---|---|---|
x | 入力した画像データ | [バッチの枚数(None),28*28(pixel)] |
W | 入力層と出力層のニューロン間の重み | [28*28(pixel),出力数(10)] |
b | 出力層にいるバイアス | [出力数(10)] |
out | W*x+bで求める出力層の値 | [バッチの枚数(None),出力数(10)] |
y | ソフトマックス関数にoutを代入することで得られる予測値 | [バッチの枚数(None),出力数(10)] |
y_ | 実際の値の正解ラベル | [バッチの枚数(None),出力数(10)] |
上の図だと1枚のみの画像でしたが、実際はバッチとして塊となった画像が入るのでここでは、None=1度に入力する画像の枚数(バッチの枚数)となり、何枚でもまとめていれることができます。
入力したxは、重みWと掛け合わて、バイアスbを加えます。そして、outを求めることができ、それをソフトマックス関数に代入することで予測値yを獲得します。
これを1度に入力する画像の枚数繰り返すので、yの配列の大きさは、[None(1度に入力する画像の枚数),10(出力する値の数)]となります。
# コスト関数
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
ここでは、コスト関数としてクロスエントロピーという手法を使っています。以下が誤差を求める公式です。
y^は正解ラベルで、yは予測値です。直感的に考えると、y^=y≒1の時、また、y^=y≒0の時には誤差が0に近づます。つまり、正解ラベルと予測値との誤差がない時はcross_entropyも大きくなりません。
# 最適化関数を用いて誤差逆伝播法を行う
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)
「GradientDescentOptimizer」は、最急降下法による最適化関数です。最急降下法とは、全ての誤差の合計を使ってコスト関数でW,bの傾きを小さくする方法です。
この「GradientDescentOptimizer」を使うと、学習率α=0.001でcross_entropyを最小にするように変数(W,b)を更新してくれます。
これが、TensorFlowがめちゃくちゃ便利な理由です。この1行のみで誤差逆伝播を行なってくれるのです。
これをTensorFlowを一切使わずに書くと、W,bの傾きを小さくするために微分を行なって、値を各階層ごとに更新する数式を手書きしなければいけません。
しかし、やはり、どのようにW,bを更新しているかという原理が抜けているとどこかで落とし穴にハマって抜け出せなくなってしまうと思うので、しっかりと原理を理解してからTensorFlowの最適化関数を使いましょう。必ず自分のチカラになるはずです。
# 予測値と正解ラベルが同じ値であるかを確かめる
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
# 予測精度を計算
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
tf.argmax(y, 1)は、yの配列の2行目(0が1行目なので)で最も大きな値が何列目にあるのかを返します。そして、tf.equalは2つの値が等しい時にTrueを返し、予測値が正しい予測を行うことができたかを確かめます。
accuracyは、全体の平均予測精度を表しています。tf.castは、引数がTrueなら1、Falseなら0を返し、tf.reduce_meanでそれらの値の平均値を求めます。
# バッチサイズが10枚を入れた時のcorrect_predictionの例:
[True True False True True False True True False False]
# tf.cast(correct_prediction, tf.float32)の例:
[1. 1. 0. 1. 1. 0. 1. 1. 0. 0.]
# acurracyの例:
0.6
# ===========training===========
# loop_num回トレーニングを行う
for i in range(loop_num):
# バッチは、batch_sizeの画像をトレーニング用データセットから持ってくる
# batch_xs:画像データ(28*28pixel)
# batch_ys:正解ラベル(0-9の値)
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
# xにbatch_xsを代入、y_にはbatch_ysを代入して、トレーニングを行う
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
# 100回ごとにトレーニング時の予測精度を表示する
if i % 100 == 0:
print("step", i, "train_accuracy:", sess.run(accuracy, feed_dict={x: batch_xs, y_: batch_ys}))
いよいよ、モデルの学習です。ここでは、for文を使って、loop_num=30,000回トレーニングを行います。
1回のトレーニングは、バッチごとに行います。バッチはbatch_size=100枚です(initで定義済み)。
mnist.train.next_batch(batch_size)は、上記(初期値を設定する)で定義しているmnistのトレーニング用データセットであるtrainを使って、メソッドであるnext_batchによりバッチをランダムに取り出します。
トレーニング用データセット55,000枚の中から100枚を取り出します。
そして、xに今取り出したバッチの画像データを入れ、y_には正解ラベルを入れて、train_stepを実行します。
sess.runは、別の記事で説明するので、ここではTensorFlowで実行を行う際に使うおまじないだと思ってください。
そして、printではトレーニング100回ごとに予測精度を表示させています。
※ココからの話は、まだプログラミングをはじめたばかりの人はスルーして頂いても構いません。
厳密に、mnist.train.next_batch(batch_size)を解説します。
mnistの中には、input_data.read_data_sets("MNIST_data/", one_hot=True)による戻り値として、それぞれの画像データ(images)、正解ラベル(labels)を含んだtrain、test、validationの3つのDatasetというオブジェクトを返します。
このオブジェクトの中には、next_batchというメソッドも含んでいます。そのため、mnist.train.next_batch(batch_size)というように「.」を繋いでコードを書くことができているのです。
# ===========test===========
# xにmnist.test.image(テスト用データセットの画像)を代入
# y_にはmnist.test.labels(テスト用データセットのラベル)を代入して、テストを行い、精度を確かめる
print("test_accuracy:", sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
最後に、テスト用データセットを使用して、予測精度を検証します。
xにテスト用画像データを入れ、y_には正解ラベルを入れて、accuracyを実行します。これで、このモデルの予測精度を確認することができます。
if __name__ == "__main__":
main()
全コードをmnist-beginner.pyと保存して、ターミナル(Windowsはコマンドプロンプト)からpython mnist-beginner.pyと実行した時にmain()に含まれたコードが動くということを意味しています。
つまり、他のファイルからインポートしても、実行されることはなく、このファイルを直接読んだときのみ実行されます。
お疲れ様でした。これが、MNIST beginnerによる0から9の手書き文字を認識プログラムの全てです。
今回は、「プログラミング未経験の私がPythonの機械学習で手書き文字の識別を行うまで」の後半ということで、簡単なモデルを使って数字の識別を行なってくれるプログラムの実装をお伝えしました。
ニューラルネットワークの基本的な原理を理解した人は案外簡単にここでやっていることを理解できたと思います。
まだ、いまいちわからないという人は前半のニューラルネットワークの仕組みについて何度も読み返して下さい。
1度では、難しいと思うますが、繰り返し読むことで必ずわかってくるので諦めずに続けて下さい。ココさえ乗り越えれば、実践的な応用はすぐ目の前です。
次は、隠れ層と活性関数を加えたニューラルネットワーク(NN)の実装を解説します!モデルに隠れ層と活性関数を加えるとどのように変わるのかを明らかにすることで、機械学習の面白さをより一層感じることができると思います。
学生Webエンジニア PLANインターン生 PHP Laravel Python HTML CSS JS
【名前】 "ゆざ"
【関連】 株式会社PLAN / MIYABI Lab / Tmeet(twitterユーザーマッチングサービス) /
【MIYABI Lab運営】23歳/同期がト◯タやMicr◯softに就職する中、ベンチャーに未経験でWebエンジニアになるのを選んだ脳科学専攻の理系院生◆人見知り日本縦断◆機械学習/Web歴5ヶ月
【AWS】知識ゼロから理解するRDS超入門
AWSのデータベースサービス「Amazon RDS」を初心者にもわかるように解説します。未経験には難しいMultiAZ構成やレプリケーションは、マスター/スレ...
【AWS】Auto Scalingする前に知っておくべき7つのこと
Amazon EC2 Auto Scaling(オートスケール)を使用すると、CPU使用率等に応じてEC2の台数を自動的に増減できます。ここでは、初心者の持つ疑問を通し...
WordPressの基本構造を理解してオリジナルテーマを作ろう(後半)
WordPressのテーマを自作するために必要なテンプレートファイル(functions.phpやstyle.css)の役割やファイル構造を理解して、どのようにオリジナ...
WordPressの基本構造を理解してオリジナルテーマを作ろう(前半)
WordPressのテーマを自作するために必要なテンプレートファイル(functions.phpやfront-page.php)の役割やファイル構造を理解して、どのようにオ...
【Heroku入門】無料枠サーバーを24時間スリープさせない方法
フリープランのHerokuサーバーでは、30分以上アクセスがないと自動的にスリープしてしまいます。ここでは、Herokuサーバーを寝かせない方法につい...
【入門編】Laravelのディレクトリ構造とMVCの処理の流れを理解する
Laravel初心者が学習する際にわかりにくいLaravelのディレクトリ構造を具体的な例を交えて解説します。MVCの基本であるビュー、モデル、コントロー...
【初心者向け】PythonによるHeroku環境で簡単LINEBot開発
誰でも簡単にLINEBotをpythonを使ってHeroku環境で開発できる方法を解説します。ここでは、LINE Messaging APIを用いることでおうむ返しをするBot...
AWSでWebサーバー構築!踏み台サーバーでセキュアなネットワークを構築する(第5回)
連載の第5回です。メインEC2に対して直接SSH接続できる状態というのは、セキュリティの観点からあまり望ましくありません。MySQLやEBSが紐づいたメ...
AnacondaでのTensorFlow環境構築と基礎的な使い方
Anaconda(アナコンダ)のインストールからJupyter notebook(ジュピターノートブック)とTensorFlow(テンサーフロー)の基本的な使い方を初心者...
脱初心者!MNIST beginnerに隠れ層を加えたニューラルネット解説
TensorFlowのチュートリアルであるMNIST beginnerの応用して、隠れ層と活性化関数を加えたニューラルネットワークで手書き文字識別を解説します。...
AWSでWebサーバー構築!Apache2.4, PHP7, MySQLの導入と初期設定(第4回)
連載の第4回です。今回は作成したEC2インスタンスにWebサーバーとしての機能を持たせるため、Apache2.4のインストールおよびhttpd.conf等の各種設...
AWSでWebサーバー構築!EC2を作成してSSH接続する(第3回)
連載の第3回です。前回作成したVPC・サブネットにおいて、セキュリティーグループに保護されたEC2インスタンスの作成・設定およびSSH接続の確立ま...
初心者必読!MNIST実行環境の準備から手書き文字識別までを徹底解説!
Pythonによる機械学習をプログラミング初心者にもわかりやすいように、TensorFlowチュートリアルのMNIST beginnerを使って、手書き文字(MNIST)識別...
AWSでWebサーバー構築!専門用語の解説とVPC環境を構築する手順(第2回)
連載の第2回です。AWSにてVPCネットワークを構築してWebサーバーを設置・運用するためには、AWS内で利用される重要単語について正しく理解しておく...
知識ゼロで機械学習・AIを理解するために必要なニューラルネットワークの基礎知識
機械学習・AIを理解するために必要なニューラルネットワークの基礎について、これから機械学習を勉強したい人、プログラミング未経験の人にもわか...
Canvaで簡単におしゃれなアイキャッチ画像を作ろう!使い方を徹底解説!
PhotoshopやIllustratorを使えなくてもCanvaなら誰でも簡単におしゃれなアイキャッチ画像が作れます。豊富なデザインテンプレートを組み合わせるだ...
プレビュー機能付きの記事編集画面の作り方(Laravel5)
記事編集フォームにはプレビュー機能の実装が必須です。記事を保存する処理とプレビューを表示する処理を共存させるにあたり、ボタンをクリックし...
AWSでWebサーバー構築!VPC設計に必要なIPアドレスとサブネットの基礎知識(第1回)
連載の第1回です。AWSのVPCネットワークを設計して実際に構築するためには、IPアドレスの基礎を理解することが非常に大切です。EC2 Webサーバーを...
MIYABI Labホームページを製作しました
様々な理由でプログラミングの勉強を困難だと感じてしまっている方のお役に立てれば嬉しいです。これからも小さなWebサービスを作り続けていき、技...
ゆざ、株式会社PLANを卒業します。
2年間インターンとしてお世話になった株式会社PLANを卒業します。AWS,Laravel,Pythonなどの技術的なことだけではなく、エンジニアとして、社会人と...