작성
·
160
0
#next(iter(cnd_ds))
images_batch = next(iter(cnd_ds))[0]
labels_batch = next(iter(cnd_ds))[1]
print(images_batch.shape, labels_batch.shape)
print(images_batch[0])
안녕하세요. 제가 파이썬 문법에 많이 약해서 헷갈리는 부분이 있어서 질문을 드립니다. 혹시 시퀀스 데이터셋에서 iterator로 만든 후 next를 호출해서 각각 0번 1번 인덱스로 호출을 하는데, 궁금한 점이 image_batch = next(iter(cnd_ds))[0]를 실행하면 내부적으로 cnd_ds에 대한 iterator가 옮겨져서 다음에 labels_batch 라인을 호출할 때는 다음 배치 64개의 label이 호출될 줄 알았는데 선생님이 의도하시던대로 잘 되어서 궁금했습니다
전에 사용하던 ImageDataGenerator에서는 지금 사용하는 앞에서 묶는 것이 아니라 따로 .next() 함수가 있던데 서로 다른 개념일까요?
답변 3
1
질문을 제가 잘 이해했는지 모르겠지만,
next(iter(cnd_ds)) 를 하게 되면 __getitem__()에서 image 배치 array와 label 배치 array를 tuple 형태로 한번에 반환하게 됩니다. 그러니까, image_array, label_array = next(iter(cnd_ds)) 가 됩니다.
즉 next(iter(cnd_ds))[0]은 image_array가 되고, next(iter_cnd_ds))[1]은 label_array가 됩니다.
그리고 질문하신,
전에 사용하던 ImageDataGenerator에서는 지금 사용하는 앞에서 묶는 것이 아니라 따로 .next() 함수가 있던데 서로 다른 개념일까요?
=> 동일한 개념입니다.
0
아, 만약에 iterator 변수로 아예 선언하면 달라지는 것이었습니다
이렇게 되면 images와 labels가 순서 쌍이 맞지 않을텐데, 선생님이 적어주신 것이랑 같은 줄 알고 헷갈렸었습니다
cnd_iter = iter(cnd_ds)
images_batch = next(cnd_iter)[0]
labels_batch = next(cnd_iter)[1]
print(images_batch.shape, labels_batch.shape)
print(images_batch[0])
0