1. コード読解の着眼点(総まとめ)
このコースを貫いてきたのは、たった3つの着眼点でした。どんなコード問題も、結局はここに帰着します。
① shape を追う……全結合は最後の次元だけ変える/活性化は形を変えない/Conv2dは (H+2P−K)/S+1 /flattenは C×H×W。
② 処理の順序……学習は zero_grad → 順伝播 → 損失 → backward → step。評価前は eval() + no_grad。
③ API の意味と引数……nn.Linear(in,out)・Conv2d(in_ch,out_ch,K)・CrossEntropyLossはsoftmax内包・MultiheadAttentionはembed_dimをnum_headsで割り切る。
2. 学んだことの地図
Unit 1: 土台(L01〜L03)
- コード読解の着眼点
- NumPyで順伝播(行列積・活性化)
- NumPyで逆伝播(連鎖律・勾配チェック)
Unit 2: PyTorch基礎(L04〜L06)
- Tensor・autograd・backward
- nn.Module・Linear・損失関数
- 学習ループ・最適化・正則化・DataLoader
Unit 3: 深層学習の実装(L07〜L09)
- CNN(畳み込み・出力サイズ・im2col)
- 学習・評価・転移学習・ResNet
- RNN/LSTM・Self-Attention・Transformer
Unit 4: 機械学習・環境(L10〜L12)
- パターン認識・距離・評価指標・交差検証
- Docker・モデル軽量化・GPU/TPU
- 総合演習・次のステップ
3. 総合演習(横断確認)
これまでの内容を横断する問題です。着眼点を思い出しながら解いてみましょう。
CNNの出力 shape を最後まで追う
入力 (8, 3, 32, 32) を Conv2d(3, 16, 3, padding=1) → MaxPool2d(2) に通すと、出力 shape はどれですか。
- A. (8, 16, 32, 32)
- B. (8, 16, 16, 16)
- C. (8, 3, 16, 16)
答えと解説を見る
正解:B. (8, 16, 16, 16)
Conv2d でチャネル 3→16、H/Wは (32+2−3)/1+1=32(pad=1で維持)。
MaxPool2d(2) で 32→16。よって (8, 16, 16, 16)。
学習ループのバグを見つける
次の学習ループには問題があります。どれですか。
for x, y in loader:
out = model(x)
loss = loss_fn(out, y)
loss.backward()
optimizer.step()
- A.
optimizer.zero_grad()が無く、勾配が累積してしまう - B.
model(x)の順番が間違っている - C. 損失関数が不要
答えと解説を見る
正解:A
各ステップの先頭に optimizer.zero_grad() が必要。無いと勾配が前のステップ分に足され続け、学習が壊れます。
CrossEntropyLoss の前に softmax は?
分類モデルで nn.CrossEntropyLoss を使うとき、モデルの最後に softmax を付けるべきですか。
- A. 付けるべき
- B. 付けない(CrossEntropyLossが内部でlog-softmaxを行うため)
- C. どちらでもよい
答えと解説を見る
正解:B
CrossEntropyLoss は内部で log-softmax を行うので、モデル出力はロジットのまま渡します。
softmax を付けると二重適用になり学習が崩れます。
Self-Attention のスコア shape
Q, K がともに (seq=6, d=16) のとき、Q @ K.T の shape はどれですか。
- A. (6, 6)
- B. (16, 16)
- C. (6, 16)
答えと解説を見る
正解:A. (6, 6)
(6,16)@(16,6)=(6,6)。系列の各要素どうしの関連度なので (seq, seq) です。
自動微分:x.grad はいくつ?
次のコードを実行すると、x.grad は何になりますか。
x = torch.tensor([3.0], requires_grad=True)
y = x ** 2
y.backward()
print(x.grad)
- A. tensor([3.])
- B. tensor([9.])
- C. tensor([6.])
答えと解説を見る
正解:C. tensor([6.])
y = x² の微分は dy/dx = 2x。x=3 なので 2×3 = 6。backward() がこれを x.grad に入れます(L04)。
評価関数のバグを見つける
次の評価関数には問題があります。正しくするにはどうしますか。
def evaluate(model, loader):
model.train()
correct = 0
for xb, yb in loader:
correct += (model(xb).argmax(1) == yb).sum().item()
return correct / len(loader.dataset)
- A.
model.train()をmodel.eval()にし、torch.no_grad()で囲む - B.
argmaxをsumに変える - C. 問題ない
答えと解説を見る
正解:A
評価では model.eval()(dropout/BatchNormを評価用に)+ with torch.no_grad()(勾配を止める)が定石。train() のままだと結果がブレます(L08)。
畳み込み層のパラメータ数
nn.Conv2d(3, 32, kernel_size=3) のパラメータ数(重み+バイアス)はいくつですか。
- A. 864
- B. 896
- C. 288
答えと解説を見る
正解:B. 896
(in_ch×K×K + 1)×out_ch = (3×3×3 + 1)×32 = 28×32 = 896。864 はバイアス(+1)の数え忘れ(L07)。
この MultiheadAttention は動く?
次の行を実行するとどうなりますか。
mha = nn.MultiheadAttention(embed_dim=20, num_heads=8)
- A. 正常に動く
- B. batch 次元が足りずエラー
- C.
embed_dim=20がnum_heads=8で割り切れずエラー
答えと解説を見る
正解:C
各ヘッドは embed_dim/num_heads 次元を担当するので、割り切れる必要があります。20÷8 は割り切れずエラー(L09)。
マンハッタン距離はいくつ?
次のコードの d はいくつですか。
a = np.array([1.0, 4.0, 2.0])
b = np.array([3.0, 1.0, 2.0])
d = np.abs(a - b).sum()
print(d)
- A. 5.0
- B. 7.0
- C. 3.0
答えと解説を見る
正解:A. 5.0
差は [-2, 3, 0]、絶対値は [2, 3, 0]、合計 5.0(マンハッタン距離)。ユークリッドなら √13≈3.61(L10)。
4. 力試しと次のステップ
読み解く力がついたら、次は本番形式で力試しと理論の総仕上げへ。とくに注目は、このコース直結の「コーディング特化模試」(近日公開)です。
🆕 E資格 実践模試(コーディング特化)
まさにこのコースで磨いたコード読解力を本番形式で力試し。コード問題に特化した実践模試を準備中です。shape・処理順・API を問う実戦的な問題+解説で、本番の「読んで答える」に直結します。
そのほかの学習の道も用意しています。
E資格 実践模試(100問)
本番形式の実践模試で、知識・理論の実力をチェック。数式・選択問題の解説つきで、弱点を洗い出せます(理論メインの模試)。
※ note にて販売中(有料)。
E資格対策ページ
本コースは「実装の読み解き」に特化しました。合格には線形代数・確率統計・深層学習の理論も必要です。E資格対策ページで理論を重ねれば、実装感覚と両輪がそろいます。
E資格対策を見る →Python / 機械学習コース
Python・NumPy・機械学習の基礎に不安が残るなら、土台のコースで固め直すと、この先の実装がぐっと楽になります。
✓ いずれも公開中・無料
5. 最後に
このコースで身についたこと
- NumPyで順伝播・逆伝播を実装し、自動微分の中身を理解した
- PyTorchでモデルを組み、学習ループ・正則化を読めるようになった
- CNN・RNN/LSTM・Transformer の実装と shape を追えるようになった
- シラバス範囲の機械学習(パターン認識・評価・交差検証)を動かせるようになった
- Docker・モデル軽量化・GPU/TPU の基礎を押さえた
- そして何より、コードを「読んで答える」3つの着眼点が身についた
コードが読めれば、E資格のコード問題は怖くありません。ここで身につけた感覚を、ぜひ本番でも活かしてください。お疲れさまでした!
完了するとコース一覧に進捗が記録されます