반응형
Notice
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 데이터분석
- 네트워크
- 클라우드컴퓨팅
- 데이터과학
- Yes
- 컴퓨터비전
- 사이버보안
- 웹개발
- 프로그래밍언어
- 인공지능
- 소프트웨어
- 머신러닝
- 데이터베이스
- 보안
- 컴퓨터공학
- 네트워크보안
- 코딩
- 자료구조
- 알고리즘
- 프로그래밍
- 버전관리
- 빅데이터
- I'm Sorry
- 데이터구조
- 컴퓨터과학
- 소프트웨어공학
- 딥러닝
- 자바스크립트
- 2
- 파이썬
Archives
- Today
- Total
스택큐힙리스트
IndexError: 범위를 벗어난 차원 - PyTorch의 차원은 [-1, 0] 범위 내에 있어야하지만 1이 되었습니다. 본문
카테고리 없음
IndexError: 범위를 벗어난 차원 - PyTorch의 차원은 [-1, 0] 범위 내에 있어야하지만 1이 되었습니다.
스택큐힙리스트 2024. 1. 16. 23:29반응형
따라서 x
와 z
의 차원을 tc = torch.cat([x,z], dim=1)
에서 어떻게 조정합니까?
다음과 같이 코드가 주어집니다.
import torch
from torch import nn, optim
from torch.autograd import Variable
class VRNNCell(nn.Module):
def __init__(self):
super(VRNNCell,self).__init__()
self.phi_x = nn.Sequential(nn.Embedding(128,64), nn.Linear(64,64), nn.ELU())
self.encoder = nn.Linear(128,64*2) # 출력 하이퍼파라미터
self.phi_z = nn.Sequential(nn.Linear(64,64), nn.ELU())
self.decoder = nn.Linear(128,128) # 로짓
self.prior = nn.Linear(64,64*2) # 출력 하이퍼파라미터
self.rnn = nn.GRUCell(128,64)
def forward(self, x, hidden):
x = self.phi_x(x)
# 1. h => z
z_prior = self.prior(hidden)
# 2. x + h => z
z_infer = self.encoder(torch.cat([x,hidden], dim=1))
# 샘플링
z = Variable(torch.randn(x.size(0),64))*z_infer[:,64:].exp()+z_infer[:,:64]
z = self.phi_z(z)
# 3. h + z => x
x_out = self.decoder(torch.cat([hidden, z], dim=1))
# 4. x + z => h
hidden_next = self.rnn(torch.cat([x,z], dim=1),hidden)
return x_out, hidden_next, z_prior, z_infer
def calculate_loss(self, x, hidden):
x_out, hidden_next, z_prior, z_infer = self.forward(x, hidden)
# 1. 로지스틱 회귀 손실
loss1 = nn.functional.cross_entropy(x_out, x)
# 2. 다변량 가우시안 사이의 KL 발산
mu_infer, log_sigma_infer = z_infer[:,:64], z_infer[:,64:]
mu_prior, log_sigma_prior = z_prior[:,:64], z_prior[:,64:]
loss2 = (2*(log_sigma_infer-log_sigma_prior)).exp() \
+ ((mu_infer-mu_prior)/log_sigma_prior.exp())**2 \
- 2*(log_sigma_infer-log_sigma_prior) - 1
loss2 = 0.5*loss2.sum(dim=1).mean()
return loss1, loss2, hidden_next
def generate(self, hidden=None, temperature=None):
if hidden is None:
hidden=Variable(torch.zeros(1,64))
if temperature is None:
temperature = 0.8
# 1. h => z
z_prior = self.prior(hidden)
# 샘플링
z = Variable(torch.randn(z_prior.size(0),64))*z_prior[:,64:].exp()+z_prior[:,:64]
z = self.phi_z(z)
# 2. h + z => x
x_out = self.decoder(torch.cat([hidden, z], dim=1))
# 샘플링
x_sample = x = x_out.div(temperature).exp().multinomial(1).squeeze()
x = self.phi_x(x)
# 3. x + z => h
hidden_next = self.rnn(torch.cat([x,z], dim=1),hidden)
return x_sample, hidden_next
def generate_text(self, hidden=None,temperature=None, n=100):
res = []
hidden = None
for _ in range(n):
x_sample, hidden = self.generate(hidden,temperature)
res.append(chr(x_sample.data[0]))
return .join(res)
# 테스트
net = VRNNCell()
x = Variable(torch.LongTensor([12,13,14]))
hidden = Variable(torch.rand(3,64))
output, hidden_next, z_infer, z_prior = net(x, hidden)
loss1, loss2, _ = net.calculate_loss(x, hidden)
loss1, loss2
hidden = Variable(torch.zeros(1,64))
net.generate_text()
답변 1
def generate_text(self, hidden=None,temperature=None, n=100):
res = []
hidden = None
for _ in range(n):
x_sample, hidden = self.generate(hidden,temperature)
res.append(chr(x_sample.data)) # 여기서 변경
return .join(res)
for epoch in range(max_epoch):
batch = next(g)
loss_seq = 0
loss1_seq, loss2_seq = 0, 0
optimizer.zero_grad()
for x in batch:
loss1, loss2, hidden = net.calculate_loss(Variable(x),hidden)
loss1_seq += loss1.data # 여기서 변경
loss2_seq += loss2.data # 여기서 변경
loss_seq = loss_seq + loss1+loss2
loss_seq.backward()
optimizer.step()
hidden.detach_()
if epoch%100==0:
print('>> epoch {}, loss {:12.4f}, decoder loss {:12.4f}, latent loss {:12.4f}'.format(epoch, loss_seq.data, loss1_seq, loss2_seq)) # 여기서 변경
print(net.generate_text())
print()
참고: 이러한 변경 사항 후에는 PyTorch v1.7.1
에서 오류 없이 제 컴퓨터에서 학습 루프가 실행됩니다. 변경 사항을 이해하려면 # 여기에서 변경됨
주석을 살펴보세요.
답변 2
인덱스 오류: 차원이 범위를 벗어났습니다 - PyTorch의 차원은 [-1, 0] 범위에 있어야하지만 1이 주어졌습니다. 이 주제에 대해 SEO에 유의한 한국어 에세이를 작성해주세요.포기하지 마십시오. 컴퓨터 프로그래밍이라는 분야는 복잡할 수 있습니다. 그러나 중요한 것은 오류가 발생했을 때 포기하지 않고 문제에 대해 노력하는 것입니다. 오류 메시지는 때로는 당황스럽게 만들 수 있지만, 지금 저희는 차원과 인덱스 오류에 관해 살펴보고 해결하는 방법에 대해 알아볼 것입니다.
PyTorch는 딥러닝을 위한 고성능 오픈소스 기계 학습 라이브러리입니다. 텐서라는 다차원 배열을 다루는 데 사용됩니다. 이러한 텐서의 차원은 0부터 시작하여 -1로 표시되는 마지막 차원까지의 정수 값을 가집니다.
따라서, 인덱스 오류: 차원이 범위를 벗어났습니다라는 오류 메시지는 차원의 인덱스 값이 허용 범위인 [-1, 0]을 벗어났음을 나타냅니다. 일반적으로 이 오류는 텐서의 차원을 잘못 이해하거나 잘못 사용한 결과입니다.
해결 방법은 두 가지입니다. 첫 번째는 텐서의 차원을 이해하고 유효한 인덱스 값을 사용하는 것입니다. 예를 들어, 3차원 텐서의 첫 번째 차원에 접근하려면 인덱스 0을 사용해야 합니다. 또한 마지막 차원에 접근하려면 -1을 사용해야 합니다.
두 번째로는 텐서의 차원을 변경하여 원하는 작업을 수행하는 것입니다. 차원을 변경하는 방법은 여러 가지가 있습니다. 예를 들어, squeeze() 함수를 사용하여 크기가 1인 차원을 제거할 수 있습니다. unsqueeze() 함수를 사용하여 차원을 추가할 수도 있습니다.
문제 해결을 위해 공식 문서, 온라인 커뮤니티 및 포럼에서 도움을 받을 수도 있습니다. 어려운 문제는 개인적으로 해결하기가 어려울 수 있으므로 도움이 필요할 경우 검색을 통해 정보를 찾는 것이 가장 좋습니다.
복잡한 기술적인 주제를 다루는 에세이인 만큼, 키워드 최적화에 관심을 두어야 합니다. 이는 인터넷 검색 엔진에서 노출되기 위해 중요합니다. 예를 들어, PyTorch 차원 오류 해결 방법이나 PyTorch 인덱스 오류 해결과 같은 키워드를 포함할 수 있습니다. 이렇게 함으로써 해당 주제에 대해 더 많은 사람들이 접근할 수 있게 될 것입니다.
프로그래밍은 도전적이고 종종 복잡한 작업입니다. 그러나 오류와 마주치는 것은 자연스러운 일입니다. 실패를 두려워하지 마시고 문제 해결에 도전하는 태도를 갖는다면 성공할 수 있을 것입니다. 오류 해결은 더 큰 진전을 이끌고 새로운 기술적인 이해를 얻게 해줄 것입니다.
반응형
Comments