본문으로 건너뛰기

M11.02 · 텐서·Dataset·DataLoader·모델 저장

단위별 목표·권장 선수와 자료 준비 상태를 확인하고, 공개된 본문과 활동을 읽고 준비 상태를 확인할 수 있습니다.

전체 커리큘럼

학습 안내

본문을 읽고 장비 없는 기본 실습·세 확인 문제와 해설로 이해를 확인하세요.

예상 학습 시간: 미정. 이 페이지 방문이나 자료 열람으로 완료·숙달을 자동 부여하지 않습니다.

현재 경로·이전·다음 단위 확인 ↓

학습 목표

  • 텐서의 shape·dtype·device와 축 의미를 해석하고 reshape와 축 교환의 차이를 설명한다.
  • 입력/목표가 짝인 Dataset과 DataLoader의 마지막 배치를 계산하고 표본 수에 맞는 손실 평균을 구한다.
  • state_dict 저장/로드 결과를 확인하고 구조·전처리·학습 재개에 필요한 별도 기록을 제안한다.

아래 설명·실습·문제로 각 학습 목표를 확인하세요.

권장 선수

M01의 Python/배열과 M11.01의 모형/손실이 선수다. 기본은 작은 합성 배열·배치의 종이 계산이며, 이미 PyTorch가 있는 경우 완전한 CPU 코드를 선택 실행할 수 있다. GPU나 외부 데이터 다운로드는 필요하지 않다. 이미 알고 있다면 직접 열어볼 수 있습니다.

설명 필수

세 목표에 대응하는 검수된 설명·예제를 읽습니다.

모양은 계약의 일부다

텐서는 수치를 여러 축으로 배치한 자료다. shape는 축마다 원소가 몇 개인지, dtype은 수치 저장 형식, device는 CPU 등 어느 장치에 있는지를 나타낸다. shape=(3,2)는 세 표본에 특징 둘일 수도 있고 세 행/두 열 이미지일 수도 있다. 텐서 자체가 첫 축을 표본이라고 알아내지는 않으므로 각 축의 의미를 문서화한다. 같은 숫자/shape라도 단위와 정규화가 다르면 다른 입력이다.

합성 특징 세 쌍을 [[1,2],[3,4],[5,6]]으로 두자. 첫 축은 표본, 둘째는 [left,right] 순서의 무차원 정규화 특징이다. float32는 원소당 4 byte이므로 원소 6개의 수치 저장량은 24 byte다. Python 객체/allocator·모형·중간 결과 등의 메모리는 포함하지 않았다. 이것만 보고 전체 추론 메모리를 24 byte라고 보고하면 틀리다.

reshape는 원소 수가 맞는 새 모양으로 재배치하는 연산이지 축 의미를 자동 교환하는 연산이 아니다. 독립된 예로 [[1,2,3],[4,5,6]]을 (3,2)로 reshape하면 [[1,2],[3,4],[5,6]]이지만 전치는 [[1,4],[2,5],[3,6]]이다. 원소 수와 최종 shape가 같아도 대응이 다르다. 영상의 HWC를 CHW로 바꿀 때도 단순 reshape만으로 채널/위치가 바르게 옮겨졌다고 보지 않는다. H/W는 행/열, C는 채널이라는 약속이다.

브로드캐스팅도 조용한 오류를 만들 수 있다. 회귀 출력 (B,1)과 목표 (B,)를 바로 빼면 예상한 B개 오차 대신 축 정렬 규칙에 따라 (B,B)가 될 수 있다. B는 배치 표본 수다. shape를 눈으로 확인하고 의미에 맞게 맞춘다. dtype/device도 연산과 손실이 요구하는 계약을 따른다. 분류의 클래스 번호와 회귀의 실수 목표를 같은 형식이라고 가정하지 않는다. 공식 텐서 설명이 기본 속성을 보충한다.

표본을 읽는 책임과 묶는 책임

이번 map-style Dataset은 인덱스에 해당하는 입력/목표 쌍을 반환하고 전체 길이를 제공한다. 사용자 정의 구현에서는 __getitem__과 __len__이 이 역할을 맡는다. TensorDataset은 같은 첫 축의 텐서들을 묶어 이 계약을 제공하는 편리한 구현이다. 입력과 목표를 따로 섞지 말고 같은 인덱스로 함께 읽는다. 무작위 shuffle은 틀린 라벨 대응이나 시간 정렬을 고치는 기능이 아니다.

DataLoader는 표본을 어떤 순서로 읽고 batch로 묶을지 정한다. 자료 세 개에 batch_size=2, shuffle=False, drop_last=False라면 첫 배치는 입력(2,2)/목표(2,1), 마지막은 입력(1,2)/목표(1,1)이다. 마지막 크기가 2라고 하드코딩한 reshape는 실패할 수 있다. drop_last=True이면 마지막 표본이 빠지므로 학습/평가에서 그 의미를 확인한다. num_workers=0은 이 작은 선택 예제에서 현재 프로세스로 읽게 한 설정이며 모든 작업의 최적 성능 설정은 아니다.

평가 손실을 합칠 때도 표본 수를 고려한다. 표본별 손실이 [1,1,9]이면 두 배치 평균은 1/9다. 이를 단순 평균하면 5지만 전체 표본 평균은(1+1+9)/3=11/3≈3.6667이다. 배치 평균에 각 배치 표본 수를 곱해 더한 뒤 총 표본 수로 나누어야 한다. 출력 차원과 손실 reduction이 다르면 무엇을 평균하는지도 명시한다. 이 예는 표본당 스칼라 손실 하나다.

저장된 숫자가 전체 모형은 아니다

state_dict는 파라미터와 등록된 buffer 등 모듈 상태의 이름→텐서 대응이다. 그것을 저장했다고 클래스의 구조·입력 특징 순서·단위·정규화·클래스 이름까지 자동 보존되는 것은 아니다. 동일한 구조를 먼저 만들고 호환되는 상태를 로드해야 한다. 키/shape가 맞아 로드가 성공해도 의미가 맞는지는 별도다.

가상 모형 y=1×left+2×right에 첫 표본[1,2]를 넣으면 5다. 특징 순서를[right,left]로 바꾸고 같은 가중치를 쓰면 4다. shape=(1,2)는 같아도 의미가 바뀌었다. 정규화 평균/표준편차, 영상 색 순서/크기, 목표의 역정규화와 단위를 함께 보존한다. 정규화 통계는 M11.03의 분할 정책에 맞춰 정하고 시험 자료로 다시 맞추지 않는다.

추론에는 eval 모드와 경사 계산 비활성화를 구별한다. eval은 Dropout/BatchNorm 같은 층의 동작을 평가 방식으로 바꾸며 경사 추적을 자동으로 끄지는 않는다. inference_mode/no_grad는 경사 추적과 관련된 별도 설정이다. 이 단순 Linear에는 해당 층이 없지만 실제 모형의 습관을 위해 두 책임을 구분한다. 공식 저장/로드 설명과 함께 구조/입력 계약을 확인한다.

학습 재개는 추론용 가중치 로드보다 더 많은 상태가 필요할 수 있다. optimizer/scheduler와 진행 단계, 데이터 분할/순서·무작위 상태·버전/설정을 기록해야 같은 단계에서 이어 갔다고 비교할 수 있다. 이번 코드는 학습 재개 구현이 아니며 외부 파일을 읽지 않고 직접 만든 상태를 메모리에서 왕복한다. weights_only=True는 가중치 로딩 범위를 제한하지만 임의 외부 파일의 의미/출처 검증까지 대신하지 않는다.

선택 CPU 코드로 형식과 왕복을 확인한다

다음 완전 예제는 작성 시 Darwin/PyTorch 2.13.0 CPU에서 실제 실행했다. 가중치를 손으로[1,2]로 설정하며 학습으로 성능을 얻었다는 예가 아니다. BytesIO는 메모리의 바이트 버퍼다. 디스크 체크포인트 파일이나 모델 구조/전처리 manifest를 생성했다고 주장하지 않는다. 기본 활동은 아래 출력에 해당하는 종이 계산으로 수행할 수 있다.

import io
import torch
from torch.utils.data import TensorDataset, DataLoader

x = torch.tensor([[1., 2.], [3., 4.], [5., 6.]], dtype=torch.float32)
y = torch.tensor([[5.], [11.], [17.]], dtype=torch.float32)
loader = DataLoader(TensorDataset(x, y), batch_size=2,
                    shuffle=False, drop_last=False, num_workers=0)
model = torch.nn.Linear(2, 1, bias=False)
with torch.no_grad():
    model.weight.copy_(torch.tensor([[1., 2.]]))
for xb, yb in loader:
    with torch.no_grad():
        print(tuple(xb.shape), tuple(yb.shape), model(xb).flatten().tolist())
buffer = io.BytesIO()
torch.save(model.state_dict(), buffer)
buffer.seek(0)
restored = torch.nn.Linear(2, 1, bias=False)
restored.load_state_dict(torch.load(buffer, map_location="cpu", weights_only=True))
restored.eval()
with torch.inference_mode():
    print("reload_equal", torch.allclose(model(x), restored(x)))
print("x_bytes", x.numel() * x.element_size())
(2, 2) (2, 1) [5.0, 11.0]
(1, 2) (1, 1) [17.0]
reload_equal True
x_bytes 24

reload_equal은 이 입력/허용치의 수치 비교일 뿐 원시 바이트 전체가 같거나 다른 환경에서 작업이 성공했다는 뜻은 아니다. 기존 5.5 정규화·행동 표현의 state/action 통계·표현도 가중치와 함께 관리한다.

관련 기존 자료 · 보충해서 읽기

  • 기존 상세 본문 · 관련 기존 자료 · 보충 참고

    5.3 LeRobotDataset v3 설계

    목표 일부 관련

    기존 자료의 관련 범위이며 신규 목표 전체의 품질 검수는 아직 진행하지 않았습니다.

  • 기존 상세 본문 · 관련 기존 자료 · 보충 참고

    5.8 학습 파이프라인

    목표 일부 관련

    기존 자료의 관련 범위이며 신규 목표 전체의 품질 검수는 아직 진행하지 않았습니다.

학습 범위와 한계

기본 설명·예제가 준비되었습니다. 기존 보충 자료의 범위와 구별하세요.

실습 필수

장비 없는 실습을 수행하고 관찰·계산 근거를 해설과 비교합니다.

입력은 세 특징/목표 쌍과 위 모형, 배치 크기 2다. 별도의 표본별 손실[1,1,9]는 실제 코드에서 얻은 것이 아닌 평균 계산용 합성값이다.

  1. x의 shape/축 의미/float32 수치 바이트를 구한다. reshape와 전치의 독립 예를 비교하고 특징 순서 변경을 검사한다.
  2. 두 배치의 입력/목표 shape와 예측값을 구한다. 손실의 배치 단순 평균과 표본 평균이 왜 다른지 계산한다.
  3. 상태를 저장/로드해 같은 예측을 얻어도 빠질 수 있는 구조/전처리·재개 기록을 제안한다. 코드 실행 또는 종이 계산의 범위를 표시한다.

관찰은 텐서 계약·배치 계산·저장 계약으로 나눈다. 막히면 마지막 배치 표본 수를 먼저 세고 입력/목표를 같은 표본 번호로 짝지어 본다. 설치나 파일 다운로드는 필요하지 않다.

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

학습 범위와 한계

기본 실습은 장비 없이 수행합니다. 실제 장비·GPU 실증을 완료했다는 뜻은 아닙니다.

평가·해설 필수

목표별 세 서술문항에 답하고 해설·판정 기준으로 자기검토합니다.

확인 문제 Q1

[[1,2,3],[4,5,6]]의 원소 수는 얼마인가? (3,2) reshape와 전치의 값은 같은가? shape가 같아도 입력 의미가 달라질 수 있는 예를 설명하라.

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

확인 문제 Q2

표본 5개를 batch_size=2/drop_last=False로 읽으면 배치 크기는 무엇인가? 표본당 손실[1,1,1,1,9]의 전체 평균과 세 배치 평균의 단순 평균을 구하라.

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

확인 문제 Q3

state_dict를 같은 Linear 구조에 정상 로드했지만 입력 특징 순서와 정규화 통계가 기록되지 않았다. 추론 계약이 재현됐다고 할 수 있는가? 학습 재개와 평가 모드에 필요한 추가 사항도 설명하라.

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

학습 범위와 한계

서술답안과 해설이 준비되었습니다. 자기검토와 학습 완료는 숙달 인증과 별개입니다.

참고 자료

학습 확인

실습과 세 문항의 답안을 해설과 비교한 뒤, 이 단위의 학습 완료를 직접 기록할 수 있습니다. 자기검토·학습 완료는 자동 채점이나 숙달 인증과 별개입니다.

실습1개·확인 문제3개의 답안을 저장하고 각각 자기검토를 기록하세요.

학습 이동

학습 단계 순서 · 공통 과정 이후 전문화 선택

전체 목차로 돌아가기 →

신규 활동의 답안은 이 브라우저의 통합 학습 기록에 저장합니다. 기존 화면의 답안·진도는 원래 키를 유지합니다. AI 강사는 현재 단위의 준비 상태·부족한 범위와 연결된 실제 자료를 참고합니다.