Chainerをインストールし、mnistの実行ができた!
……が、mnistには色々な要素が詰まっていて、なかなか解読できません(以下の記事に続いて3度目。。)
Pythonと機械学習の初心者がChainerで最初に解読したコード
get_mnist()で取得したデータをchainer1.11以前のmnistに入力する

そこで本記事では、mnistのサンプルコードからエッセンスのみを抽出してみました。
元にしたのは上記2つ目の記事に載せたコードです。
エッセンスを抽出したコードを以下に載せます。
import numpy as np
from chainer import cuda, Variable, FunctionSet, optimizers, datasets
import chainer.functions as F

n_epoch = 100
n_units = 1000 # 中間層
pixel_size = 28

# MNISTの画像データDL
train, test = datasets.get_mnist()

# データの詰め替え
N = np.array(train).size / 2
x_train, y_train, x_test, y_test = [], [], [], []
for i in range(0, N):
x_train.append([train[i][0].astype(np.float32)])
y_train.append(train[i][1].astype(np.int32))
N_test = np.array(test).size / 2
for i in range(0, N_test):
x_test.append([test[i][0].astype(np.float32)])
y_test.append(test[i][1].astype(np.int32))
x_train = np.array(x_train)
y_train = np.array(y_train)
x_test = np.array(x_test)
y_test = np.array(y_test)

# MLP モデル
# 入力784, 出力10
model = FunctionSet(l1 = F.Linear(784, n_units),
l2 = F.Linear(n_units, n_units),
l3 = F.Linear(n_units, 10))

# NNの構造
def forward(x_data, y_data, train = True):
x, t = Variable(x_data), Variable(y_data)
#h1 = F.dropout(F.relu(model.l1(x)), train = train)
#h2 = F.dropout(F.relu(model.l2(h1)), train = train)
h1 = F.relu(model.l1(x))
h2 = F.relu(model.l2(h1))
y = model.l3(h2)

# 多クラス分類なのでsoftmax関数の交差エントロピー関数を誤差関数とする
return F.softmax_cross_entropy(y, t)

# optimizerの設定
optimizer = optimizers.Adam()
optimizer.setup(model)

# Learning loop
for epoch in range(1, n_epoch + 1):
print("epoch", epoch)

model.zerograds()
loss.backward()
optimizer.update()

# 訓練データの誤差と正解精度を表示
loss = forward(x_train, y_train)
print("train mean loss = {0}".format(loss.data))

# evaluation
# テストデータで誤差と正解精度を算出し汎化性能を確認
loss = forward(x_test, y_test)

# テストデータの誤差と正解精度を表示
print("test mean loss = {0}".format(loss.data))
これなら理解できそう!
というわけで、解説していきます。
model = FunctionSet(l1 = F.Linear(784, n_units),
l2 = F.Linear(n_units, n_units),
l3 = F.Linear(n_units, 10))
ネットワーク構造。
784個の入力(28×28の画像)から10個の出力(0~9のクラス分類)を生成します。
def forward(x_data, y_data, train = True):
x, t = Variable(x_data), Variable(y_data)
#h1 = F.dropout(F.relu(model.l1(x)), train = train)
#h2 = F.dropout(F.relu(model.l2(h1)), train = train)
h1 = F.relu(model.l1(x))
h2 = F.relu(model.l2(h1))
y = model.l3(h2)

# 多クラス分類なのでsoftmax関数の交差エントロピー関数を誤差関数とする
return F.softmax_cross_entropy(y, t)
順伝播関数。
コメントにも書いていますが、「多クラス分類なのでsoftmax関数の交差エントロピー関数を誤差関数」とします。
ドロップアウトは過適合を防ぐ仕組みであり、無くても動きます。
model.zerograds()
loss.backward()
optimizer.update()
元のコードではbatchsizeごとに処理をしていますが、これは「ミニバッチ」という効率化のためのテクニックであり、必須ではありません。
ただし、元のコードではbatchsize×n_epoch回重みを更新しますが、上記コードではn_epoch回しか更新しないため、その分n_epochを大きい値に設定する必要があります。

以上です。
やっとmnistを理解することができました。
早くCNNとかを使えるようになって、実践的な例を試してみたいです。