1
1. テンソル形状 [Batch, C, H, W] リアルタイム解剖器
プリセット:
torch.Size([
16,
3,
512,
512
])
総要素数: 12,582,912 個
GPUメモリ占有: 48.0 MB (FP32)
並列コア要求: 16 並列束
テンソル形状の設計理由:
縦 512 × 横 512 の画素グリッドに、赤・緑・青の 3 枚の色プレーンが重なり、それを GPU の数千コアで一斉計算するために 16 枚ひとかたまり(バッチ)にして VRAM に送っています。
2
2. PyTorch 学習ループ「主要5行」ステップ実行器
1optimizer.zero_grad()
2outputs = model(inputs)
3loss = criterion(outputs, targets)
4loss.backward()
5optimizer.step()
【処理内容】 全パラメータの勾配バッファ(`.grad`)を `0` に初期化します。
PyTorch は勾配を加算(`+=`)して累積する仕様のため、毎イテレーションで初期化を行わないと前バッチの勾配が累積し続け、数値不安定の原因となります。
3
3. 損失関数の探索 3D 立体シミュレータ(SGD vs Momentum vs AdamW)
マウスで 360度ドラッグ回転&ホイールズーム が可能な 3D 損失関数地形(ワイヤーフレーム曲面)です。
急勾配、鞍点(サドルポイント)、そして 大域的最小値(谷底) の 3次元空間を 3 つの球体がシミュレーションで滑走します。
● SGD (単純勾配降下)
Step: 0
Loss: 4.250
鞍点の平坦部で勾配が消滅し停滞
● Momentum (慣性付き)
Step: 0
Loss: 4.250
慣性項により停留点を通過するが振動傾向が生じる
● AdamW (適応学習率+減衰)
Step: 0
Loss: 4.250
急勾配・平坦部を適応的に補正し大域的最小値への収束を支援
マウス操作: 左ドラッグで 360° 回転 / ホイールで拡大縮小 / 右ドラッグで平行移動
4
4. 畳み込み演算(Conv2d)の空間フィルタ・メカニズム
水色の 3×3 カーネルが 5×5 画像上をスライドし、受容野内の内積(掛け算の合計)を計算して出力特徴マップを生成します。
5
5. 波長間 Self-Attention(OptiScan-HSI の核心技術)
基準となる波長をクリックすると、Transformer がどの波長との関係性(Softmax QKᵀ/√d)に自己注意を向けているかが分かります。
● 450nm (青色可視光)
● 550nm (緑色可視光)
● 700nm (赤色・クロロフィル)
● 940nm (近赤外線・樹脂吸収)
Attention Matrix (4×4)
450nm は 700nm と 940nm の両方に強いアテンション(注意重み)を向けて異物判定しています。
6
6. MediSeg-AI & Biohub: なぜスキップ接続がないと微細輪郭が消えるのか?
U-Net の構造は、左側のエンコーダ(特徴抽出・圧縮)で画像サイズを小さくする過程で、物体の「意味」は抽出できますが「正確な座標・ピクセル境界」が消失します。
中央を横切る スキップ接続(torch.cat) が、エンコーダの浅い層で持っていた高解像度エッジ情報をデコーダに直接バイパスすることで、境界の復元が可能になります。
スキップ接続(torch.cat)の動作切替
【スキップ接続 ON の効果】
エンコーダの浅い層が捉えた「細い血管網」や「腫瘍のギザギザした境界」の生座標が、そのままデコーダに結合(`torch.cat`)されます。ダウンサンプリングによる位置情報の損失を抑え、微小病変の境界を復元します(Diceスコア: 0.924)。
スキップ接続あり (U-Net)
Dice: 0.924 (高精度)
スキップ接続なし (劣悪)
Dice: 0.612 (境界崩壊)
7
7. モジュール別:入出力テンソル形状・損失関数・実装例
目的に応じて、PyTorchコードの生成に適したプロンプトを構築します
8
8. PyTorch 実行環境で遭遇しやすいエラーと対処コード例
1. RuntimeError: CUDA out of memory (GPU メモリ枯渇)
▼ 開く
【原因】 バッチサイズが大きすぎる、または計算グラフがメモリに蓄積されている。
【対処コード例】
# 1. 混合精度学習 (AMP) で VRAM 使用量を半減
scaler = torch.cuda.amp.GradScaler()
with torch.cuda.amp.autocast():
outputs = model(inputs)
loss = criterion(outputs, targets)
# 2. バッチサイズを半分にし、勾配累積 (Gradient Accumulation) で補う
loss = loss / 2
scaler.scale(loss).backward()
if (step + 1) % 2 == 0:
scaler.step(optimizer)
scaler.update()
optimizer.zero_grad()
2. RuntimeError: Expected all tensors to be on the same device...
▼ 開く
【原因】 モデルが GPU 上にあるのに、入力データ(またはラベル)が CPU 上に残っている。
【対処コード例】
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)
for images, labels in dataloader:
# モデルとデータを同一の演算デバイス(GPU / CPU)へ転送
images = images.to(device)
labels = labels.to(device)
3. Loss is NaN (損失が非数・数値不安定)
▼ 開く
【原因】 学習率(lr)の設定が過大であるか、勾配爆発が発生している。
【対処コード例】
# 1. 勾配クリッピング (Gradient Clipping) を backward の直後に入れる
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
optimizer.step()
# 2. 学習率を調整する (例: 1e-3 ➔ 1e-4)
9
9. 静的エラーを出さずに評価精度や動作を阻害する代表的な不具合パターンの検出
Q1. 以下の検証ループコードには、不具合が 1 箇所あります。どこでしょう?
def validate(model, val_loader):
model.eval()
total_loss = 0
for images, labels in val_loader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
loss = criterion(outputs, labels)
total_loss += loss.item()
return total_loss / len(val_loader)
Q2. 医用画像や工場の複数ロットデータを交差検証(K-Fold)する際、配慮すべき「データ漏洩(Data Leakage)」はどれ?
# 通常のKFoldを使用
kf = KFold(n_splits=5, shuffle=True, random_state=42)
for train_idx, val_idx in kf.split(dataset):
# 同一患者・同一製品の異なる断面スライスが学習と検証に混在
Q3. 画像の軸を変換する際、以下のどちらが適切でしょうか?(RGB画像のチャンネル位置変更)
# 目的: [Batch, Height, Width, Channel] から PyTorch標準の [Batch, Channel, Height, Width] に並べ替えたい
パターンA: x = x.view(B, C, H, W)
パターンB: x = x.permute(0, 3, 1, 2)
Q4. 背景(99%)と病変(1%)の極端な不均衡データで CrossEntropyLoss をそのまま使うと何が起きる?
# 陽性(病変)が 1%、陰性(背景)が 99% のセグメンテーション
criterion = nn.CrossEntropyLoss()
# 不均衡データでは「すべて背景」と予測しても見かけ上の正解率が高くなってしまう
Q5. PyTorch で学習ループを回す際、optimizer.zero_grad() を書き忘れた場合、どうなるでしょうか?
for images, targets in train_loader:
# optimizer.zero_grad() が欠落している例
outputs = model(images)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()