Prefacio
A continuación, echemos un vistazo a uno de los métodos de agregación temporal del modelo de entrenamiento de re-reconocimiento de peatones por video: RNN.
Este es un modelo de uso común en el entrenamiento de modelos de secuencia. RNN puede extraer la información contenida en imágenes continuas. Aquí se utiliza la estructura RNN más simple.
Los resultados de las pruebas actuales de este método no son tan buenos como los de otros tipos, como la Parte B:
Entrada de modelo
La diferencia entre la entrada y la anterior está solo en la red de paso:
- imgs
- imgs.size () = [b, s, c, h, w]
- En el nivel de entrenamiento, b es por lotes y generalmente se establece en 32, seq_len se establece en 4, c es el número de canales es 3, h es la altura de la imagen, w es la anchura de la imagen
Parámetros de inicialización del modelo
model = models.init_model(name=args.arch, num_classes=dataset.num_train_pids, loss={
'xent', 'htri'})
- name El nombre del modelo utilizado
- dataset.num_train_pids El número de clasificaciones durante la clasificación
- pérdida xent = pérdida de entropía cruzada htri = triple pérdida
Realización de modelos
class ResNet50RNN(nn.Module):
def __init__(self, num_classes, loss={
'xent'}, **kwargs):
super(ResNet50RNN, self).__init__()
self.loss = loss
resnet50 = torchvision.models.resnet50(pretrained=True)
self.base = nn.Sequential(*list(resnet50.children())[:-2])
self.hidden_dim = 512
self.feat_dim = 2048
self.classifier = nn.Linear(self.hidden_dim, num_classes)
# 输入特征维数2048 LSTM中隐层的维度 循环神经网络的层数
#输入的数据shape=(batch_size,seq_length,embedding_dim),而batch_first默认是False,所以我们的输入数据最好送进LSTM之前将batch_size与seq_length这两个维度调换?
self.lstm = nn.LSTM(input_size=self.feat_dim, hidden_size=self.hidden_dim, num_layers=1, batch_first=True)
# x = [32,4,3,224,112] [b,s,c,h,w]
def forward(self, x):
# b=32
b = x.size(0)
# t= 4
t = x.size(1)
# x = [128,3,224,112]
x = x.view(b*t,x.size(2), x.size(3), x.size(4))
# x = [128,2048,7,4]
x = self.base(x)
# [128,2048,1,1]
x = F.avg_pool2d(x, x.size()[2:])
x = x.view(b,t,-1)
# x = [32,2048,4]
# 使用RNN直接获取特征
# output = [32,4,512]?
output, (h_n, c_n) = self.lstm(x)
# output = [32,512,4]
output = output.permute(0, 2, 1)
# f = [32,512]
f = F.avg_pool1d(output, t)
f = f.view(b, self.hidden_dim)
if not self.training:
return f
y = self.classifier(f)
if self.loss == {
'xent'}:
return y
elif self.loss == {
'xent', 'htri'}:
return y, f
elif self.loss == {
'cent'}:
return y, f
else:
raise KeyError("Unsupported loss: {}".format(self.loss))