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.