ValueError: too many dimensions ‘str‘

torchtext 를 사용 하여 미리 처 리 된 텍스트 csv 파일 을 읽 을 때 오류 가 발생 했 습 니 다.이것 은 제 코드 입 니 다.
import torch
import torch.nn as nn
import torch.utils.data as Data
from torchtext import data

if __name__ == "__main__":
    mytokenize = lambda x : x.split()   # str -> list[str]

    #        
    TEXT = data.Field(
        sequential=True, #       
        tokenize=mytokenize, #     
        include_lengths=True,
        use_vocab=True,  #     
        batch_first=True,   #    
        fix_length=200  #   
    )

    LABEL  =data.Field(
        sequential=True,
        use_vocab=False,
        pad_token=None,
        unk_token=None
    )

    #       
    train_test_fields = [
        ("text", TEXT),
        ("label", LABEL)
    ]

    #     
    traindata, testdata = data.TabularDataset.splits(
        path="./data", format="csv",    #       
        train="imdb_train.csv", test="imdb_test.csv",
        fields=train_test_fields,
        skip_header=True
    )

    ex0 = traindata.examples[0]
    print(ex0.label)

    train_data, val_data  = traindata.split(split_ratio=0.7)

    #           
    TEXT.build_vocab(train_data, max_size=20000)
    LABEL.build_vocab(train_data)
    #       10    
    print(TEXT.vocab.freqs.most_common(n=10))
    print(TEXT.vocab.itos[:10])

    BATCH_SIZE = 32
    #      
    train_iter = data.BucketIterator(train_data, batch_size=BATCH_SIZE)
    val_iter = data.BucketIterator(val_data, batch_size=BATCH_SIZE)
    test_iter = data.BucketIterator(testdata, batch_size=BATCH_SIZE)

    for batch in train_iter:
        break

    print("data's label", batch.label)
    print("shape of data", batch.text[0].shape)
    print("number of data", len(batch.text[1]))


잘못 을 보고 하 다.이 오 류 는 tensor 대상 의 생 성 으로 거 슬러 올 라 갈 수 있다.결론 은 split 가 파일 을 읽 을 때 탭 은[1]과 같은 str 목록 으로 읽 었 지만,어 표를 만 들 때[1]과 같은 숫자 목록 이 필요 하 다 는 것 이다.게다가 다른 블 로그 에서 쓴 이 오류 가 발생 할 수 있 는 이 유 는 일부 데이터 가 디지털 형식 이지 만 str 대상 의 형식 으로 torch.tensor 에 전송 되 어 변환 을 기억 하기 때 문 입 니 다.
해결 방법
사전 처리 대상 LABEL 을 정의 할 때 추가 분사 함 수 를 추가 합 니 다.이것 은 수 정 된 것 입 니 다.
import torch
import torch.nn as nn
import torch.utils.data as Data
from torchtext import data

if __name__ == "__main__":
    mytokenize = lambda x : x.split()   # str -> list[str]
    labeltokenize = lambda x : [int(x[0])]  # [str] -> [int]
    #        
    TEXT = data.Field(
        sequential=True, #       
        tokenize=mytokenize, #     
        include_lengths=True,
        use_vocab=True,  #     
        batch_first=True,   #    
        fix_length=200  #   
    )

    LABEL  =data.Field(
        sequential=True,
        use_vocab=False,
        dtype=torch.int64,
        tokenize=labeltokenize,
        pad_token=None,
        unk_token=None
    )

    #       
    train_test_fields = [
        ("text", TEXT),
        ("label", LABEL)
    ]

    #     
    traindata, testdata = data.TabularDataset.splits(
        path="./data", format="csv",    #       
        train="imdb_train.csv", test="imdb_test.csv",
        fields=train_test_fields,
        skip_header=True
    )

    ex0 = traindata.examples[0]
    print(ex0.label)

    train_data, val_data  = traindata.split(split_ratio=0.7)

    #           
    TEXT.build_vocab(train_data, max_size=20000)
    LABEL.build_vocab(train_data)
    #       10    
    print(TEXT.vocab.freqs.most_common(n=10))
    print(TEXT.vocab.itos[:10])

    BATCH_SIZE = 32
    #      
    train_iter = data.BucketIterator(train_data, batch_size=BATCH_SIZE)
    val_iter = data.BucketIterator(val_data, batch_size=BATCH_SIZE)
    test_iter = data.BucketIterator(testdata, batch_size=BATCH_SIZE)

    for batch in train_iter:
        break

    print("data's label", batch.label)
    print("shape of data", batch.text[0].shape)
    print("number of data", len(batch.text[1]))


출력:
[1]
[('movie', 29836), ('film', 26802), ('one', 17978), ('like', 13816), ('good', 10270), ('even', 8722), ('would', 8564), ('time', 8433), ('really', 8220), ('story', 8185)]
['', '', 'movie', 'film', 'one', 'like', 'good', 'even', 'would', 'time']
data's label tensor([[1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0,
         0, 0, 1, 0, 0, 0, 0, 1]])
shape of data torch.Size([32, 200])
number of data 32

done(`・ω・´)

좋은 웹페이지 즐겨찾기