Resnet i Python vs R

Action creates insight

Resnet i Python vs R

Resnet – ett neuralt nätverk som används för att klassa 1000 olika klasser såsom zebror och hundraser. Resnet har funnits många år i Python och nu har det äntligen också kommit till favoritspråket R. Det är nog inte bara jag som diggar att dela med mig av kod, så jag passar på att dela med mig om koderna jag har gjort här för att klassificera ett par bilder.

Nackdelen med R är däremot att det är Resnet18 till skillnad från Resnet101 i Python som alltså har 18 vs 101 olika lager (hidden layers). Som disclaimer måste jag säga att jag är usel på neurala nätverk och kan knappt hacka ihop en kod för att lösa en problem. Nog talat! Här är Python koden:

import torch
import torchvision
from torchvision import models

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

resnet=models.resnet101(pretrained=True)

from torchvision import transforms

preprocess = transforms.Compose([
  transforms.Resize(256),
  transforms.CenterCrop(224),
  transforms.ToTensor(),
  transforms.Normalize(
    mean=[0.485,0.456,0.406],
    std=[0.229,0.224,0.225]
  )
])

from PIL import Image
img=Image.open("bobby.jpeg")

img.show()

img_t = preprocess(img)

import torch

batch_t = torch.unsqueeze(img_t, 0)
resnet.eval()

out=resnet(batch_t)

with open('classes.txt') as f:
  labels = [line.strip() for line in f.readlines()]
_, index = torch.max(out,1)

percentage = torch.nn.functional.softmax(out,dim=1)[0]*100
labels[index[0]],percentage[index[0]].item()

Som du ser behöver du ha lite filer för att göra detta, som bilderna bobby.jpg och classes. Vill du ha koden i en Rmarkdown så kan du tanka ner den här. Här är R-koden som gör exakt samma sak fast då med Resnet18.

library(torch)
library(torchvision)

resnet<-torchvision::model_resnet18(pretrained = TRUE)

# resnet


# download.file("https://github.com/deep-learning-with-pytorch/dlwpt-code/blob/master/data/p1ch2/bobby.jpg?raw=true",destfile = "bobby.jpg")

preprocess<-function(img){
  img<-magick::image_read(img)
  torchvision::transform_resize(img,256) %>% torchvision::transform_center_crop(224) %>% 
    torchvision::transform_to_tensor() %>% 
    torchvision::transform_normalize(mean = c(0.485,0.456,0.406),std = c(0.229,0.224,0.225))
}

processed_img<-preprocess("bobby.jpg")

processed_img

# magick::image_read("bobby.jpg")

batch_t<-torch_unsqueeze(processed_img, 1)

resnet$eval()


out<-resnet(batch_t)
index<-torch_max(out, dim = 2)[[2]]

library(tidyverse)
classes<-readr::read_delim("classes.txt","\\n",col_names = FALSE)
classes<-classes$X1


percentage<-torch::nnf_softmax(out,dim = 2)[1]*100
tibble(classes[as.numeric(index[1])],percentage[index[1]]$item())

Detta var allt jag har att dela med mig idag, hoppas du och jag nyttjar denna roliga kod. Troligen dyker det upp lite mer neurala nätverk, jag har precis hittat Rstudios AI blog. Läs gärna mina tidigare inlägg.Detta har varit Resnet i Python vs R.

Tags: