0
respostas

Erro "unknown is not supported" no calculo de acurácia.

Tudo bem? Primeiramente, parabéns pelo curso!

O teste que estou fazendo é baixar o modelo já treinado do vgg16_bn e usar um banco de dados com 37.623 imagens de caracteres de 0 a 9 e de A a Z, para ver se o modelo seria capaz de reconhecer um carácter, seja ele numero ou letra.

Estou tentando aplicar o que aprendemos, mas ao realizar o treinamento surge o seguinte erro:

"unknown is not supported" na linha acc = accuracy_score(pred_list, rotulo_list).

Ai acontecem 2 coisas estranhas:

  • Quando faço o teste com poucas imagens (fiz com 100 e com 1000 imagens aleatórias do dataset) o erro não ocorre.
  • As vezes o erro acontece já no treinamento na primeira época, quando atinge a linha de calculo de acurácia, mas hoje tentei novamente e o erro disparou só na validação, ou seja, passou pelo calculo de acurácia no treinamento e calculou sem dar o erro.

Fiz alguns testes e descobri que os arrays "pred_list" e "rotulo_list" recebem os valores corretamente, mas o tipo deles é "unknown".

Antes do erro eu recebo esse aviso, mas nos testes com poucas imagens ele também aparece sem gerar problema:

VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray return array(a, dtype, copy=False, order=order)

O que posso estar fazendo de errado?

segue como fiz o carregamento das imagens:

data_transform = transforms.Compose([
                                     transforms.Resize((224, 224)),
                                     transforms.ToTensor(),
                                     transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                                          std=[0.229, 0.224, 0.225]) # necessário ser assim para usar rede pre treinada
                  ])
transform = transforms.Compose([transforms.Resize(255),
                                transforms.CenterCrop(224),
                                transforms.ToTensor()]) # usei como teste primeiro
dataset = datasets.ImageFolder("banco de dados caracteres/dataset_characters/", transform=data_transform)


test_size = int(0.1 * len(dataset))
print(dataset)
train_dataset, test_dataset = random_split(dataset, (34000, 3623))

a alteração no classificador

meu_classificador = list(net.classifier.children())[:-1]
meu_classificador.append(nn.Linear(4096,36))
net.classifier = nn.Sequential(*meu_classificador)
net

O restante é basicamente o mesmo código da aula.