1. このコースがめざすこと
このコースは、E資格の「コード問題(プログラミング問題)」に向けた実装の対策です。 E資格は選択式の試験で、コードをゼロから書かせるのではなく、 提示されたコードを読んで「この出力は?」「正しい行はどれ?」「空欄に入るのは?」を選ばせる形式が中心です。
つまり必要なのは、コードを正確に「読み解く」力。 このコースでは PyTorch を軸に、深層学習の実装コードを1行ずつ追いながら、 各レッスンの最後に練習問題で「読めているか」を点検します。 手を動かして動作を確かめられる箇所(NumPy・scikit-learn)は、実際に実行しながら理解を深めます。
2. このコースの進め方(重要)
このコースには2種類のコードが登場します。見た目で区別できるようにしておきましょう。
- 読み取り専用のコード(主に PyTorch)…… 濃い背景+ファイル名つきで、実行ボタンがありません。 PyTorch はブラウザ内のPython(Pyodide)では動かせないため、「読んで理解する」ためのコードとして提示します。 そのコードを実行したらどう出力されるかは、コードの直下に「出力」として必ず示しますので、結果をイメージしながら読めます。
- 実行できるコード(NumPy・scikit-learn)…… 「▶ 実行」ボタンつきのセル。その場で動かして出力を確かめられます。 順伝播・逆伝播(Unit 1)や評価指標(L10)など、ブラウザで動くものは実際に手を動かします。
たとえば、次は読み取り専用のPyTorchコードです(実行ボタンが無いことに注目)。
import torch
import torch.nn as nn
x = torch.randn(32, 784) # 入力 x: (バッチ32, 特徴784)
fc = nn.Linear(784, 10) # 784次元 → 10次元 の全結合層
out = fc(x) # 全結合に通す
print(out.shape)
torch.Size([32, 10])
💡 2つの import:
import torch は PyTorch 本体(Tensor を作る torch.tensor・torch.randn や数学関数)。
import torch.nn as nn はニューラルネットの部品箱で、層(nn.Linear・nn.Conv2d)、活性化(nn.ReLU)、損失関数(nn.CrossEntropyLoss)などがまとまっています(慣例で nn という別名にします)。
このコードの小ネタ:
torch.randn(32, 784) は動作確認用のランダムなダミー入力。
fc = nn.Linear(...) で作った層は関数のように呼べるので、fc(x) と書くだけで順伝播が走ります。
💡 出力の読み方:
nn.Linear(784, 10) は「入力784次元・出力10次元の全結合層」。
入力 x が (32, 784) なら、出力はバッチ数32をそのままに、特徴だけ784→10へ変わって (32, 10) になります。
このように「コード → 出力」をセットで読むのが、コード問題を解く第一歩です。
3. コードを読むときの3つの着眼点
実装コードを読むとき、やみくもに眺めても答えは見えません。 次の3点を意識すると、コード問題はぐっと解きやすくなります。1つずつ実例で確かめましょう。
① shape(テンソルの形)を追う
データが各行で (バッチ数, 特徴数) のようにどんな形になるかを追います。
層を通るたびに形がどう変わるかを書き込みながら読むのがコツです。
次は、全結合を2層重ねたモデル(多層パーセプトロン)の例です。
import torch
import torch.nn as nn
x = torch.randn(32, 784) # (N=32, D=784)
net = nn.Sequential(
nn.Linear(784, 128), # 784 → 128
nn.ReLU(), # 形は変えない(負を0にするだけ)
nn.Linear(128, 10), # 128 → 10
)
out = net(x)
print(out.shape)
torch.Size([32, 10])
nn.Sequential(...) は、層を順番に並べて「上から順に通す」まとめ役です。
ここに渡した Linear → ReLU → Linear を、net(x) と呼ぶだけで自動的にこの順番で適用します
(forward を自分で書かなくてよい、シンプルなモデルの書き方です)。
出力を追うと、最後の次元(特徴)が 784 → 128 → 10 と変わり、バッチ数 N=32 は最後まで不変。
nn.ReLU() は活性化関数で形(shape)は変えません(各値の負の部分を0にするだけ)。
どの層が形を変え、どの層が変えないかを区別できることが、shape を正しく追う鍵になります。
② 処理の順序を確認する ── 学習ループの定石
深層学習の「学習1ステップ」には決まった順序があります。 順序を入れ替えると正しく学習できないため、なぜこの順番なのかまで理解しておきましょう(Unit 2で実コードとともに深掘りします)。
# 学習ループの1ステップ(この順番が定石)
optimizer.zero_grad() # ① 前ステップの勾配をリセット
output = model(x) # ② 順伝播(予測を出す)
loss = criterion(output, y) # ③ 損失を計算
loss.backward() # ④ 逆伝播(勾配を計算)
optimizer.step() # ⑤ パラメータを更新
print(loss.item())
2.3014 # ← このステップを繰り返すたびに、徐々に小さくなっていくのが正常
※ model(x) で順伝播、criterion は損失関数、loss.item() は損失(Tensor)を Python の数値として取り出す関数です。
⚠ 順序を間違えるとどうなる?
zero_grad()を忘れると、勾配が前ステップ分に足し算され続け、学習が壊れます(PyTorchは勾配を自動でリセットしない)。backward()の前にstep()を呼ぶと、更新に使う勾配がまだ無いため正しく学習できません。- 正しい順序は zero_grad → (順伝播 → 損失)→ backward → step。この語順をそのまま覚えましょう。
③ API(関数・クラス)の意味と引数を押さえる
層やクラスの引数の意味が分かれば、出力が読めます。代表的な2つの層の引数を確認しておきましょう。
| 書き方 | 意味 | 入力 → 出力の形 |
|---|---|---|
nn.Linear(in, out) |
全結合層。in=入力の特徴数、out=出力の特徴数 |
(N, in) → (N, out) |
nn.Conv2d(in_ch, out_ch, k) |
畳み込み層。in_ch=入力チャネル、out_ch=出力チャネル、k=カーネルサイズ |
(N, in_ch, H, W) → (N, out_ch, H', W') |
たとえば nn.Linear(784, 10) の 784 と 10 は「入力784・出力10」。
nn.Conv2d(3, 16, 3) なら「入力3チャネル(カラー画像)→ 出力16チャネル、3×3のカーネル」。
引数の順番と意味を覚えておくと、コードを見た瞬間に形の変化を追えます(Conv2d の出力サイズ H' の計算は L07 で詳しく扱います)。
4. コードの理解を問う問題の形式(一般)
「コードを読んで答える」問題は、一般に次のような形を取ります(本コースの練習問題もこの形式です)。 なお、実際の試験で何がどう出題されるかは公表されていません。ここでは、コードを理解できているかを確かめる一般的な問い方として整理します。
- ① 出力(特に shape)を答える……
提示コードの
print(...)の結果や、テンソルの形を選ぶ。本コースの練習問題でもよく扱います。 - ② 空欄を埋める(穴埋め)……
nn.Linear(784, ___)やloss.______()の空欄に入る語・数値を選ぶ。API名と引数の意味の理解が要点です。 - ③ 誤りのある行を見つける(バグ発見)……
zero_grad()の抜け、shapeの不一致、活性化の二重適用など、「正しく動かない原因」を選ぶ。 - ④ 正しい順序に並べ替える…… 学習ループや前処理の手順を正しい順に並べる。処理の順序の理解が要点です。
💡 読み方の軸: こうした問いに答えるうえで、前章の3つの着眼点(shape・処理の順序・API)が役立ちます。 毎回この3つをことばにして追う習慣をつけましょう。
5. なぜ PyTorch を選ぶのか
深層学習の実装で広く使われるライブラリには PyTorch と TensorFlow があります。 本コースは、そのうち代表的な PyTorch に統一します。理由は次のとおりです。
- 研究・実務での採用が広く、学習リソースが豊富
nn.Moduleを継承してモデルを書くスタイルが素直で読みやすい- 自動微分(autograd)の流れが「順伝播 → backward → step」と素直に対応し、理論と結びつけやすい
なお、本コースで学ぶ「考え方」(shapeを追う・処理順・自動微分)は TensorFlow でも共通です。 まず一方を深く理解することが、結局いちばんの近道になります。
6. shape の記号を読む(N, C, H, W)
深層学習のコードでは、データの形を (N, D) や (N, C, H, W) のように書きます。
記号の意味を最初に押さえておきましょう(くわしくは各レッスンで再確認します)。
| 記号 | 意味 | 例 |
|---|---|---|
N | バッチサイズ(一度に処理するデータ数) | 32枚の画像なら N=32 |
D | 特徴量の数(1件あたりの数値の数) | 784画素なら D=784 |
C | チャネル数(画像の色など) | カラー画像なら C=3、グレースケールなら C=1 |
H, W | 画像の高さ・幅 | 28×28画像なら H=28, W=28 |
たとえば「28×28のグレースケール画像32枚」は (32, 1, 28, 28) すなわち (N, C, H, W)。
この形が層を通るたびにどう変わるかを追えると、CNN(Unit 3)のコードも怖くありません。
(N, C, H, W) を (N, C×H×W) に平らに伸ばす(flatten)必要があります。
「(32, 1, 28, 28) → (32, 784)」という変形(28×28×1=784)は L05・L07 で実コードとともに確認します。
7. 練習問題
コードと出力を読んで答えを選び、「答えと解説を見る」で確認しましょう。
出力の shape はどれ?
次のコードで out.shape はどうなりますか。
x = torch.randn(16, 100) # (N=16, D=100)
fc = nn.Linear(100, 3)
out = fc(x)
- A. (16, 100)
- B. (16, 3)
- C. (3, 16)
- D. (100, 3)
答えと解説を見る
正解:B. (16, 3)
nn.Linear(100, 3) は「入力100次元 → 出力3次元」。
バッチ数 N=16 はそのままで、特徴だけ 100→3 に変わるため、出力は (16, 3) です。
全結合層は最後の次元(特徴)だけを変える、と覚えましょう。
学習ループの正しい順序は?
学習の1ステップとして正しい処理順はどれですか。
- A.
backward()→zero_grad()→step() - B.
zero_grad()→ 順伝播・損失 →backward()→step() - C.
step()→backward()→zero_grad()
答えと解説を見る
正解:B
まず zero_grad() で前の勾配を消し、順伝播で予測と損失を出し、backward() で勾配を計算、最後に step() で更新します。
zero_grad() を忘れると勾配が累積し、backward() 前に step() しても更新する勾配がありません。
このコース内で「実行できる」のはどれ?
次のうち、このコースのブラウザ上で実際に「▶ 実行」して動かせるコードはどれですか(複数可)。
- A.
import torchを使った PyTorch のモデル定義 - B.
import numpy as npを使った順伝播の計算 - C.
from sklearn.neighbors import KNeighborsClassifierを使った分類
答えと解説を見る
正解:B と C
ブラウザ内のPython(Pyodide)では NumPy と scikit-learn は動きます(B・C)。 一方 PyTorch(A)は動かせないため、本コースでは読み取り専用のコード+出力として提示します。 「読むコード(PyTorch)」と「動かすコード(NumPy・sklearn)」の区別を覚えておきましょう。
ReLU を通すと shape はどうなる?
x の形が (8, 64) のとき、y = nn.ReLU()(x) の y.shape はどれですか。
- A. (8, 64) のまま
- B. (8, 1)
- C. (64, 8)
答えと解説を見る
正解:A. (8, 64) のまま
活性化関数(ReLU・シグモイド・tanh など)は各要素に対して計算するだけなので、形(shape)は変わりません。
形を変えるのは Linear や Conv2d、view/flatten などです。
📌 nn.ReLU()(x) の書き方:
nn.ReLU はクラスなので、まず nn.ReLU() で実体を作ってから、その実体に (x) で入力を渡します(だから括弧が2回)。
nn.ReLU(x) と書くと x をクラスの設定値として渡してしまい誤りです。
関数として直接使う torch.relu(x)(または F.relu(x))でも同じ結果になります。
8. まとめ
このレッスンのポイント
- E資格のコード問題は「書く」より「読んで答える」。必要なのは読み解く力
- 読むときの着眼点は ① shape ② 処理の順序 ③ API の意味と引数
- コード理解を問う形式は 出力(shape)・穴埋め・誤り発見・並べ替えなど。いずれも3つの着眼点が役立つ
- 学習1ステップの定石:zero_grad → 順伝播・損失 → backward → step
- 全結合層は最後の次元(特徴)だけを変える。活性化(ReLU等)は形を変えない
- 本コースは PyTorch に統一。コードは 読み取り専用(PyTorch・出力つき)と実行できる(NumPy・scikit-learn)の2種類
- 理論そのものは E資格対策ページ、本コースは実装に集中
次のレッスンからは、いよいよコードを動かします。まずはNumPyで「順伝播」を自分の手で組み、 ニューラルネットの中身を体で理解しましょう。
完了するとコース一覧に進捗が記録されます