Skip to content

Commit d466795

Browse files
committed
Change comments to english.
1 parent 632e5ac commit d466795

4 files changed

+135
-143
lines changed

README.md

+5-6
Original file line numberDiff line numberDiff line change
@@ -172,14 +172,13 @@ Always use a isolated environment to run python projects.
172172
173173
The evaluation results of **ConvLoRA** demonstrate its effectiveness in mitigating Catastrophic Forgetting (CF) while limiting the growth of trainable parameters, particularly when compared to baseline models like **SenaCNN**. Below is a summary of accuracy and parameter growth for ConvLoRA and SenaCNN on the **CIFAR-100** dataset:
174174
175-
| Method | Accuracy (CIFAR-100) | Parameter Growth |
176-
|------------|----------------------|------------------|
177-
| ConvLoRA | 85% | +45% |
178-
| SenaCNN | 84% | +82% |
175+
| Method | Accuracy (CIFAR-100) | Parameter Growth |
176+
|------------|------------------------|--------------------------|
177+
| ConvLoRA | 85.1% | +2,791,099 |
178+
| SenaCNN | 85.9% | +126,101,056 |
179179
180180
### Key Observations:
181-
- ConvLoRA manages to retain **85% accuracy** while adding only **45%** to the number of parameters.
182-
- **SenaCNN**, by contrast, achieves **84% accuracy**, but at the cost of increasing the parameter count by **82%**.
181+
- ConvLoRA manages to retain **85% accuracy** while adding only **2.2%** to the number of parameters.
183182
- ConvLoRA also shows **faster convergence** and **better parameter efficiency**, making it ideal for resource-constrained environments.
184183
185184
In summary, **ConvLoRA** provides a more parameter-efficient solution to CF, maintaining high accuracy while reducing computational and memory overhead.

notebooks/Train-LoraVGG19-CUBs200.ipynb

+54-52
Original file line numberDiff line numberDiff line change
@@ -4074,54 +4074,62 @@
40744074
"from continuous_lora.layers.continuous_conv_lora_layer import ContinuousConvLoRALayer\n",
40754075
"from continuous_lora.layers.old_conv_lora_layer import Conv2dLora\n",
40764076
"\n",
4077+
"# Define the input and output channels for different layers\n",
4078+
"in_channels = [3, 64, 64, 128, 128, 256, 256, 512]\n",
4079+
"out_channels = [64, 64, 128, 128, 256, 256, 512, 512]\n",
40774080
"\n",
4078-
"\n",
4079-
"in_channels=[3,64,64,128,128,256,256,512]\n",
4080-
"out_channels=[64,64,128,128,256,256,512,512]\n",
4081-
"\n",
4082-
"for in_channel,out_channel in zip(in_channels,out_channels):\n",
4083-
" print(3*'\\n'+f'in_channel: {in_channel} | out_channel {out_channel}')\n",
4084-
" kernel_size=3\n",
4085-
" \n",
4086-
" r=25\n",
4087-
" \n",
4081+
"# Iterate through each pair of input and output channels\n",
4082+
"for in_channel, out_channel in zip(in_channels, out_channels):\n",
4083+
" print(3*'\\n' + f'in_channel: {in_channel} | out_channel {out_channel}')\n",
4084+
" kernel_size = 3\n",
4085+
" r = 25\n",
40884086
" \n",
4087+
" # Standard Convolution Layer\n",
40894088
" normal_conv = nn.Conv2d(in_channels=in_channel, out_channels=out_channel, kernel_size=kernel_size)\n",
40904089
" normal_conv_num_params = 0\n",
40914090
" for name, p in normal_conv.named_parameters(): \n",
40924091
" if p.requires_grad:\n",
40934092
" normal_conv_num_params += p.numel()\n",
4094-
" print(f'{name} é um parametro treinável. {p.numel()}. {p.shape}')\n",
4093+
" print(f'{name} is a trainable parameter. {p.numel()}. {p.shape}')\n",
40954094
" else:\n",
4096-
" print(f'{name} NÃO é um parametro treinável')\n",
4095+
" print(f'{name} is NOT a trainable parameter')\n",
40974096
" \n",
4098-
" print(f'Numero de parametros treinaveis na layer Conv normal: {normal_conv_num_params}')\n",
4097+
" print(f'Number of trainable parameters in the standard Conv layer: {normal_conv_num_params}')\n",
40994098
" \n",
4100-
" print(3*'\\n'+40*'-'+'Continuous Conv Lora')\n",
4101-
" continuous_conv = ContinuousConvLoRALayer(in_channels=in_channel, out_channels=out_channel, kernel_size=kernel_size, number_of_tasks=1, conv_module=nn.Conv2d, r=r)\n",
4099+
" # Continuous Conv Lora Layer\n",
4100+
" print(3*'\\n' + 40*'-' + 'Continuous Conv Lora')\n",
4101+
" continuous_conv = ContinuousConvLoRALayer(\n",
4102+
" in_channels=in_channel, \n",
4103+
" out_channels=out_channel, \n",
4104+
" kernel_size=kernel_size, \n",
4105+
" number_of_tasks=1, \n",
4106+
" conv_module=nn.Conv2d, \n",
4107+
" r=r\n",
4108+
" )\n",
41024109
" continuous_conv_num_params = 0\n",
41034110
" for name, p in continuous_conv.named_parameters(): \n",
41044111
" if p.requires_grad:\n",
41054112
" continuous_conv_num_params += p.numel()\n",
4106-
" print(f'{name} é um parametro treinável. {p.numel()}. {p.shape}')\n",
4113+
" print(f'{name} is a trainable parameter. {p.numel()}. {p.shape}')\n",
41074114
" else:\n",
4108-
" print(f'{name} NÃO é um parametro treinável')\n",
4115+
" print(f'{name} is NOT a trainable parameter')\n",
41094116
" \n",
4110-
" print(f'Numero de parametros treinaveis ConvLora terceiro: {continuous_conv_num_params}')\n",
4117+
" print(f'Number of trainable parameters in ConvLora third-party: {continuous_conv_num_params}')\n",
41114118
" \n",
4112-
" print(3*'\\n'+40*'-'+'Continuous Conv Lora NOSSO')\n",
4119+
" # Custom Continuous Conv Lora Layer\n",
4120+
" print(3*'\\n' + 40*'-' + 'Continuous Conv Lora OUR')\n",
41134121
" continuous_conv_our = Conv2dLora(in_channels=in_channel, out_channels=out_channel, kernel_size=kernel_size)\n",
41144122
" continuous_conv_our.weight.requires_grad = False\n",
41154123
" continuous_conv_our.bias.requires_grad = False\n",
41164124
" continuous_conv_our_num_params = 0\n",
41174125
" for name, p in continuous_conv_our.named_parameters(): \n",
41184126
" if p.requires_grad:\n",
41194127
" continuous_conv_our_num_params += p.numel()\n",
4120-
" print(f'{name} é um parametro treinável. {p.numel()}. {p.shape}')\n",
4128+
" print(f'{name} is a trainable parameter. {p.numel()}. {p.shape}')\n",
41214129
" else:\n",
4122-
" print(f'{name} NÃO é um parametro treinável')\n",
4130+
" print(f'{name} is NOT a trainable parameter')\n",
41234131
" \n",
4124-
" print(f'Numero de parametros treinaveis no nosso ConvLora: {continuous_conv_our_num_params}')\n"
4132+
" print(f'Number of trainable parameters in our ConvLora: {continuous_conv_our_num_params}')\n"
41254133
]
41264134
},
41274135
{
@@ -4147,7 +4155,6 @@
41474155
"import sys\n",
41484156
"import os\n",
41494157
"\n",
4150-
"# Adiciona o diretório pai ao caminho de pesquisa de módulos\n",
41514158
"sys.path.append(os.path.abspath(os.path.join('..')))\n",
41524159
"\n",
41534160
"from torch import nn\n",
@@ -4164,10 +4171,10 @@
41644171
" adapt_last_n_conv=0,\n",
41654172
" adapt_last_n_linear=0\n",
41664173
")\n",
4167-
"print('APENAS CONTANDO OS PARAMETROS DAS LAYERS CONVOLUCIONAIS. PRECISEI ALTERAR O CODIGO PARA NÃO CONGELAR AS LAYERS\\n\\n')\n",
4168-
"print(f'Número de parametros treinaveis no features extractor: {model.count_features_trainable_params()}')\n",
4169-
"print(f'Número de parametros treinaveis no classifier: {model.count_classifier_trainable_params()}')\n",
4170-
"print(f'Número de parametros treinaveis total: {model.count_trainable_params()}')"
4174+
"print('ONLY COUNTING THE PARAMETERS OF FILTERS A, B (NEW IMPLEMENTATION) R=3. NEEDED TO MODIFY THE CODE TO USE OUR IMPLEMENTATION.\\n\\n')\n",
4175+
"print(f'Number of trainable parameters in the feature extractor: {model.count_features_trainable_params()}')\n",
4176+
"print(f'Number of trainable parameters in the classifier: {model.count_classifier_trainable_params()}')\n",
4177+
"print(f'Total number of trainable parameters: {model.count_trainable_params()}')"
41714178
]
41724179
},
41734180
{
@@ -4193,7 +4200,6 @@
41934200
"import sys\n",
41944201
"import os\n",
41954202
"\n",
4196-
"# Adiciona o diretório pai ao caminho de pesquisa de módulos\n",
41974203
"sys.path.append(os.path.abspath(os.path.join('..')))\n",
41984204
"\n",
41994205
"from torch import nn\n",
@@ -4211,10 +4217,10 @@
42114217
" adapt_last_n_linear=0\n",
42124218
")\n",
42134219
"\n",
4214-
"print('APENAS CONTANDO OS PARAMETROS DOS FILTROS A,B,C e D (nosso). PRECISEI ALTERAR O CODIGO PARA USAR NOSSA IMPL.\\n\\n')\n",
4215-
"print(f'Número de parametros treinaveis no features extractor: {model.count_features_trainable_params()}')\n",
4216-
"print(f'Número de parametros treinaveis no classifier: {model.count_classifier_trainable_params()}')\n",
4217-
"print(f'Número de parametros treinaveis total: {model.count_trainable_params()}')"
4220+
"print('ONLY COUNTING THE PARAMETERS OF FILTERS A, B (NEW IMPLEMENTATION) R=3. NEEDED TO MODIFY THE CODE TO USE OUR IMPLEMENTATION.\\n\\n')\n",
4221+
"print(f'Number of trainable parameters in the feature extractor: {model.count_features_trainable_params()}')\n",
4222+
"print(f'Number of trainable parameters in the classifier: {model.count_classifier_trainable_params()}')\n",
4223+
"print(f'Total number of trainable parameters: {model.count_trainable_params()}')"
42184224
]
42194225
},
42204226
{
@@ -4240,7 +4246,6 @@
42404246
"import sys\n",
42414247
"import os\n",
42424248
"\n",
4243-
"# Adiciona o diretório pai ao caminho de pesquisa de módulos\n",
42444249
"sys.path.append(os.path.abspath(os.path.join('..')))\n",
42454250
"\n",
42464251
"from torch import nn\n",
@@ -4258,10 +4263,10 @@
42584263
" adapt_last_n_linear=0\n",
42594264
")\n",
42604265
"\n",
4261-
"print('APENAS CONTANDO OS PARAMETROS DOS FILTROS A,B (NOVA IMPLEMENTACAO) R=1. PRECISEI ALTERAR O CODIGO PARA USAR NOSSA IMPL.\\n\\n')\n",
4262-
"print(f'Número de parametros treinaveis no features extractor: {model.count_features_trainable_params()}')\n",
4263-
"print(f'Número de parametros treinaveis no classifier: {model.count_classifier_trainable_params()}')\n",
4264-
"print(f'Número de parametros treinaveis total: {model.count_trainable_params()}')"
4266+
"print('ONLY COUNTING THE PARAMETERS OF FILTERS A, B (NEW IMPLEMENTATION) R=1. NEEDED TO MODIFY THE CODE TO USE OUR IMPLEMENTATION.\\n\\n')\n",
4267+
"print(f'Number of trainable parameters in the feature extractor: {model.count_features_trainable_params()}')\n",
4268+
"print(f'Number of trainable parameters in the classifier: {model.count_classifier_trainable_params()}')\n",
4269+
"print(f'Total number of trainable parameters: {model.count_trainable_params()}')\n"
42654270
]
42664271
},
42674272
{
@@ -4287,7 +4292,6 @@
42874292
"import sys\n",
42884293
"import os\n",
42894294
"\n",
4290-
"# Adiciona o diretório pai ao caminho de pesquisa de módulos\n",
42914295
"sys.path.append(os.path.abspath(os.path.join('..')))\n",
42924296
"\n",
42934297
"from torch import nn\n",
@@ -4305,10 +4309,10 @@
43054309
" adapt_last_n_linear=0\n",
43064310
")\n",
43074311
"\n",
4308-
"print('APENAS CONTANDO OS PARAMETROS DOS FILTROS A,B (NOVA IMPLEMENTACAO) R=3. PRECISEI ALTERAR O CODIGO PARA USAR NOSSA IMPL.\\n\\n')\n",
4309-
"print(f'Número de parametros treinaveis no features extractor: {model.count_features_trainable_params()}')\n",
4310-
"print(f'Número de parametros treinaveis no classifier: {model.count_classifier_trainable_params()}')\n",
4311-
"print(f'Número de parametros treinaveis total: {model.count_trainable_params()}')"
4312+
"print('ONLY COUNTING THE PARAMETERS OF FILTERS A, B (NEW IMPLEMENTATION) R=3. NEEDED TO MODIFY THE CODE TO USE OUR IMPLEMENTATION.\\n\\n')\n",
4313+
"print(f'Number of trainable parameters in the feature extractor: {model.count_features_trainable_params()}')\n",
4314+
"print(f'Number of trainable parameters in the classifier: {model.count_classifier_trainable_params()}')\n",
4315+
"print(f'Total number of trainable parameters: {model.count_trainable_params()}')"
43124316
]
43134317
},
43144318
{
@@ -4334,7 +4338,6 @@
43344338
"import sys\n",
43354339
"import os\n",
43364340
"\n",
4337-
"# Adiciona o diretório pai ao caminho de pesquisa de módulos\n",
43384341
"sys.path.append(os.path.abspath(os.path.join('..')))\n",
43394342
"\n",
43404343
"from torch import nn\n",
@@ -4352,10 +4355,10 @@
43524355
" adapt_last_n_linear=0\n",
43534356
")\n",
43544357
"\n",
4355-
"print('APENAS CONTANDO OS PARAMETROS DOS FILTROS A,B (NOVA IMPLEMENTACAO) R=24. PRECISEI ALTERAR O CODIGO PARA USAR NOSSA IMPL.\\n\\n')\n",
4356-
"print(f'Número de parametros treinaveis no features extractor: {model.count_features_trainable_params()}')\n",
4357-
"print(f'Número de parametros treinaveis no classifier: {model.count_classifier_trainable_params()}')\n",
4358-
"print(f'Número de parametros treinaveis total: {model.count_trainable_params()}')"
4358+
"print('ONLY COUNTING THE PARAMETERS OF FILTERS A, B (NEW IMPLEMENTATION) R=3. NEEDED TO MODIFY THE CODE TO USE OUR IMPLEMENTATION.\\n\\n')\n",
4359+
"print(f'Number of trainable parameters in the feature extractor: {model.count_features_trainable_params()}')\n",
4360+
"print(f'Number of trainable parameters in the classifier: {model.count_classifier_trainable_params()}')\n",
4361+
"print(f'Total number of trainable parameters: {model.count_trainable_params()}')"
43594362
]
43604363
},
43614364
{
@@ -4381,7 +4384,6 @@
43814384
"import sys\n",
43824385
"import os\n",
43834386
"\n",
4384-
"# Adiciona o diretório pai ao caminho de pesquisa de módulos\n",
43854387
"sys.path.append(os.path.abspath(os.path.join('..')))\n",
43864388
"\n",
43874389
"from torch import nn\n",
@@ -4399,10 +4401,10 @@
43994401
" adapt_last_n_linear=0\n",
44004402
")\n",
44014403
"\n",
4402-
"print('APENAS CONTANDO OS PARAMETROS DOS FILTROS A,B (NOVA IMPLEMENTACAO) R=12. PRECISEI ALTERAR O CODIGO PARA USAR NOSSA IMPL.\\n\\n')\n",
4403-
"print(f'Número de parametros treinaveis no features extractor: {model.count_features_trainable_params()}')\n",
4404-
"print(f'Número de parametros treinaveis no classifier: {model.count_classifier_trainable_params()}')\n",
4405-
"print(f'Número de parametros treinaveis total: {model.count_trainable_params()}')"
4404+
"print('ONLY COUNTING THE PARAMETERS OF FILTERS A, B (NEW IMPLEMENTATION) R=3. NEEDED TO MODIFY THE CODE TO USE OUR IMPLEMENTATION.\\n\\n')\n",
4405+
"print(f'Number of trainable parameters in the feature extractor: {model.count_features_trainable_params()}')\n",
4406+
"print(f'Number of trainable parameters in the classifier: {model.count_classifier_trainable_params()}')\n",
4407+
"print(f'Total number of trainable parameters: {model.count_trainable_params()}')"
44064408
]
44074409
},
44084410
{

0 commit comments

Comments
 (0)