В компьютерном зрении и распознавании изображений путь не был обнадеживающим, простая нейронная сеть не работала должным образом, и традиционные процедуры машинного обучения тоже не работали.
В настоящее время благодаря инновациям 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 намного мощнее, чем простые сверточные сети, и результаты даются этой статистикой, вы можете попробовать другие структуры сетей и сравнить их, это может быть еще один путь, но я думаю, что это хороший подход что демонстрирует главное.
Кроме того, если вы хотите продолжить исследование и попробовать что-то новое, я предоставляю вам набор данных здесь: