Учитывая группы = 1, вес размера [64, 1024, 1, 1], ожидалось, что вход [1, 256, 1, 1] будет иметь 1024 канала, но вместоPython

Программы на Python
Ответить
Anonymous
 Учитывая группы = 1, вес размера [64, 1024, 1, 1], ожидалось, что вход [1, 256, 1, 1] будет иметь 1024 канала, но вместо

Сообщение Anonymous »

Я столкнулся с этой проблемой, искал на форумах, но не смог ее решить. Как я могу решить эту проблему?
Я попытался добавить модуль CBAM в yolov12 для своего пользовательского набора данных, чтобы повысить точность. Я поделился своим кодом и результатами ниже.
В дополнение к:
насколько вам известно, у Yolo есть разные версии, и каждая из них имеет в основном разную архитектуру и коды. есть примеры, такие как изменение архитектуры или добавление модуля CBAM, но нет пошагового руководства, и я новичок, поэтому я ценю, что вы можете подробно рассказать мне, например:
  • Как я могу решить эту проблему?
  • Что мне делать дальше?
  • Сталкивались ли вы раньше с этой проблемой или подобной проблемой, если да, как вы ее решили или что вы сделали дальше?
  • если это невозможно исправить, что мне делать еще?
это мой пользовательский файл Yaml:

Код: Выделить всё

nc: 80
scales:
n: [0.50, 0.25, 1024] # summary: 497 layers, 2,553,904 parameters, 2,553,888 gradients, 6.2 GFLOPs
s: [0.50, 0.50, 1024] # summary: 497 layers, 9,127,424 parameters, 9,127,408 gradients, 19.7 GFLOPs
m: [0.50, 1.00, 512] # summary: 533 layers, 19,670,784 parameters, 19,670,768 gradients, 60.4 GFLOPs
l: [1.00, 1.00, 512] # summary: 895 layers, 26,506,496 parameters, 26,506,480 gradients, 83.3 GFLOPs
x: [1.00, 1.50, 512] # summary:  895 layers, 59,414,176 parameters, 59,414,160 gradients, 185.9 GFLOPs

# YOLO12-turbo backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv,  [64, 3, 2]] # 0-P1/2
- [-1, 1, Conv,  [128, 3, 2, 1, 2]] # 1-P2/4
- [-1, 2, C3k2,  [256, False, 0.25]]
- [-1, 1, Conv,  [256, 3, 2, 1, 4]] # 3-P3/8
- [-1, 2, C3k2,  [512, False, 0.25]]
- [-1, 1, Conv,  [512, 3, 2]] # 5-P4/16
- [-1, 4, A2C2f, [512, True, 4]]
- [-1, 1, Conv,  [1024, 3, 2]] # 7-P5/32
- [-1, 4, A2C2f, [1024, True, 1]] # 8

# YOLO12-turbo head
head:
- [-1, 1, MyCustomCBAM, [1024]]
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 2, A2C2f, [512, False, -1]] # 11

- [-1, 1, MyCustomCBAM, [512]]
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 2, A2C2f, [256, False, -1]] # 14

- [-1, 1, MyCustomCBAM, [256]]
- [-1, 1, Conv, [256, 3, 2]]
- [[-1, 11], 1, Concat, [1]] # cat head P4
- [-1, 2, A2C2f, [512, False, -1]] # 17

- [-1, 1, MyCustomCBAM, [512]]
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 8], 1, Concat, [1]] # cat head P5
- [-1, 2, C3k2, [1024, True]] # 20 (P5/32-large)

- [[14, 17, 20], 1, Detect, [nc]]# Detect(P3, P4, P5)
Код MyCustomCBAM в block.py:

Код: Выделить всё

import torch
import torch.nn as nn

class MyCustomCBAM(nn.Module):
def __init__(self, channels, reduction=16):
super(MyCustomCBAM, self).__init__()
self.channel_attention = ChannelAttention(channels, reduction)
self.spatial_attention = SpatialAttention()

def forward(self, x):
x = self.channel_attention(x) * x
x = self.spatial_attention(x) * x
return x

class ChannelAttention(nn.Module):
def __init__(self, in_planes, reduction=16):
super(ChannelAttention, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.max_pool = nn.AdaptiveMaxPool2d(1)
self.fc = nn.Sequential(
nn.Conv2d(in_planes, in_planes // reduction, 1, bias=False),
nn.ReLU(),
nn.Conv2d(in_planes // reduction, in_planes, 1, bias=False)
)
self.sigmoid = nn.Sigmoid()

def forward(self, x):
avg_out = self.fc(self.avg_pool(x))
max_out = self.fc(self.max_pool(x))
out = avg_out + max_out
return self.sigmoid(out)

class SpatialAttention(nn.Module):
def __init__(self):
super(SpatialAttention, self).__init__()
self.conv1 = nn.Conv2d(2, 1, kernel_size=7, padding=3, bias=False)
self.sigmoid = nn.Sigmoid()

def forward(self, x):
avg_out = torch.mean(x, dim=1, keepdim=True)
max_out, _ = torch.max(x, dim=1, keepdim=True)
x = torch.cat([avg_out, max_out], dim=1)
x = self.conv1(x)
return self.sigmoid(x)
и я добавил Tasks.py в код MyCustomCBAM для анализа:

Код: Выделить всё

        elif m in frozenset({TorchVision, Index}):
c2 = args[0]
c1 = ch[f]
args = [*args[1:]]
elif m in {MyCustomCBAM}:
c1, c2 = ch[f], args[0]
if c2 != nc:
c2 = make_divisible(min(c2, max_channels) * width, 8)
args = [c1, *args[1:]]
else:
c2 = ch[f]
Послушайте мои коды ошибок:

Код: Выделить всё

Traceback (most recent call last):
File "C:\Users\Enes Microsoft\PycharmProjects\mealpy-tune_refactor\refactor_yolo_architecture.py", line 26, in 
main()
~~~~^^
File "C:\Users\Enes Microsoft\PycharmProjects\mealpy-tune_refactor\refactor_yolo_architecture.py", line 23, in main
test_everything()
~~~~~~~~~~~~~~~^^
File "C:\Users\Enes Microsoft\PycharmProjects\mealpy-tune_refactor\refactor_yolo_architecture.py", line 20, in test_everything
obj_func()
~~~~~~~~^^
File "C:\Users\Enes Microsoft\PycharmProjects\mealpy-tune_refactor\refactor_yolo_architecture.py", line 12, in obj_func
model = YOLO(YAML_PATH).load('epc_yolo12_best.pt')
~~~~^^^^^^^^^^^
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\ultralytics\models\yolo\model.py", line 83, in __init__
super().__init__(model=model, task=task,  verbose=verbose)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\ultralytics\engine\model.py", line 151, in __init__
self._new(model, task=task, verbose=verbose)
~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\ultralytics\engine\model.py", line 263, in _new
self.model = (model or self._smart_load("model"))(cfg_dict, verbose=verbose and RANK == -1)  # build model
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\ultralytics\nn\tasks.py", line 420, in __init__
m.stride = torch.tensor([s / x.shape[-2] for x in _forward(torch.zeros(1, ch, s, s))])  # forward
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\ultralytics\nn\tasks.py", line 416, in _forward
return self.forward(x)[0] if isinstance(m, (Segment, YOLOESegment, Pose, OBB)) else self.forward(x)
~~~~~~~~~~~~^^^
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\ultralytics\nn\tasks.py", line 141, in forward
return self.predict(x, *args, **kwargs)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\ultralytics\nn\tasks.py", line 159, in predict
return self._predict_once(x, profile, visualize, embed)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\ultralytics\nn\tasks.py", line 182, in _predict_once
x = m(x)  # run
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\torch\nn\modules\module.py", line 1773, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\torch\nn\modules\module.py", line 1784, in _call_impl
return forward_call(*args, **kwargs)
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\ultralytics\nn\modules\block.py", line 2044, in forward
x = self.channel_attention(x) * x
~~~~~~~~~~~~~~~~~~~~~~^^^
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\torch\nn\modules\module.py", line 1773, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\torch\nn\modules\module.py", line 1784, in _call_impl
return forward_call(*args, **kwargs)
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\ultralytics\nn\modules\block.py", line 2061, in forward
avg_out = self.fc(self.avg_pool(x))
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\torch\nn\modules\module.py", line 1773, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\torch\nn\modules\module.py", line 1784, in _call_impl
return forward_call(*args, **kwargs)
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\torch\nn\modules\container.py", line 244, in forward
input = module(input)
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\torch\nn\modules\module.py", line 1773, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\torch\nn\modules\module.py", line 1784, in _call_impl
return forward_call(*args, **kwargs)
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\torch\nn\modules\conv.py", line 549, in forward
return self._conv_forward(input, self.weight, self.bias)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Enes Microsoft\miniconda3\Lib\site-packages\torch\nn\modules\conv.py", line 544, in _conv_forward
return F.conv2d(
~~~~~~~~^
input, weight, bias, self.stride, self.padding, self.dilation, self.groups
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
RuntimeError:  Given groups=1, weight of size [64, 1024, 1, 1], expected input[1, 256, 1, 1] to have 1024 channels, but got 256 channels instead
есть ли модуль или что-то, что мне следует добавить? или я сделал что-то не так?

Подробнее здесь: https://stackoverflow.com/questions/798 ... 256-1-1-to
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»