Al ejecutar el experimento completo, encontré algunos problemas con el conjunto de prueba de phase1_rec, principalmente debido a las dificultades que quedaron del entrenamiento distribuido. El InferenceSampler utilizado para el conjunto de prueba divide los lotes uno por uno y los alimenta a diferentes GPU, por lo que el solo se puede usar el tamaño del lote de prueba original Debido a que los laboratorios no se pueden usar para secuencias,
intente modificarlo a la siguiente situación de acuerdo con el método proporcionado por ChatGPT, que aún no ayuda
class InferenceSampler(tordata.sampler.Sampler):
def __init__(self, dataset, batch_size):
self.dataset = dataset
self.batch_size = batch_size
self.size = len(dataset)
indices = list(range(self.size))
########### 修改
# world_size = dist.get_world_size()
# rank = dist.get_rank()
#
# if batch_size % world_size != 0:
# raise ValueError("World size ({}) is not divisible by batch_size ({})".format(
# world_size, batch_size))
##########################
if batch_size != 1:
complement_size = math.ceil(self.size / batch_size) * \
batch_size
indices += indices[:(complement_size - self.size)]
self.size = complement_size
batch_size_per_rank = self.batch_size # 修改
# batch_size_per_rank = int(self.batch_size / world_size)
indx_batch_per_rank = []
for i in range(int(self.size / batch_size_per_rank)):
indx_batch_per_rank.append(
indices[i*batch_size_per_rank:(i+1)*batch_size_per_rank])
# self.idx_batch_this_rank = indx_batch_per_rank[rank::world_size]
self.idx_batch_this_rank = indx_batch_per_rank # 修改
def __iter__(self):
yield from self.idx_batch_this_rank
def __len__(self):
return len(self.dataset)
Pero, de hecho, tales palabras se han escrito en yaml, por lo que está bien ejecutar
Note : *** the batch_size should be equal to the gpus number at the test phase!!! ***
Pero la etiqueta puede reconocer el tamaño del lote, pero aún es muy misterioso que las secuencias no puedan reconocerlo, así que repasemos el muestreo del conjunto de datos desde el principio.
Situación básica del conjunto de datos casia-b
124 categorías principales (ID), 11 subcategorías (puntos de vista) y 10 categorías medias (tipos de diferencia de apariencia). El
número de muestras en cada subcategoría es variable, generalmente más de 30 (después de todo, está configurado para tomar 30 para cada categoría durante el entrenamiento) →frames_num_fixed: 30) (De hecho, cada categoría generalmente tiene un total de 110 muestras, pero algunas son más pequeñas que este número, como 079 solo tiene 108, 088 tiene solo 101, 109 tiene solo 106) conjunto de entrenamiento: las primeras 75 categorías
de
pruebas Colección: Publicar 50 Categorías
conjunto de datos
Conjunto de entrenamiento
datos de entrada_cfg
{
'dataset_name': 'CASIA-B',
'dataset_root': '../datasets/CASIA-B-pkl', 'num_workers': 1,
'dataset_partition': '../datasets/CASIA-B/CASIA-B.json',
'remove_no_gallery': False,
'cache': False,
'test_dataset_name': 'CASIA-B',
'data_in_use': [True, False, False, False]}
__dataset_parser
Recorra todo, obtenga 8107 rutas y categorías de muestras de capacitación en self.seqs_info
y luego complete label_list, types_list, views_list respectivamente (Creo que este código parece un poco redundante)
equipo de prueba
5485 muestras de prueba
dechado
Set de Entrenamiento - Ternario
Conjunto de prueba - InferenceSampler
—————————————————————————
De repente descubrí que el código fuente aquí parece ser usado directamente casia-b-star, lo cambié a casia antes de obtener el conjunto de datos -b, así que lea casia-b-star nuevamente a continuación
(continuará)