sooftware / kospeech

Open-Source Toolkit for End-to-End Korean Automatic Speech Recognition leveraging PyTorch and Hydra.
https://sooftware.github.io/kospeech/
Apache License 2.0
603 stars 191 forks source link

eval 에서 질문드립니다. #121

Closed hyuntae-yun closed 3 years ago

hyuntae-yun commented 3 years ago

안녕하세요? 저는 음성인식에 관심이 있어서 공부하고 있는 학생입니다.

Traceback (most recent call last):
  File "./bin/eval.py", line 71, in main
    inference(config)
  File "./bin/eval.py", line 33, in inference
    model = load_test_model(config.eval, device)
  File "/mnt/c/Users/uhn61/Documents/codestates/KoSpeech/kospeech/model_builder.py", line 356, in load_test_model
    model.module.decoder.device = device
AttributeError: 'NoneType' object has no attribute 'device'

Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace.

먼저 모델을 학습시키고, 학습한 데이터로 eval을 했는데요, 현재 다음과 같은 에러가 나서 소스코드를 살펴보니,

DeepSpeech2(
  (conv): DeepSpeech2Extractor(
    (activation): Hardtanh(min_val=0, max_val=20, inplace=True)
    (conv): MaskCNN(
      (sequential): Sequential(
        (0): Conv2d(1, 32, kernel_size=(41, 11), stride=(2, 2), padding=(20, 5), bias=False)
        (1): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (2): Hardtanh(min_val=0, max_val=20, inplace=True)
        (3): Conv2d(32, 32, kernel_size=(21, 11), stride=(2, 1), padding=(10, 5), bias=False)
        (4): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (5): Hardtanh(min_val=0, max_val=20, inplace=True)
      )
    )
  )
  (rnn_layers): ModuleList(
    (0): BNReluRNN(
      (batch_norm): BatchNorm1d(640, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (rnn): GRU(640, 1024, batch_first=True, dropout=0.3, bidirectional=True)
    )
    (1): BNReluRNN(
      (batch_norm): BatchNorm1d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (rnn): GRU(2048, 1024, batch_first=True, dropout=0.3, bidirectional=True)
    )
    (2): BNReluRNN(
      (batch_norm): BatchNorm1d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (rnn): GRU(2048, 1024, batch_first=True, dropout=0.3, bidirectional=True)
    )
  )
  (fc): Sequential(
    (0): LayerNorm()
    (1): Linear(
      (linear): Linear(in_features=2048, out_features=2001, bias=False)
    )
  )
)

저장된 모델의 module에 decoder이나 encoder이 존재하지 않는데

def load_test_model(config: DictConfig, device: torch.device):
    model = torch.load(config.model_path, map_location=lambda storage, loc: storage).to(device)
    print(model.module)
    if isinstance(model, nn.DataParallel):
        model.module.decoder.device = device
        model.module.encoder.device = device

    else:
        model.encoder.device = device
        model.decoder.device = device

    return model

다음과 같이 model.module의 encoder과 decoder에 device를 할당해주는 것을 볼 수 있었습니다. 이슈를 살펴봐도 딱히 도움되는 글이 없어서 이렇게 남깁니다. 저 device할당해주는 부분을 주석처리하고 돌려도 어짜피 inference.py에서

elif isinstance(model, DeepSpeech2):
    model.device = opt.device
    y_hats = model.greedy_search(feature.unsqueeze(0), input_length, opt.device)

에서 다시 한번 에러가 납니다. 제가 tensorflow만하다가 이번에 pytorch를 시작해서 지식이 짧아서 알고보면 너무 쉬운 문제일 수 있지만, 현재 해결을 못하겠어서 질문드립니다. 감사합니다!

dudgns0908 commented 3 years ago

test 폴더 내에 있는 것들을 보시면 모델 사용 방법에 대해 간단하게 알 수 있을거에요! 제가 보기에는 현재 greedy_search 함수가 사라지고 recognize함수를 대신 이용하는 것 같습니다.

y_hats = model.recognize(feature.unsqueeze(0), input_length)