В компьютерном зрении и распознавании изображений путь не был обнадеживающим, простая нейронная сеть не работала должным образом, и традиционные процедуры машинного обучения тоже не работали.

В настоящее время благодаря инновациям CNN (сверточных нейронных сетей) открылся путь для следования этой ветви и продолжения разработки новых алгоритмов, поддерживающих область глубокого обучения. В этом процессе был создан новый тип сети, его имя — ResNets, и он в основном является сыном CNN, поскольку компонентами ResNets являются CNN.

Но насколько хорошо они могут работать с теми же данными?

Этот вопрос заставил меня создать проект, в котором две нейронные сети сравнивались с задачей распознавания рукописного изображения, и были даны результаты.

Со стандартизированными гиперпараметрами, снижением веса, алгоритмами оптимизации, графиками скорости обучения и техникой отсечения градиента я разработал глубокие сети с нуля, используя Pytorch, используемые гиперпараметры, методы и структуры:

# Standarized hyperparameters and procedures
epochs = 15
max_lr = 0.0001
grad_clip = 0.007
weight_decay = 1e-5
opt_func = torch.optim.Adam
# Network property of CNN model class.
self.network = nn.Sequential(
      nn.Conv2d(in_channels, 2, kernel_size=3, padding=1),
      nn.ReLU(),
      nn.Conv2d(2, 32, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.MaxPool2d(2, 2), # output: 32 x 14 x 14

      nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.MaxPool2d(2, 2), # output: 64 x 7 x 7

      nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),
      nn.ReLU(),
      nn.MaxPool2d(7, 7), # output: 256 x 1 x 1

      nn.Flatten(), 
      nn.Linear(256, 128),
      nn.ReLU(),
      nn.Linear(128, 64),
      nn.ReLU(),
      nn.Linear(64, num_classes)  
    )
///////////////////////////////////////////////////////////////////////////
# Network properties of ResNet model class(where conv block is a CNN block).

self.conv1 = conv_block(in_channels, 32)
        self.conv2 = conv_block(32, 64, pool=True) ## 64 x 14 x 14
        self.res1 = nn.Sequential(conv_block(64, 64), conv_block(64, 64))
        
        self.conv3 = conv_block(64, 128)
        self.conv4 = conv_block(128, 256, pool=True) ## 256 x 7 x 7
        self.res2 = nn.Sequential(conv_block(256, 256), conv_block(256, 256))
        
        self.classifier = nn.Sequential(nn.MaxPool2d(7), 
                                        nn.Flatten(), 
                                        nn.Dropout(0.2),
                                        nn.Linear(256, num_classes))
#Also the forward method for ResNets.    
    def forward(self, xb):
        out = self.conv1(xb)
        out = self.conv2(out)
        out = self.res1(out) + out
        out = self.conv3(out)
        out = self.conv4(out)
        out = self.res2(out) + out
        out = self.classifier(out)
        return out
//////////////////////////////////////////////////////////////////////////////

И с этого определения пошли эпохи.

Полученные результаты не были удивительными:

Как и ожидалось от меня, с течением времени модель ResNet продемонстрировала свою потенциальную мощь в распознавании изображений.

Out[1]: The overall accuracy of the CNN model is 0.9748446345329285 and its loss is 0.08832837641239166
Out[2]: The overall accuracy of the ResNet model is 0.9894336462020874 and its loss is 0.029207197949290276

Разница между обоими в распознавании изображений с низким разрешением не так велика в производительности прогнозирования, но то, что модель CNN сделала за 37 минут, модель ResNet сделала это всего за 6 минут, и это печально известная победа Residual Block Networks.

Время прохождения 15 эпох было:

train_time_resnet = '40:20'
train_time_cnn = '37:35'

В заключение, модели ResNets намного мощнее, чем простые сверточные сети, и результаты даются этой статистикой, вы можете попробовать другие структуры сетей и сравнить их, это может быть еще один путь, но я думаю, что это хороший подход что демонстрирует главное.

Кроме того, если вы хотите продолжить исследование и попробовать что-то новое, я предоставляю вам набор данных здесь: