[파이토치 (PyTorch)] IndexError: invalid index of a 0-dim tensor. Use tensor.item() to convert a 0-dim tensor to a Python number

 

0.5 이전 버전의 파이토치에서 작성된 코드를 0.5 이후 버전에서 돌리다 보면 위와 같은 에러가 날 때가 있습니다. 파이토치의 데이터 자료 구조가 바뀌어서 그렇습니다.

 

코드에서 변수.data[0] 인 부분을 변수.data 로 바꾸어주시면 해결됩니다.

 

참고한 곳: https://github.com/NVIDIA/flownet2-pytorch/issues/113#issuecomment-450802359

  1. 영상을압축하자 2022.01.13 18:22 신고

    감사합니다 덕분에 문제를 해결하였습니다.

  2. khojun611 2022.01.17 14:29

    감사합니다.. 덕분에 해결됐네요

  3. 연습중 2022.02.09 14:27

    너무 감사드립니다. a.i 관련 깃헙소스로 테스트하고 있는데
    ai도 모르고 파이썬도 잘 몰라서 헤맸는데 덕분에 해결되었어요

    • 크롬망간 2022.02.12 01:30 신고

      도움이 되었다니 기쁘네요 ^^ 댓글 남겨주셔서 감사합니다 ^^

[토치 (Torch)] error: more than one operator "==" matches these operands

 

Lua 기반의 딥 러닝 프레임워크인 토치(Torch)를 빌드하다 보면 error: more than one operator "==" matches these operands 와 같은 에러 메시지가 뜰 때가 있습니다. 이 현상은 CUDA가 9.0 버전에서부터 절반 정확도의 부동 소수점 연산을 지원하면서 생기는 문제입니다. 이럴 때에는 빌드 전에 다음과 같이 환경 변수를 추가로 지정해주면 됩니다.

 

export TORCH_NVCC_FLAGS="-D__CUDA_NO_HALF_OPERATORS__"

 

이 글을 쓸 때에 https://github.com/torch/torch7/issues/1086 를 참조하였습니다.

[쿠다] CUDA, CUDNN 설치 여부 및 버전 확인

 

 

1. CUDA

 

nvcc --version

--

< 결과 >

nvcc: NVIDIA (R) Cuda compiler driver

Copyright (c) 2005-2016 NVIDIA Corporation

Built on Tue_Jan_10_13:22:03_CST_2017

Cuda compilation tools, release 8.0, V8.0.61

 

 

2. CUDNN

 

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

--

< 결과 >

#define CUDNN_MAJOR      5

#define CUDNN_MINOR      1

#define CUDNN_PATCHLEVEL 10

--

#define CUDNN_VERSION    (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

 

#include "driver_types.h"

 

 

참고한 사이트:

https://stackoverflow.com/questions/9727688/how-to-get-the-cuda-version

https://stackoverflow.com/questions/31326015/how-to-verify-cudnn-installation

딥 러닝 도구인 Caffe를 사용하면서 batch_size, max_iter, test_iter, epoch 등의 용어를 이해하는 것이 힘들었어서 이렇게 기록으로 남깁니다. 설명을 쉽게 하기 위해 사진을 Caffe로 처리하는 경우를 가정해 보도록 하겠습니다.

 

1. batch_size

배치(batch)는 한 번에 처리하는 사진의 장 수를 말합니다. Caffe에서 기본으로 제공되는 cifar10 예제의 cifar10_full_train_test.prototxt 파일을 열어보면 batch_size: 100 이라는 부분이 있습니다. 한 번에 100장의 사진을 처리한다는 의미입니다.

 

2. max_iter

반복(이터레이션, iteration)은 몇 개의 배치(batch)를 사용할 것인지를 의미합니다. max_iter는 기계 학습(머신 러닝)의 학습(training) 과정에서 반복을 몇 번 할 것인지를 정해줍니다. cifar10 예제의 cifar10_full_solver.prototxt 파일에 max_iter: 60000 이라고 되어 있는데, batch_size:100 이기 때문에 학습을 한 번에 사진 100장씩 60,000번 하겠다는 말이 됩니다. 총 사진 6,000,000장으로 학습이 이루어질 것입니다. 이 과정에서 사진이 중복될 수 있는데, 그에 대해서는 아래의 세대(이폭, epoch) 에서 설명하겠습니다.

 

3. test_iter

학습을 했으면 실전에 사용해 보아야 합니다. 예제에서 역시 batch_size:100 으로 되어 있습니다. test_iter:100 으로 설정되어 있는데, 그 말은 한 번에 사진 100장 씩 100번, 총 10,000장의 사진으로 학습 결과를 검사해 보겠다는 뜻입니다.

 

4. epoch

학습용 사진 전체를 딱 한 번 사용했을 때 한 세대(이폭, epoch)이 지나갔다고 말합니다. cifar10의 경우 사진 60,000장 중 50,000장이 학습용, 10,000장이 검사용으로 지정되어 있습니다. 그런데 max_iter에서 학습에 사진 6,000,000장을 사용하기로 했기 때문에 50,000장의 학습용 사진이 여러번 재사용되게 됩니다. 정확히 계산해보면 6,000,000 / 50,000 = 120 이니 한 사진이 120번 씩 재사용될 것입니다. 이 경우 120 세대(epoch)라고 말합니다. 검사용의 경우 사진 10,000장을 사용하기로 했는데 실제로도 사진이 10,000장 있으니 딱 한 세대만 있는 것입니다.

 

( 도움을 얻은 곳: https://groups.google.com/forum/#!topic/caffe-users/mUIi42aKWHQ )

 

  1. caffe초보 2017.01.20 00:29

    감사합니다. 크로뮴망가니즈 님..^^

  2. PARANG 2017.04.29 14:42

    궁금했던 차에 도움 받고 갑니다. 감사합니다!^^

  3. ShinSeungIl 2017.06.30 11:29

    안녕하세요, 용어 정리가 이해하기 쉽게 잘 되어 있어서 보다가 궁금한게 있어서 질문 드립니다.
    test_iter가 100일 때, batch size : 100장씩 100번, 총 10,000장의 사진으로 훈련 결과를 검사해보겠다고 쓰여져 있는데
    한번에 10,000장의 이미지를 검사하지 않고 굳이 100번에 걸쳐 검사하는 이유가 단순히 메모리 문제 때문인가요? 아님 다른 특별한 이유가 있는 것 인가요?

    • 크롬망간 2017.07.04 12:33 신고

      안녕하세요? test_iter의 경우 순전히 메모리와 속도 때문에 말씀하신 대로 하는 것이 맞습니다. 예제에서는 제가 100이라고 써 놓았는데, 실제로는 효율적인 메모리 사용을 위해 32, 64, 128, 256등 2의 배수를 주로 사용합니다.

      학습 과정에서는 배치의 크기가 학습 결과에 미미한 영향을 미칠 수 있다고 합니다. 한 장씩 학습하는게 결과가 제일 좋다고는 하는데 차이가 미미하고 속도 문제도 있고 해서 역시 보통 32, 64, 128, 256 정도의 배치 크기를 사용합니다. 하지만 512나 1024같이 너무 큰 배치 크기는 사용하지 않는 것 같습니다.

  4. naaam 2017.09.17 08:43

    감사해요. 쉽게 복습이 되었네요^^

  5. 익명 2018.09.11 21:18

    비밀댓글입니다

+ Recent posts