Lesson 1 / 12

E資格コード問題の解き方とコースの使い方

このレッスンで学ぶこと

  • E資格のコード問題が「書く」より「読んで答える」形式だと理解する
  • コードを読むときの3つの着眼点(shape・処理の順序・APIの意味)を持つ
  • コードの理解を問う問題の一般的な形式を知る
  • 本コースの進め方(PyTorchは読む/NumPy・scikit-learnは動かす)が分かる
  • テンソルの形(shape)を追う習慣を身につける

1. このコースがめざすこと

このコースは、E資格の「コード問題(プログラミング問題)」に向けた実装の対策です。 E資格は選択式の試験で、コードをゼロから書かせるのではなく、 提示されたコードを読んで「この出力は?」「正しい行はどれ?」「空欄に入るのは?」を選ばせる形式が中心です。

つまり必要なのは、コードを正確に「読み解く」力。 このコースでは PyTorch を軸に、深層学習の実装コードを1行ずつ追いながら、 各レッスンの最後に練習問題で「読めているか」を点検します。 手を動かして動作を確かめられる箇所(NumPy・scikit-learn)は、実際に実行しながら理解を深めます。

理論の確認: 本コースは実装(コード)に集中します。畳み込み・誤差逆伝播・Attention といった理論そのものの解説は、 当サイトの E資格対策ページ に譲ります。 「理論は分かるが、コードにすると手が止まる」——その隙間を埋めるのがこのコースの役割です。

2. このコースの進め方(重要)

このコースには2種類のコードが登場します。見た目で区別できるようにしておきましょう。

たとえば、次は読み取り専用のPyTorchコードです(実行ボタンが無いことに注目)。

read_only_sample.py(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.tensortorch.randn や数学関数)。 import torch.nn as nnニューラルネットの部品箱で、層(nn.Linearnn.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層重ねたモデル(多層パーセプトロン)の例です。

two_layer.py(PyTorch・読むだけ)
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で実コードとともに深掘りします)。

train_step.py(PyTorch・読むだけ)
# 学習ループの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)78410 は「入力784・出力10」。 nn.Conv2d(3, 16, 3) なら「入力3チャネル(カラー画像)→ 出力16チャネル、3×3のカーネル」。 引数の順番と意味を覚えておくと、コードを見た瞬間に形の変化を追えます(Conv2d の出力サイズ H' の計算は L07 で詳しく扱います)。

4. コードの理解を問う問題の形式(一般)

「コードを読んで答える」問題は、一般に次のような形を取ります(本コースの練習問題もこの形式です)。 なお、実際の試験で何がどう出題されるかは公表されていません。ここでは、コードを理解できているかを確かめる一般的な問い方として整理します。

💡 読み方の軸: こうした問いに答えるうえで、前章の3つの着眼点(shape・処理の順序・API)が役立ちます。 毎回この3つをことばにして追う習慣をつけましょう。

5. なぜ PyTorch を選ぶのか

深層学習の実装で広く使われるライブラリには PyTorch と TensorFlow があります。 本コースは、そのうち代表的な PyTorch に統一します。理由は次のとおりです。

なお、本コースで学ぶ「考え方」(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. 練習問題

コードと出力を読んで答えを選び、「答えと解説を見る」で確認しましょう。

問題 1

出力の shape はどれ?

次のコードで out.shape はどうなりますか。

quiz_1.py
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) です。 全結合層は最後の次元(特徴)だけを変える、と覚えましょう。

問題 2

学習ループの正しい順序は?

学習の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() しても更新する勾配がありません。

問題 3

このコース内で「実行できる」のはどれ?

次のうち、このコースのブラウザ上で実際に「▶ 実行」して動かせるコードはどれですか(複数可)。

  • 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)」の区別を覚えておきましょう。

問題 4

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)は変わりません。 形を変えるのは LinearConv2dview/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で「順伝播」を自分の手で組み、 ニューラルネットの中身を体で理解しましょう。

完了するとコース一覧に進捗が記録されます