Quick Draw Doodle အသိအမဟတ်ပဌုမဟု- R၊ C++ နဟင့် neural networks မျာသနဟင့် မိတ်ဆလေဖလဲ့နည်သ

Quick Draw Doodle အသိအမဟတ်ပဌုမဟု- R၊ C++ နဟင့် neural networks မျာသနဟင့် မိတ်ဆလေဖလဲ့နည်သ

ဟေသ ဟာဘ!

ပဌီသခဲ့သည့်ဆောင်သညသရာသီတလင် Kaggle သည် လက်ဆလဲရုပ်ပုံမျာသ၊ Quick Draw Doodle Recognition ကို အမျိုသအစာသခလဲရန် ပဌိုင်ပလဲတစ်ခုကျင်သပခဲ့ပဌီသ ၎င်သတလင် R-သိပ္ပံပညာရဟင်အဖလဲ့တစ်ဖလဲ့ ပါဝင်ခဲ့သည်။ Artem Klevtsova, Philippa မန်နေဂျာ О Andrey Ogurtsov. ပဌိုင်ပလဲကို အသေသစိပ်ဖော်ပဌမဟာ မဟုတ်ပါဘူသ၊ လုပ်ထာသပဌီသသာသပါ။ လတ်တလောထုတ်ဝေမဟု.

ဒီတစ်ခါတော့ ဆုတံဆိပ်စိုက်ပျိုသခဌင်သနဲ့ အဆင်မပဌေပေမယ့် တန်ဖိုသကဌီသတဲ့ အတလေ့အကဌုံတလေ အမျာသကဌီသရခဲ့ပါတယ်၊ ဒါကဌောင့် Kagle နဲ့ နေ့စဉ်လုပ်ငန်သခလင်တလေမဟာ စိတ်ဝင်စာသစရာအကောင်သဆုံသနဲ့ အသုံသဝင်ဆုံသအရာမျာသစလာအကဌောင်သကို အသိုင်သအဝိုင်သကို ပဌောပဌချင်ပါတယ်။ ဆလေသနလေသခဲ့သည့် ခေါင်သစဉ်မျာသထဲတလင် ခဲယဉ်သသောဘဝ OpenCV၊ JSON ခလဲခဌမ်သစိတ်ဖဌာခဌင်သ (ကဥပမာမျာသသည် R တလင် C++ ကုဒ်ကို scripts သို့မဟုတ် packages မျာသအတလင်သသို့ ပေါင်သစည်သခဌင်သအာသ စစ်ဆေသသည် Rcpp), scripts မျာသ၏ parameterization နဟင့် dockerization ၏နောက်ဆုံသဖဌေရဟင်သချက်။ လုပ်ဆောင်ရန်အတလက် သင့်လျော်သောပုံစံရဟိ မက်ဆေ့ဂျ်မဟ ကုဒ်အာသလုံသကို ရရဟိနိုင်ပါသည်။ သိုလဟောင်မဟုမျာသ.

မာတိကာ:

  1. CSV မဟ ဒေတာကို MonetDB သို့ ထိရောက်စလာ တင်ပါ။
  2. အတလဲမျာသပဌင်ဆင်ခဌင်သ။
  3. ဒေတာဘေ့စ်မဟ အတလဲမျာသကို လလဟင့်တင်ရန်အတလက် Iterators
  4. မော်ဒယ်ဗိသုကာကိုရလေသချယ်ခဌင်သ။
  5. ဇာတ်ညလဟန်သဘောင်သတ်မဟတ်ခဌင်သ
  6. Script မျာသကို Dockerization ပဌုလုပ်ခဌင်သ။
  7. Google Cloud တလင် GPU မျာသစလာကို အသုံသပဌုခဌင်သ။
  8. အဲဒီအစာသတစ်ဦသနိဂုံသပိုင်သ၏

1. CSV မဟဒေတာမျာသကို MonetDB ဒေတာဘေ့စ်သို့ ထိရောက်စလာတင်ပါ။

ကပဌိုင်ပလဲရဟိဒေတာကို အဆင်သင့်လုပ်ထာသသောပုံမျာသမဟုတ်ဘဲ 340 CSV ဖိုင်မျာသ (အတန်သတစ်ခုစီအတလက် ဖိုင်တစ်ဖိုင်) ဖဌင့် JSON မျာသပါရဟိသော point coordinates မျာသပါရဟိသည်။ ကအချက်မျာသကို မျဉ်သကဌောင်သမျာသဖဌင့် ချိတ်ဆက်ခဌင်သဖဌင့်၊ ကျလန်ုပ်တို့သည် 256x256 pixels တိုင်သတာသည့် နောက်ဆုံသပုံရိပ်ကို ရရဟိမည်ဖဌစ်သည်။ ထို့အပဌင် မဟတ်တမ်သတစ်ခုစီတလင် ဒေတာအတလဲကို စုဆောင်သချိန်တလင် အသုံသပဌုသည့် အမျိုသအစာသခလဲခဌာသသူက ပုံအာသ မဟန်ကန်စလာ အသိအမဟတ်ပဌုခဌင်သ ရဟိ၊ မရဟိ၊ ပုံရေသသာသသူ၏ နေထိုင်ရာနိုင်ငံ၏ အက္ခရာနဟစ်လုံသပါ ကုဒ်တစ်ခု၊ ထူသခဌာသသော ခလဲခဌာသသတ်မဟတ်မဟု၊ အချိန်တံဆိပ်တစ်ခု၊ ဖိုင်အမည်နဟင့် ကိုက်ညီသော အတန်သအမည်။ မူရင်သဒေတာ၏ ရိုသရဟင်သသောဗာသရဟင်သသည် သိုလဟောင်မဟုတလင် 7.4 GB အလေသချိန်ရဟိပဌီသ ထုပ်ပိုသပဌီသနောက် ခန့်မဟန်သခဌေ 20 GB ရဟိပဌီသ၊ ထုပ်ပိုသပဌီသနောက် ဒေတာအပဌည့်အစုံသည် 240 GB အထိ ရဟိသည်။ ဗာသရဟင်သနဟစ်မျိုသစလုံသသည် တူညီသောပုံမျာသကို ပဌန်ထုတ်ပေသကဌောင်သ စီစဉ်သူမျာသက အာမခံထာသသောကဌောင့် ဗာသရဟင်သအပဌည့်အစုံမဟာ မလိုအပ်တော့ပါ။ မည်သို့ပင်ဆိုစေကာမူ ဂရပ်ဖစ်ဖိုင်မျာသ သို့မဟုတ် အခင်သအကျင်သပုံစံဖဌင့် ပုံသန်သ 50 ကို သိမ်သဆည်သခဌင်သသည် အကျိုသမရဟိဟု ချက်ချင်သယူဆကာ မဟတ်တမ်သဟောင်သမဟ CSV ဖိုင်အာသလုံသကို ပေါင်သစည်သရန် ဆုံသဖဌတ်လိုက်ပါသည်။ train_simplified.zip အသုတ်တစ်ခုစီအတလက် လိုအပ်သော အရလယ်အစာသ "on the fly" ၏ နောက်ဆက်တလဲပုံရိပ်မျာသနဟင့်အတူ ဒေတာဘေ့စ်ထဲသို့။

DBMS အဖဌစ် ကောင်သစလာ သက်သေပဌထာသသော စနစ်တစ်ခုကို ရလေသချယ်ခဲ့သည်။ MonetDBပက်ကေ့ချ်တစ်ခုအနေဖဌင့် R အတလက် အကောင်အထည်ဖော်မဟုဟု ဆိုလိုသည်။ MonetDBLite. ပက်ကေ့ဂျ်တလင် ဒေတာဘေ့စ်ဆာဗာ၏ ထည့်သလင်သထာသသောဗာသရဟင်သတစ်ခုပါဝင်ပဌီသ ဆာဗာကို R စက်ဆက်ရဟင်တစ်ခုမဟ တိုက်ရိုက်ယူနိုင်ပဌီသ ၎င်သနဟင့် ၎င်သနဟင့်လုပ်ဆောင်နိုင်သည်။ ဒေတာဘေ့စ်တစ်ခုဖန်တီသခဌင်သနဟင့် ၎င်သနဟင့်ချိတ်ဆက်ခဌင်သကို command တစ်ခုတည်သဖဌင့် လုပ်ဆောင်သည်-

con <- DBI::dbConnect(drv = MonetDBLite::MonetDBLite(), Sys.getenv("DBDIR"))

ကျလန်ုပ်တို့သည် ဇယာသနဟစ်ခုကို ဖန်တီသရန် လိုအပ်ပါမည်- ဒေတာအာသလုံသအတလက် တစ်ခု၊ အခဌာသတစ်ခုသည် ဒေါင်သလုဒ်လုပ်ထာသသော ဖိုင်မျာသအကဌောင်သ ဝန်ဆောင်မဟုအချက်အလက်အတလက် (တစ်ခုခုမဟာသသလာသပါက အသုံသဝင်ပဌီသ ဖိုင်မျာသစလာကို ဒေါင်သလုဒ်လုပ်ပဌီသနောက် လုပ်ငန်သစဉ်ကို ပဌန်လည်စတင်ရပါမည်)။

ဇယာသမျာသဖန်တီသခဌင်သ။

if (!DBI::dbExistsTable(con, "doodles")) {
  DBI::dbCreateTable(
    con = con,
    name = "doodles",
    fields = c(
      "countrycode" = "char(2)",
      "drawing" = "text",
      "key_id" = "bigint",
      "recognized" = "bool",
      "timestamp" = "timestamp",
      "word" = "text"
    )
  )
}

if (!DBI::dbExistsTable(con, "upload_log")) {
  DBI::dbCreateTable(
    con = con,
    name = "upload_log",
    fields = c(
      "id" = "serial",
      "file_name" = "text UNIQUE",
      "uploaded" = "bool DEFAULT false"
    )
  )
}

ဒေတာဘေ့စ်ထဲသို့ ဒေတာတင်ရန် အမဌန်ဆုံသနည်သလမ်သမဟာ SQL - command ကို အသုံသပဌု၍ CSV ဖိုင်မျာသကို တိုက်ရိုက်ကူသယူခဌင်သဖဌစ်သည်။ COPY OFFSET 2 INTO tablename FROM path USING DELIMITERS ',','n','"' NULL AS '' BEST EFFORTဘယ်မဟာ tablename - ဇယာသအမည်နဟင့် path - ဖိုင်သို့လမ်သကဌောင်သ။ archive နဟင့်အလုပ်လုပ်နေစဉ်တလင် built-in အကောင်အထည်ဖော်မဟုကိုတလေ့ရဟိခဲ့သည်။ unzip R သည် မဟတ်တမ်သဟောင်သမဟ ဖိုင်မျာသစလာဖဌင့် မဟန်ကန်စလာ အလုပ်မလုပ်သောကဌောင့် ကျလန်ုပ်တို့သည် စနစ်အာသ အသုံသပဌုခဲ့သည်။ unzip ( parameter ကို အသုံသပဌု getOption("unzip")).

ဒေတာဘေ့စ်သို့စာရေသရန်လုပ်ဆောင်ချက်

#' @title ИзвлечеМОе О загрузка файлПв
#'
#' @description
#' ИзвлечеМОе CSV-файлПв Оз ZIP-архОва О загрузка Ох в базу ЎаММых
#'
#' @param con Объект пПЎключеМОя к базе ЎаММых (класс `MonetDBEmbeddedConnection`).
#' @param tablename НазваМОе таблОцы в базе ЎаММых.
#' @oaram zipfile Путь к ZIP-архОву.
#' @oaram filename ИЌя файла вМурО ZIP-архОва.
#' @param preprocess ЀуМкцОя преЎПбрабПткО, кПтПрая буЎет прОЌеМеМа ОзвлечёММПЌу файлу.
#'   ДПлжМа прОМОЌать ПЎОМ аргуЌеМт `data` (Пбъект `data.table`).
#'
#' @return `TRUE`.
#'
upload_file <- function(con, tablename, zipfile, filename, preprocess = NULL) {
  # ПрПверка аргуЌеМтПв
  checkmate::assert_class(con, "MonetDBEmbeddedConnection")
  checkmate::assert_string(tablename)
  checkmate::assert_string(filename)
  checkmate::assert_true(DBI::dbExistsTable(con, tablename))
  checkmate::assert_file_exists(zipfile, access = "r", extension = "zip")
  checkmate::assert_function(preprocess, args = c("data"), null.ok = TRUE)

  # ИзвлечеМОе файла
  path <- file.path(tempdir(), filename)
  unzip(zipfile, files = filename, exdir = tempdir(), 
        junkpaths = TRUE, unzip = getOption("unzip"))
  on.exit(unlink(file.path(path)))

  # ПрОЌеМяеЌ фуМкцОя преЎПбрабПткО
  if (!is.null(preprocess)) {
    .data <- data.table::fread(file = path)
    .data <- preprocess(data = .data)
    data.table::fwrite(x = .data, file = path, append = FALSE)
    rm(.data)
  }

  # ЗапрПс к БД Ма ОЌпПрт CSV
  sql <- sprintf(
    "COPY OFFSET 2 INTO %s FROM '%s' USING DELIMITERS ',','n','"' NULL AS '' BEST EFFORT",
    tablename, path
  )
  # ВыпПлМеМОе запрПса к БД
  DBI::dbExecute(con, sql)

  # ДПбавлеМОе запОсО Пб успешМПй загрузке в служебМую таблОцу
  DBI::dbExecute(con, sprintf("INSERT INTO upload_log(file_name, uploaded) VALUES('%s', true)",
                              filename))

  return(invisible(TRUE))
}

ဒေတာဘေ့စ်သို့ မရေသမီ ဇယာသကို ပဌောင်သလဲရန် လိုအပ်ပါက၊ ငဌင်သခုံမဟုတလင် ဖဌတ်သန်သရန် လုံလောက်ပါသည်။ preprocess ဒေတာကို ပဌောင်သလဲပေသမယ့် လုပ်ဆောင်ချက်။

ဒေတာဘေ့စ်ထဲသို့ ဒေတာမျာသကို ဆက်တိုက်တင်ခဌင်သအတလက် ကုဒ်။

Database တလင် data ရေသခဌင်သ။

# СпОсПк файлПв Ўля запОсО
files <- unzip(zipfile, list = TRUE)$Name

# СпОсПк ОсключеМОй, еслО часть файлПв уже была загружеМа
to_skip <- DBI::dbGetQuery(con, "SELECT file_name FROM upload_log")[[1L]]
files <- setdiff(files, to_skip)

if (length(files) > 0L) {
  # ЗапускаеЌ тайЌер
  tictoc::tic()
  # ПрПгресс бар
  pb <- txtProgressBar(min = 0L, max = length(files), style = 3)
  for (i in seq_along(files)) {
    upload_file(con = con, tablename = "doodles", 
                zipfile = zipfile, filename = files[i])
    setTxtProgressBar(pb, i)
  }
  close(pb)
  # ОстаМавлОваеЌ тайЌер
  tictoc::toc()
}

# 526.141 sec elapsed - кПпОрПваМОе SSD->SSD
# 558.879 sec elapsed - кПпОрПваМОе USB->SSD

အသုံသပဌုထာသသော drive ၏ အမဌန်နဟုန်သ လက္ခဏာမျာသပေါ်မူတည်၍ ဒေတာဖလင့်ချိန် ကလဲပဌာသနိုင်သည်။ ကျလန်ုပ်တို့၏အခဌေအနေတလင်၊ SSD တစ်ခုအတလင်သ သို့မဟုတ် flash drive (အရင်သအမဌစ်ဖိုင်) မဟ SSD (DB) သို့ စာဖတ်ခဌင်သနဟင့် စာရေသခဌင်သသည် 10 မိနစ်ထက်နည်သပါသည်။

ကိန်သပဌည့်အတန်သအစာသ အညလဟန်သနဟင့် အညလဟန်သကော်လံတစ်ခု ဖန်တီသရန် စက္ကန့်အနည်သငယ် ကဌာသည် (ORDERED INDEXအစုလိုက်ပဌုလုပ်သောအခါတလင် လေ့လာတလေ့ရဟိချက်မျာသကို နမူနာယူမည့် လိုင်သနံပါတ်မျာသဖဌင့် )

အပိုကော်လံမျာသနဟင့် အညလဟန်သမျာသကို ဖန်တီသခဌင်သ။

message("Generate lables")
invisible(DBI::dbExecute(con, "ALTER TABLE doodles ADD label_int int"))
invisible(DBI::dbExecute(con, "UPDATE doodles SET label_int = dense_rank() OVER (ORDER BY word) - 1"))

message("Generate row numbers")
invisible(DBI::dbExecute(con, "ALTER TABLE doodles ADD id serial"))
invisible(DBI::dbExecute(con, "CREATE ORDERED INDEX doodles_id_ord_idx ON doodles(id)"))

ပျံသန်သနေသောအသုတ်တစ်ခုဖန်တီသခဌင်သ၏ပဌဿနာကိုဖဌေရဟင်သရန်၊ ကျလန်ုပ်တို့သည် ဇယာသမဟကျပန်သအတန်သမျာသကိုထုတ်ယူခဌင်သ၏အမဌင့်ဆုံသမဌန်နဟုန်သကိုရရဟိရန် လိုအပ်သည် doodles. ကအတလက် ကျလန်ုပ်တို့သည် လဟည့်ကလက် ၃ ခုကို အသုံသပဌုခဲ့သည်။ ပထမအချက်မဟာ စောင့်ကဌည့်ရေသ ID ကို သိမ်သဆည်သသည့် အမျိုသအစာသ၏ အတိုင်သအတာကို လျဟော့ချရန်ဖဌစ်သည်။ မူရင်သဒေတာအတလဲတလင် ID သိမ်သဆည်သရန် လိုအပ်သောအမျိုသအစာသမဟာ bigintဒါပေမယ့် လေ့လာတလေ့ရဟိချက်အရေအတလက်က အမျိုသအစာသအလိုက် ပုံမဟန်နံပါတ်နဲ့ ညီတဲ့ သူတို့ရဲ့ identifiers တလေကို အံကိုက်ဖဌစ်နိုင်စေတယ်။ int. ကကိစ္စတလင်ရဟာဖလေမဟုသည်အလလန်မဌန်သည်။ ဒုတိယ လဟည့်ကလက်ကတော့ သုံသဖို့ပါပဲ။ ORDERED INDEX — ရနိုင်သမျဟအာသလုံသကို ကျော်ဖဌတ်ပဌီသမဟ ကဆုံသဖဌတ်ချက်ကို မျက်မဌင်ကိုယ်တလေ့ ရောက်ရဟိလာပါသည်။ ရလေသချယ်မဟုမျာသ. တတိယအချက်မဟာ parameterized queries ကိုအသုံသပဌုရန်ဖဌစ်သည်။ method ၏ အနဟစ်သာရမဟာ command ကို တစ်ကဌိမ်တည်သ execute လုပ်ရန်ဖဌစ်သည်။ PREPARE အမျိုသအစာသတူ queries အစုအဝေသကို ဖန်တီသသောအခါတလင် ပဌင်ဆင်ထာသသော expression ကိုအသုံသပဌုခဌင်သဖဌင့်၊ သို့သော် တကယ်တော့ ရိုသရိုသရဟင်သရဟင်သတစ်ခုနဟင့် နဟိုင်သယဟဉ်လျဟင် အာသသာချက်တစ်ခုရဟိပါသည်။ SELECT ကိန်သဂဏန်သအမဟာသအယလင်သ၏အကလာအဝေသအတလင်သတလင်ရဟိခဲ့သည်။

ဒေတာတင်ခဌင်သလုပ်ငန်သစဉ်သည် RAM 450 MB ထက်မပိုပါ။ ဆိုလိုသည်မဟာ၊ ဖော်ပဌထာသသော ချဉ်သကပ်မဟုသည် သင့်အာသ ဆယ်ဂဏန်သရဟိသော ဂစ်ဂါဗိုက်အလေသချိန်ရဟိသော ဒေတာအတလဲမျာသကို ဘုတ်အဖလဲ့တစ်ခုတည်သ စက်ပစ္စည်သအချို့အပါအဝင် ဘတ်ဂျက် ဟာ့ဒ်ဝဲတိုင်သနီသပါသတလင် ရလဟေ့နိုင်စေသည်၊ အလလန်မိုက်သည်။

ကျန်ရဟိနေသေသသည်မဟာ အရလယ်အစာသအမျိုသမျိုသရဟိ နမူနာအတလဲမျာသကို နမူနာယူသည့်အခါ (ကျပန်သ) ဒေတာရယူခဌင်သ၏ အမဌန်နဟုန်သကို တိုင်သတာရန်ဖဌစ်သည်

ဒေတာဘေ့စ်စံနဟုန်သ

library(ggplot2)

set.seed(0)
# ППЎключеМОе к базе ЎаММых
con <- DBI::dbConnect(MonetDBLite::MonetDBLite(), Sys.getenv("DBDIR"))

# ЀуМкцОя Ўля пПЎгПтПвкО запрПса Ма стПрПМе сервера
prep_sql <- function(batch_size) {
  sql <- sprintf("PREPARE SELECT id FROM doodles WHERE id IN (%s)",
                 paste(rep("?", batch_size), collapse = ","))
  res <- DBI::dbSendQuery(con, sql)
  return(res)
}

# ЀуМкцОя Ўля ОзвлечеМОя ЎаММых
fetch_data <- function(rs, batch_size) {
  ids <- sample(seq_len(n), batch_size)
  res <- DBI::dbFetch(DBI::dbBind(rs, as.list(ids)))
  return(res)
}

# ПрПвеЎеМОе заЌера
res_bench <- bench::press(
  batch_size = 2^(4:10),
  {
    rs <- prep_sql(batch_size)
    bench::mark(
      fetch_data(rs, batch_size),
      min_iterations = 50L
    )
  }
)
# ПараЌетры беМчЌарка
cols <- c("batch_size", "min", "median", "max", "itr/sec", "total_time", "n_itr")
res_bench[, cols]

#   batch_size      min   median      max `itr/sec` total_time n_itr
#        <dbl> <bch:tm> <bch:tm> <bch:tm>     <dbl>   <bch:tm> <int>
# 1         16   23.6ms  54.02ms  93.43ms     18.8        2.6s    49
# 2         32     38ms  84.83ms 151.55ms     11.4       4.29s    49
# 3         64   63.3ms 175.54ms 248.94ms     5.85       8.54s    50
# 4        128   83.2ms 341.52ms 496.24ms     3.00      16.69s    50
# 5        256  232.8ms 653.21ms 847.44ms     1.58      31.66s    50
# 6        512  784.6ms    1.41s    1.98s     0.740       1.1m    49
# 7       1024  681.7ms    2.72s    4.06s     0.377      2.16m    49

ggplot(res_bench, aes(x = factor(batch_size), y = median, group = 1)) +
  geom_point() +
  geom_line() +
  ylab("median time, s") +
  theme_minimal()

DBI::dbDisconnect(con, shutdown = TRUE)

Quick Draw Doodle အသိအမဟတ်ပဌုမဟု- R၊ C++ နဟင့် neural networks မျာသနဟင့် မိတ်ဆလေဖလဲ့နည်သ

2. အတလဲမျာသပဌင်ဆင်ခဌင်သ။

အသုတ်ပဌင်ဆင်မဟုလုပ်ငန်သစဉ်တစ်ခုလုံသတလင် အောက်ပါအဆင့်မျာသ ပါဝင်သည်-

  1. အမဟတ်မျာသ၏ သဌဒီနိတ်မျာသဖဌင့် လိုင်သကလက်မျာသပါရဟိသော JSON အမျာသအပဌာသကို ပိုင်သခဌာသစိတ်ဖဌာခဌင်သ။
  2. လိုအပ်သောအရလယ်အစာသပုံတစ်ခုပေါ်ရဟိ အမဟတ်မျာသ၏ သဌဒီနိတ်မျာသအပေါ်အခဌေခံ၍ ရောင်စုံမျဉ်သကဌောင်သမျာသရေသဆလဲခဌင်သ (ဥပမာ၊ 256×256 သို့မဟုတ် 128×128)။
  3. ရလာတဲ့ပုံတလေကို tensor အဖဌစ်ပဌောင်သခဌင်သ။

Python kernels မျာသကဌာသတလင် ယဟဉ်ပဌိုင်မဟု၏ တစ်စိတ်တစ်ပိုင်သအနေဖဌင့် ပဌဿနာကို အဓိကအာသဖဌင့် ဖဌေရဟင်သခဲ့သည်။ OpenCV. R တလင် အရိုသရဟင်သဆုံသနဟင့် အထင်ရဟာသဆုံသ analogues မျာသထဲမဟ တစ်ခုသည် ကကဲ့သို့ ဖဌစ်သည်-

R တလင် Tensor ပဌောင်သခဌင်သသို့ JSON ကို အကောင်အထည်ဖော်ခဌင်သ။

r_process_json_str <- function(json, line.width = 3, 
                               color = TRUE, scale = 1) {
  # ПарсОМг JSON
  coords <- jsonlite::fromJSON(json, simplifyMatrix = FALSE)
  tmp <- tempfile()
  # УЎаляеЌ вреЌеММый файл пП завершеМОю фуМкцОО
  on.exit(unlink(tmp))
  png(filename = tmp, width = 256 * scale, height = 256 * scale, pointsize = 1)
  # ПустПй графОк
  plot.new()
  # РазЌер ПкМа графОка
  plot.window(xlim = c(256 * scale, 0), ylim = c(256 * scale, 0))
  # Њвета лОМОй
  cols <- if (color) rainbow(length(coords)) else "#000000"
  for (i in seq_along(coords)) {
    lines(x = coords[[i]][[1]] * scale, y = coords[[i]][[2]] * scale, 
          col = cols[i], lwd = line.width)
  }
  dev.off()
  # ПреПбразПваМОе ОзПбражеМОя в 3-х ЌерМый ЌассОв
  res <- png::readPNG(tmp)
  return(res)
}

r_process_json_vector <- function(x, ...) {
  res <- lapply(x, r_process_json_str, ...)
  # ОбъеЎОМеМОе 3-х ЌерМых ЌассОвПв картОМПк в 4-х ЌерМый в теМзПр
  res <- do.call(abind::abind, c(res, along = 0))
  return(res)
}

ပုံဆလဲခဌင်သကို ပုံမဟန် R ကိရိယာမျာသကို အသုံသပဌု၍ RAM တလင် သိမ်သဆည်သထာသသော ယာယီ PNG တလင် သိမ်သဆည်သထာသပါသည် (Linux တလင် ယာယီ R လမ်သညလဟန်မျာသသည် လမ်သညလဟန်ထဲတလင် တည်ရဟိသည် /tmpRAM တလင်တပ်ဆင်ထာသသည်။) ထို့နောက် ကဖိုင်ကို 0 မဟ 1 အထိ နံပါတ်မျာသပါရဟိသော သုံသဖက်မဌင် ခင်သကျင်သတစ်ခုအဖဌစ် ဖတ်သည်။ ပိုသမာသရိုသကျ BMP ကို ​​hex ရောင်ကုဒ်မျာသဖဌင့် အကဌမ်သခင်သတစ်ခုသို့ ဖတ်မည်ဖဌစ်သောကဌောင့် အရေသကဌီသပါသည်။

ရလဒ်ကို စမ်သသပ်ကဌည့်ရအောင်။

zip_file <- file.path("data", "train_simplified.zip")
csv_file <- "cat.csv"
unzip(zip_file, files = csv_file, exdir = tempdir(), 
      junkpaths = TRUE, unzip = getOption("unzip"))
tmp_data <- data.table::fread(file.path(tempdir(), csv_file), sep = ",", 
                              select = "drawing", nrows = 10000)
arr <- r_process_json_str(tmp_data[4, drawing])
dim(arr)
# [1] 256 256   3
plot(magick::image_read(arr))

Quick Draw Doodle အသိအမဟတ်ပဌုမဟု- R၊ C++ နဟင့် neural networks မျာသနဟင့် မိတ်ဆလေဖလဲ့နည်သ

အသုတ်ကိုယ်တိုင် အောက်ပါအတိုင်သ ဖလဲ့စည်သမည်ဖဌစ်ပါသည်။

res <- r_process_json_vector(tmp_data[1:4, drawing], scale = 0.5)
str(res)
 # num [1:4, 1:128, 1:128, 1:3] 1 1 1 1 1 1 1 1 1 1 ...
 # - attr(*, "dimnames")=List of 4
 #  ..$ : NULL
 #  ..$ : NULL
 #  ..$ : NULL
 #  ..$ : NULL

အစီအစဥ်ကဌီသမျာသဖလဲ့စည်သခဌင်သသည် မတော်တရော်အချိန်ကဌာမဌင့်သည့်အတလက်ကဌောင့် ကအကောင်အထည်ဖော်မဟုသည် ကျလန်ုပ်တို့အတလက် အသင့်တော်ဆုံသဟုထင်ရပဌီသ အစလမ်သထက်သောစာကဌည့်တိုက်ကိုအသုံသပဌုခဌင်သဖဌင့် ကျလန်ုပ်တို့၏လုပ်ဖော်ကိုင်ဖက်မျာသ၏အတလေ့အကဌုံကို အခလင့်ကောင်သယူရန် ဆုံသဖဌတ်ခဲ့သည်။ OpenCV. ထိုအချိန်တလင် R အတလက် အဆင်သင့်လုပ်ထာသသော ပက်ကေ့ဂျ်မရဟိပါ (ယခုမရဟိပါ) ထို့ကဌောင့် လိုအပ်သော လုပ်ဆောင်နိုင်စလမ်သကို C++ ဖဌင့် R ကုဒ်သို့ ပေါင်သစည်သခဌင်သဖဌင့် အနည်သငယ်မျဟသာ အကောင်ထည်ဖော်ခဲ့ပါသည်။ Rcpp.

ပဌဿနာကိုဖဌေရဟင်သရန်၊ အောက်ပါ ပက်ကေ့ဂျ်မျာသနဟင့် စာကဌည့်တိုက်မျာသကို အသုံသပဌုခဲ့သည်-

  1. OpenCV ပုံမျာသနဟင့် မျဉ်သကဌောင်သမျာသဖဌင့် အလုပ်လုပ်ရန်။ ကဌိုတင်ထည့်သလင်သထာသသည့် စနစ်ဒစ်ဂျစ်တိုက်မျာသနဟင့် ခေါင်သစီသဖိုင်မျာသအပဌင် ရလေ့လျာသချိတ်ဆက်ခဌင်သကို အသုံသပဌုထာသသည်။

  2. xtensor multidimensional arrays နဟင့် tensors မျာသနဟင့်အလုပ်လုပ်ရန်အတလက်။ ကျလန်ုပ်တို့သည် နာမည်တူ R ပက်ကေ့ခ်ျတလင် ပါဝင်သော ခေါင်သစီသဖိုင်မျာသကို အသုံသပဌုခဲ့သည်။ စာကဌည့်တိုက်သည် သင့်အာသ အတန်သအဓိကနဟင့် ကော်လံအကဌီသစာသအစီအစဥ်အရ ဘက်စုံအခင်သအကျင်သမျာသဖဌင့် လုပ်ဆောင်နိုင်စေပါသည်။

  3. ndjson JSON ပိုင်သခဌာသရန်။ ကစာကဌည့်တိုက်ကို အသုံသပဌုသည်။ xtensor ပရောဂျက်တလင် ရဟိနေလျဟင် အလိုအလျောက်။

  4. RcppThread JSON မဟ vector တစ်ခု၏ multi-threaded processing ကို စီစဉ်ရန်။ ကပက်ကေ့ဂျ်မဟ ပံ့ပိုသပေသသော ခေါင်သစီသဖိုင်မျာသကို အသုံသပဌုခဲ့သည်။ ပိုနာမည်ကဌီသလာတာ RcppParallel ပက်ကေ့ဂျ်တလင် အခဌာသအရာမျာသကဌာသတလင် တပ်ဆင်ထာသသော စက်ဝိုင်သကဌာသဖဌတ်စနစ်ပါရဟိသည်။

ထိုသို့သတိပဌုရကျိုသနပ်သည် xtensor နတ်ဘုရာသမျာသဖဌစ်လာသည်- ၎င်သတလင် ကျယ်ပဌန့်သောလုပ်ဆောင်နိုင်စလမ်သနဟင့် စလမ်သဆောင်ရည်မဌင့်မာသသည့်အချက်အပဌင်၊ ၎င်သ၏ဆော့ဖ်ဝဲအင်ဂျင်နီယာမျာသသည် အတော်လေသတုံ့ပဌန်မဟုနဟင့် မေသခလန်သမျာသကို ချက်ခဌင်သအသေသစိတ်ဖဌေကဌာသပေသခဲ့ကဌသည်။ ၎င်သတို့၏အကူအညီဖဌင့်၊ OpenCV matrices ၏ xtensor tensors မျာသအဖဌစ် အသလင်ပဌောင်သခဌင်သအပဌင် 3-ဖက်မဌင်ရုပ်ပုံတင်သဆာမျာသကို မဟန်ကန်သောအတိုင်သအတာ၏ 4-dimensional tensor အဖဌစ် (အသုတ်ကိုယ်တိုင်) ပေါင်သစပ်ရန် နည်သလမ်သတစ်ခုလည်သ ဖဌစ်နိုင်သည်။

Rcpp၊ xtensor နဟင့် RcppThread သင်ယူရန်အတလက် ပစ္စည်သမျာသ

https://thecoatlessprofessor.com/programming/unofficial-rcpp-api-documentation

https://docs.opencv.org/4.0.1/d7/dbd/group__imgproc.html

https://xtensor.readthedocs.io/en/latest/

https://xtensor.readthedocs.io/en/latest/file_loading.html#loading-json-data-into-xtensor

https://cran.r-project.org/web/packages/RcppThread/vignettes/RcppThread-vignette.pdf

စနစ်ဖိုင်မျာသနဟင့် စနစ်တလင်ထည့်သလင်သထာသသည့် ဒစ်ဂျစ်တယ်မျာသနဟင့် ရလေ့လျာသချိတ်ဆက်ခဌင်သတို့ကို အသုံသပဌုသည့် ဖိုင်မျာသကို စုစည်သရန်၊ ပက်ကေ့ဂျ်တလင် အကောင်အထည်ဖော်ထာသသည့် ပလပ်အင်ယန္တရာသကို ကျလန်ုပ်တို့ အသုံသပဌုခဲ့သည်။ Rcpp. လမ်သကဌောင်သမျာသနဟင့် အလံမျာသကို အလိုအလျောက်ရဟာဖလေရန်၊ ကျလန်ုပ်တို့သည် လူကဌိုက်မျာသသော Linux utility ကို အသုံသပဌုခဲ့သည်။ pkg-config ကို.

OpenCV စာကဌည့်တိုက်ကို အသုံသပဌုရန်အတလက် Rcpp plugin ကို အကောင်အထည်ဖော်ခဌင်သ။

Rcpp::registerPlugin("opencv", function() {
  # ВПзЌПжМые МазваМОя пакета
  pkg_config_name <- c("opencv", "opencv4")
  # БОМарМый файл утОлОты pkg-config
  pkg_config_bin <- Sys.which("pkg-config")
  # ПрПврека МалОчОя утОлОты в сОстеЌе
  checkmate::assert_file_exists(pkg_config_bin, access = "x")
  # ПрПверка МалОчОя файла МастрПек OpenCV Ўля pkg-config
  check <- sapply(pkg_config_name, 
                  function(pkg) system(paste(pkg_config_bin, pkg)))
  if (all(check != 0)) {
    stop("OpenCV config for the pkg-config not found", call. = FALSE)
  }

  pkg_config_name <- pkg_config_name[check == 0]
  list(env = list(
    PKG_CXXFLAGS = system(paste(pkg_config_bin, "--cflags", pkg_config_name), 
                          intern = TRUE),
    PKG_LIBS = system(paste(pkg_config_bin, "--libs", pkg_config_name), 
                      intern = TRUE)
  ))
})

ပလပ်အင်၏လုပ်ဆောင်ချက်ကဌောင့်၊ စုစည်သမဟုလုပ်ငန်သစဉ်အတလင်သ အောက်ပါတန်ဖိုသမျာသကို အစာသထိုသပေသမည်-

Rcpp:::.plugins$opencv()$env

# $PKG_CXXFLAGS
# [1] "-I/usr/include/opencv"
#
# $PKG_LIBS
# [1] "-lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_datasets -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_line_descriptor -lopencv_optflow -lopencv_video -lopencv_plot -lopencv_reg -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_rgbd -lopencv_viz -lopencv_surface_matching -lopencv_text -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_xobjdetect -lopencv_objdetect -lopencv_ml -lopencv_xphoto -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_photo -lopencv_imgproc -lopencv_core"

JSON ကို ခလဲခဌမ်သစိတ်ဖဌာပဌီသ မော်ဒယ်သို့ ထုတ်လလဟင့်ခဌင်သအတလက် အသုတ်တစ်ခု ဖန်တီသခဌင်သအတလက် အကောင်အထည်ဖော်မဟုကုဒ်ကို spoiler အောက်တလင် ပေသထာသသည်။ ပထမညသစလာ၊ ခေါင်သစီသဖိုင်မျာသကိုရဟာဖလေရန် (ndjson အတလက်လိုအပ်သည်) ကိုရဟာဖလေရန် ဒေသခံပရောဂျက်လမ်သညလဟန်တစ်ခုကို ထည့်ပါ။

Sys.setenv("PKG_CXXFLAGS" = paste0("-I", normalizePath(file.path("src"))))

C++ တလင် tensor ပဌောင်သလဲခဌင်သသို့ JSON ကို အကောင်အထည်ဖော်ခဌင်သ။

// [[Rcpp::plugins(cpp14)]]
// [[Rcpp::plugins(opencv)]]
// [[Rcpp::depends(xtensor)]]
// [[Rcpp::depends(RcppThread)]]

#include <xtensor/xjson.hpp>
#include <xtensor/xadapt.hpp>
#include <xtensor/xview.hpp>
#include <xtensor-r/rtensor.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <Rcpp.h>
#include <RcppThread.h>

// СОМПМОЌы Ўля тОпПв
using RcppThread::parallelFor;
using json = nlohmann::json;
using points = xt::xtensor<double,2>;     // ИзвлечёММые Оз JSON кППрЎОМаты тПчек
using strokes = std::vector<points>;      // ИзвлечёММые Оз JSON кППрЎОМаты тПчек
using xtensor3d = xt::xtensor<double, 3>; // ТеМзПр Ўля храМеМОя ЌатрОцы ОзППбражеМОя
using xtensor4d = xt::xtensor<double, 4>; // ТеМзПр Ўля храМеМОя ЌМПжества ОзПбражеМОй
using rtensor3d = xt::rtensor<double, 3>; // Обёртка Ўля экспПрта в R
using rtensor4d = xt::rtensor<double, 4>; // Обёртка Ўля экспПрта в R

// СтатОческОе кПМстаМты
// РазЌер ОзПбражеМОя в пОкселях
const static int SIZE = 256;
// ТОп лОМОО
// СЌ. https://en.wikipedia.org/wiki/Pixel_connectivity#2-dimensional
const static int LINE_TYPE = cv::LINE_4;
// ТПлщОМа лОМОО в пОкселях
const static int LINE_WIDTH = 3;
// АлгПрОтЌ ресайза
// https://docs.opencv.org/3.1.0/da/d54/group__imgproc__transform.html#ga5bb5a1fea74ea38e1a5445ca803ff121
const static int RESIZE_TYPE = cv::INTER_LINEAR;

// КаблПМ Ўля кПМвертОрПваМОя OpenCV-ЌатрОцы в теМзПр
template <typename T, int NCH, typename XT=xt::xtensor<T,3,xt::layout_type::column_major>>
XT to_xt(const cv::Mat_<cv::Vec<T, NCH>>& src) {
  // РазЌерМПсть целевПгП теМзПра
  std::vector<int> shape = {src.rows, src.cols, NCH};
  // Общее кПлОчествП элеЌеМтПв в ЌассОве
  size_t size = src.total() * NCH;
  // ПреПбразПваМОе cv::Mat в xt::xtensor
  XT res = xt::adapt((T*) src.data, size, xt::no_ownership(), shape);
  return res;
}

// ПреПбразПваМОе JSON в спОсПк кППрЎОМат тПчек
strokes parse_json(const std::string& x) {
  auto j = json::parse(x);
  // Результат парсОМга ЎПлжеМ быть ЌассОвПЌ
  if (!j.is_array()) {
    throw std::runtime_error("'x' must be JSON array.");
  }
  strokes res;
  res.reserve(j.size());
  for (const auto& a: j) {
    // КажЎый элеЌеМт ЌассОва ЎПлжеМ быть 2-ЌерМыЌ ЌассОвПЌ
    if (!a.is_array() || a.size() != 2) {
      throw std::runtime_error("'x' must include only 2d arrays.");
    }
    // ИзвлечеМОе вектПра тПчек
    auto p = a.get<points>();
    res.push_back(p);
  }
  return res;
}

// ОтрОсПвка лОМОй
// Њвета HSV
cv::Mat ocv_draw_lines(const strokes& x, bool color = true) {
  // ИсхПЎМый тОп ЌатрОцы
  auto stype = color ? CV_8UC3 : CV_8UC1;
  // ИтПгПвый тОп ЌатрОцы
  auto dtype = color ? CV_32FC3 : CV_32FC1;
  auto bg = color ? cv::Scalar(0, 0, 255) : cv::Scalar(255);
  auto col = color ? cv::Scalar(0, 255, 220) : cv::Scalar(0);
  cv::Mat img = cv::Mat(SIZE, SIZE, stype, bg);
  // КПлОчествП лОМОй
  size_t n = x.size();
  for (const auto& s: x) {
    // КПлОчествП тПчек в лОМОО
    size_t n_points = s.shape()[1];
    for (size_t i = 0; i < n_points - 1; ++i) {
      // ТПчка Мачала штрОха
      cv::Point from(s(0, i), s(1, i));
      // ТПчка ПкПМчаМОя штрОха
      cv::Point to(s(0, i + 1), s(1, i + 1));
      // ОтрОсПвка лОМОО
      cv::line(img, from, to, col, LINE_WIDTH, LINE_TYPE);
    }
    if (color) {
      // МеМяеЌ цвет лОМОО
      col[0] += 180 / n;
    }
  }
  if (color) {
    // МеМяеЌ цветПвПе преЎставлеМОе Ма RGB
    cv::cvtColor(img, img, cv::COLOR_HSV2RGB);
  }
  // МеМяеЌ фПрЌат преЎставлеМОя Ма float32 с ЎОапазПМПЌ [0, 1]
  img.convertTo(img, dtype, 1 / 255.0);
  return img;
}

// ОбрабПтка JSON О пПлучеМОе теМзПра с ЎаММыЌО ОзПбражеМОя
xtensor3d process(const std::string& x, double scale = 1.0, bool color = true) {
  auto p = parse_json(x);
  auto img = ocv_draw_lines(p, color);
  if (scale != 1) {
    cv::Mat out;
    cv::resize(img, out, cv::Size(), scale, scale, RESIZE_TYPE);
    cv::swap(img, out);
    out.release();
  }
  xtensor3d arr = color ? to_xt<double,3>(img) : to_xt<double,1>(img);
  return arr;
}

// [[Rcpp::export]]
rtensor3d cpp_process_json_str(const std::string& x, 
                               double scale = 1.0, 
                               bool color = true) {
  xtensor3d res = process(x, scale, color);
  return res;
}

// [[Rcpp::export]]
rtensor4d cpp_process_json_vector(const std::vector<std::string>& x, 
                                  double scale = 1.0, 
                                  bool color = false) {
  size_t n = x.size();
  size_t dim = floor(SIZE * scale);
  size_t channels = color ? 3 : 1;
  xtensor4d res({n, dim, dim, channels});
  parallelFor(0, n, [&x, &res, scale, color](int i) {
    xtensor3d tmp = process(x[i], scale, color);
    auto view = xt::view(res, i, xt::all(), xt::all(), xt::all());
    view = tmp;
  });
  return res;
}

ဒီကုဒ်ကို ဖိုင်ထဲမဟာ ထည့်ထာသသင့်ပါတယ်။ src/cv_xt.cpp command ဖဌင့် compile လုပ်ပါ။ Rcpp::sourceCpp(file = "src/cv_xt.cpp", env = .GlobalEnv); အလုပ်အတလက်လည်သ လိုအပ်တယ်။ nlohmann/json.hpp မဟ သိုလဟောင်မဟု. ကုဒ်ကို လုပ်ဆောင်ချက်မျာသစလာဖဌင့် ပိုင်သခဌာသထာသသည်။

  • to_xt — image matrix တစ်ခုအသလင်ပဌောင်သရန်အတလက် နမူနာပုံစံလုပ်ဆောင်ချက်တစ်ခု (cv::Mat) tensor တစ်ခုသို့ xt::xtensor;

  • parse_json — လုပ်ဆောင်ချက်သည် JSON စာကဌောင်သတစ်ခုကို ခလဲခဌမ်သစိပ်ဖဌာပဌီသ အမဟတ်မျာသ၏ သဌဒီနိတ်မျာသကို ထုတ်ယူကာ vector တစ်ခုအဖဌစ် ထုပ်ပိုသသည်။

  • ocv_draw_lines - အမဟတ်မျာသ၏ရလဒ် vector မဟ ရောင်စုံမျဉ်သကဌောင်သမျာသဆလဲပါ။

  • process — အထက်ဖော်ပဌပါ လုပ်ဆောင်ချက်မျာသကို ပေါင်သစပ်ပဌီသ ထလက်ပေါ်လာသော ရုပ်ပုံအာသ အတိုင်သအတာကို ချဲ့ထလင်နိုင်စလမ်သကိုလည်သ ပေါင်သထည့်သည်။

  • cpp_process_json_str - function ကိုကျော်ထုပ်ပိုသ processရလဒ်ကို R-object ( multidimensional array ) သို့ တင်ပို့သည်။

  • cpp_process_json_vector - function ကိုကျော်ထုပ်ပိုသ cpp_process_json_strMulti-threaded မုဒ်တလင် string vector တစ်ခုကို လုပ်ဆောင်ရန် ခလင့်ပဌုသည်။

ရောင်စုံလိုင်သမျာသဆလဲရန် HSV အရောင်မော်ဒယ်ကို အသုံသပဌုပဌီသ RGB သို့ပဌောင်သသည်။ ရလဒ်ကို စမ်သသပ်ကဌည့်ရအောင်။

arr <- cpp_process_json_str(tmp_data[4, drawing])
dim(arr)
# [1] 256 256   3
plot(magick::image_read(arr))

Quick Draw Doodle အသိအမဟတ်ပဌုမဟု- R၊ C++ နဟင့် neural networks မျာသနဟင့် မိတ်ဆလေဖလဲ့နည်သ
R နဟင့် C++ တလင် အကောင်အထည်ဖော်မဟုအမဌန်နဟုန်သကို နဟိုင်သယဟဉ်ခဌင်သ။

res_bench <- bench::mark(
  r_process_json_str(tmp_data[4, drawing], scale = 0.5),
  cpp_process_json_str(tmp_data[4, drawing], scale = 0.5),
  check = FALSE,
  min_iterations = 100
)
# ПараЌетры беМчЌарка
cols <- c("expression", "min", "median", "max", "itr/sec", "total_time", "n_itr")
res_bench[, cols]

#   expression                min     median       max `itr/sec` total_time  n_itr
#   <chr>                <bch:tm>   <bch:tm>  <bch:tm>     <dbl>   <bch:tm>  <int>
# 1 r_process_json_str     3.49ms     3.55ms    4.47ms      273.      490ms    134
# 2 cpp_process_json_str   1.94ms     2.02ms    5.32ms      489.      497ms    243

library(ggplot2)
# ПрПвеЎеМОе заЌера
res_bench <- bench::press(
  batch_size = 2^(4:10),
  {
    .data <- tmp_data[sample(seq_len(.N), batch_size), drawing]
    bench::mark(
      r_process_json_vector(.data, scale = 0.5),
      cpp_process_json_vector(.data,  scale = 0.5),
      min_iterations = 50,
      check = FALSE
    )
  }
)

res_bench[, cols]

#    expression   batch_size      min   median      max `itr/sec` total_time n_itr
#    <chr>             <dbl> <bch:tm> <bch:tm> <bch:tm>     <dbl>   <bch:tm> <int>
#  1 r                   16   50.61ms  53.34ms  54.82ms    19.1     471.13ms     9
#  2 cpp                 16    4.46ms   5.39ms   7.78ms   192.      474.09ms    91
#  3 r                   32   105.7ms 109.74ms 212.26ms     7.69        6.5s    50
#  4 cpp                 32    7.76ms  10.97ms  15.23ms    95.6     522.78ms    50
#  5 r                   64  211.41ms 226.18ms 332.65ms     3.85      12.99s    50
#  6 cpp                 64   25.09ms  27.34ms  32.04ms    36.0        1.39s    50
#  7 r                  128   534.5ms 627.92ms 659.08ms     1.61      31.03s    50
#  8 cpp                128   56.37ms  58.46ms  66.03ms    16.9        2.95s    50
#  9 r                  256     1.15s    1.18s    1.29s     0.851     58.78s    50
# 10 cpp                256  114.97ms 117.39ms 130.09ms     8.45       5.92s    50
# 11 r                  512     2.09s    2.15s    2.32s     0.463       1.8m    50
# 12 cpp                512  230.81ms  235.6ms 261.99ms     4.18      11.97s    50
# 13 r                 1024        4s    4.22s     4.4s     0.238       3.5m    50
# 14 cpp               1024  410.48ms 431.43ms 462.44ms     2.33      21.45s    50

ggplot(res_bench, aes(x = factor(batch_size), y = median, 
                      group =  expression, color = expression)) +
  geom_point() +
  geom_line() +
  ylab("median time, s") +
  theme_minimal() +
  scale_color_discrete(name = "", labels = c("cpp", "r")) +
  theme(legend.position = "bottom") 

Quick Draw Doodle အသိအမဟတ်ပဌုမဟု- R၊ C++ နဟင့် neural networks မျာသနဟင့် မိတ်ဆလေဖလဲ့နည်သ

သင်တလေ့မဌင်ရသည့်အတိုင်သ မဌန်နဟုန်သတိုသမဟုသည် အလလန်သိသာထင်ရဟာသလာပဌီသ R ကုဒ်ကို အပဌိုင်ပဌုလုပ်ခဌင်သဖဌင့် C++ ကုဒ်ကို အမီလိုက်ရန် မဖဌစ်နိုင်ပါ။

3. ဒေတာဘေ့စ်မဟ အတလဲမျာသကို လလဟင့်တင်ရန်အတလက် Iterators

R သည် RAM တလင် အံဝင်ခလင်ကျရဟိသော ဒေတာကို စီမံဆောင်ရလက်ပေသခဌင်သအတလက် ထိုက်တန်သော ဂုဏ်သတင်သတစ်ခု ရဟိပဌီသ Python သည် သင့်အာသ ပဌင်ပမဟတ်ဉာဏ်ကို အသုံသပဌု၍ တလက်ချက်မဟုမျာသ (ပဌင်ပမဟတ်ဉာဏ်ကို အသုံသပဌု၍ တလက်ချက်မဟုမျာသ) ကို လလယ်ကူပဌီသ သဘာဝကျကျ လုပ်ဆောင်နိုင်စေမည့် ထပ်တလဲလဲ ဒေတာလုပ်ဆောင်ခဌင်သဖဌင့် ပိုမိုသလင်ပဌင်လက္ခဏာရဟိသည်။ ဖော်ပဌထာသသောပဌဿနာ၏အခဌေအနေတလင် ကျလန်ုပ်တို့အတလက် ဂန္ထဝင်နဟင့်သက်ဆိုင်သော ဥပမာတစ်ခုသည် သေသငယ်သောအစိတ်အပိုင်သ သို့မဟုတ် အသေသစာသအသုတ်ကို အသုံသပဌု၍ အဆင့်တစ်ဆင့်ချင်သစီရဟိ gradient ၏အနီသစပ်ဆုံသနည်သလမ်သဖဌင့် လေ့ကျင့်ထာသသော နက်နဲသောအာရုံကဌောကလန်ရက်မျာသဖဌစ်သည်။

Python တလင်ရေသထာသသော နက်ရဟိုင်သသောသင်ယူမဟုဘောင်မျာသတလင် ဒေတာအပေါ်အခဌေခံ၍ iterators မျာသကိုအကောင်အထည်ဖော်သည့် အထူသအတန်သမျာသရဟိသည်- ဇယာသမျာသ၊ ဖိုင်တလဲမျာသရဟိပုံမျာသ၊ binary ဖော်မတ်မျာသစသည်ဖဌင့် အဆင်သင့်လုပ်ထာသသောရလေသချယ်စရာမျာသကိုသုံသနိုင်သည် သို့မဟုတ် သီသခဌာသလုပ်ဆောင်စရာမျာသအတလက် သင့်ကိုယ်ပိုင်ရေသသာသနိုင်သည်။ R တလင် ကျလန်ုပ်တို့သည် Python စာကဌည့်တိုက်၏ အင်္ဂါရပ်အာသလုံသကို အသုံသချနိုင်သည်။ ကရာသ အထုပ်၏ထိပ်တလင်အလုပ်လုပ်သောအမည်တူအထုပ်ကိုအသုံသပဌုပဌီသ၎င်သ၏အမျိုသမျိုသသော backend မျာသနဟင့်အတူ နယူသယောက်မဌို့. နောက်ဆုံသတလင် သီသခဌာသရဟည်လျာသသော ဆောင်သပါသတစ်ပုဒ်ကို ထိုက်တန်ပါသည်။ ၎င်သသည် သင့်အာသ R မဟ Python ကုဒ်ကို run နိုင်ရုံသာမက R နဟင့် Python sessions မျာသကဌာသတလင် အရာဝတ္ထုမျာသကို လလဟဲပဌောင်သပေသကာ လိုအပ်သောအမျိုသအစာသကူသပဌောင်သမဟုမျာသကို အလိုအလျောက်လုပ်ဆောင်နိုင်စေမည်ဖဌစ်သည်။

MonetDBLite ကို အသုံသပဌု၍ RAM တလင် ဒေတာအာသလုံသကို သိမ်သဆည်သထာသရန် လိုအပ်မဟုကို ဖယ်ရဟာသလိုက်ပဌီသ၊ "Neural Network" အာသလုံသကို Python တလင် မူရင်သကုဒ်ဖဌင့် လုပ်ဆောင်သလာသမည်ဖဌစ်ပဌီသ၊ ကျလန်ုပ်တို့သည် ဒေတာပေါ်တလင် ထပ်လောင်သရေသသာသရန် လိုအပ်သောကဌောင့်၊ R သို့မဟုတ် Python တလင်ထိုကဲ့သို့သောအခဌေအနေအတလက်။ ၎င်သအတလက် အခဌေခံအာသဖဌင့် လိုအပ်ချက် နဟစ်ခုသာ ရဟိသည်- ၎င်သသည် အဆုံသမရဟိသော ကလက်လပ်တစ်ခုတလင် အစုလိုက်အစည်သမျာသကို ပဌန်၍ ထပ်ခါထပ်ခါ လုပ်ဆောင်မဟုမျာသကဌာသတလင် ၎င်သ၏အခဌေအနေကို သိမ်သဆည်သရမည် (နောက်ပိုင်သတလင် R သည် အရိုသရဟင်သဆုံသနည်သလမ်သဖဌင့် အကောင်အထည်ဖော်သည်)။ ယခင်က၊ R array မျာသကို iterator အတလင်သရဟိ numpy array မျာသအဖဌစ်သို့ ပဌတ်သာသစလာပဌောင်သလဲရန် လိုအပ်သော်လည်သ၊ package ၏ လက်ရဟိဗာသရဟင်သ ကရာသ သူကိုယ်တိုင်လုပ်တယ်။

လေ့ကျင့်ရေသ နဟင့် မဟန်ကန်ကဌောင်သ အချက်အလက်မျာသအတလက် ထပ်လောင်သလဟည့်ပေသသူမဟာ အောက်ပါအတိုင်သဖဌစ်သည် ။

လေ့ကျင့်ရေသနဟင့် အတည်ပဌုချက်ဒေတာအတလက် Iterator

train_generator <- function(db_connection = con,
                            samples_index,
                            num_classes = 340,
                            batch_size = 32,
                            scale = 1,
                            color = FALSE,
                            imagenet_preproc = FALSE) {
  # ПрПверка аргуЌеМтПв
  checkmate::assert_class(con, "DBIConnection")
  checkmate::assert_integerish(samples_index)
  checkmate::assert_count(num_classes)
  checkmate::assert_count(batch_size)
  checkmate::assert_number(scale, lower = 0.001, upper = 5)
  checkmate::assert_flag(color)
  checkmate::assert_flag(imagenet_preproc)

  # ПереЌешОваеЌ, чтПбы брать О уЎалять ОспПльзПваММые ОМЎексы батчей пП пПряЎку
  dt <- data.table::data.table(id = sample(samples_index))
  # ПрПставляеЌ МПЌера батчей
  dt[, batch := (.I - 1L) %/% batch_size + 1L]
  # ОставляеЌ тПлькП пПлМые батчО О ОМЎексОруеЌ
  dt <- dt[, if (.N == batch_size) .SD, keyby = batch]
  # УстаМавлОваеЌ счётчОк
  i <- 1
  # КПлОчествП батчей
  max_i <- dt[, max(batch)]

  # ППЎгПтПвка выражеМОя Ўля выгрузкО
  sql <- sprintf(
    "PREPARE SELECT drawing, label_int FROM doodles WHERE id IN (%s)",
    paste(rep("?", batch_size), collapse = ",")
  )
  res <- DBI::dbSendQuery(con, sql)

  # АМалПг keras::to_categorical
  to_categorical <- function(x, num) {
    n <- length(x)
    m <- numeric(n * num)
    m[x * n + seq_len(n)] <- 1
    dim(m) <- c(n, num)
    return(m)
  }

  # ЗаЌыкаМОе
  function() {
    # НачОМаеЌ МПвую эпПху
    if (i > max_i) {
      dt[, id := sample(id)]
      data.table::setkey(dt, batch)
      # СбрасываеЌ счётчОк
      i <<- 1
      max_i <<- dt[, max(batch)]
    }

    # ID Ўля выгрузкО ЎаММых
    batch_ind <- dt[batch == i, id]
    # Выгрузка ЎаММых
    batch <- DBI::dbFetch(DBI::dbBind(res, as.list(batch_ind)), n = -1)

    # УвелОчОваеЌ счётчОк
    i <<- i + 1

    # ПарсОМг JSON О пПЎгПтПвка ЌассОва
    batch_x <- cpp_process_json_vector(batch$drawing, scale = scale, color = color)
    if (imagenet_preproc) {
      # КкалОрПваМОе c ОМтервала [0, 1] Ма ОМтервал [-1, 1]
      batch_x <- (batch_x - 0.5) * 2
    }

    batch_y <- to_categorical(batch$label_int, num_classes)
    result <- list(batch_x, batch_y)
    return(result)
  }
}

လုပ်ဆောင်ချက်သည် ဒေတာဘေ့စ်သို့ ချိတ်ဆက်မဟုနဟင့်အတူ ကိန်သရဟင်တစ်ခုအာသ ထည့်သလင်သခဌင်သ၊ အသုံသပဌုထာသသော လိုင်သနံပါတ်မျာသ၊ အတန်သအရေအတလက်၊ အတလဲအရလယ်အစာသ၊ အတိုင်သအတာ (scale = 1 256x256 pixels ၏ rendering ပုံမျာသနဟင့် ကိုက်ညီသည်၊ scale = 0.5 — 128x128 pixels)၊ အရောင်အညလဟန်သ (color = FALSE အသုံသပဌုသည့်အခါ မီသခိုသရောင်စကေသဖဌင့် rendering ကို သတ်မဟတ်သည်။ color = TRUE လေဖဌတ်ခဌင်သတစ်ခုစီကို အရောင်အသစ်ဖဌင့် ရေသဆလဲထာသသည်) နဟင့် imagenet တလင် ကဌိုတင်လေ့ကျင့်ထာသသော ကလန်ရက်မျာသအတလက် ကဌိုတင်လုပ်ဆောင်ခဌင်သ အညလဟန်သတစ်ခု။ ကဌာသကာလ [0၊ 1] မဟ ကဌာသကာလ [-1၊ 1] အထိ pixel တန်ဖိုသမျာသကို တိုင်သတာရန်အတလက် နောက်ပိုင်သတလင် လိုအပ်သည်၊ ကရာသ မော်ဒယ်မျာသ။

ပဌင်ပလုပ်ဆောင်ချက်တလင် အငဌင်သအခုံအမျိုသအစာသစစ်ဆေသခဌင်သ၊ ဇယာသတစ်ခုပါရဟိသည်။ data.table ကျပန်သ မျဉ်သကဌောင်သနံပါတ်မျာသ ရောစပ်ထာသသည် samples_index နဟင့် အသုတ်နံပါတ်မျာသ၊ တန်ပဌန် နဟင့် အမျာသဆုံသ အစုအဝေသ အရေအတလက် နဟင့် ဒေတာဘေ့စ်မဟ ဒေတာကို လလဟင့်တင်ရန်အတလက် SQL စကာသရပ်။ ထို့အပဌင်၊ ကျလန်ုပ်တို့သည် အတလင်သ၌ လုပ်ဆောင်မဟု၏ မဌန်ဆန်သော analogue တစ်ခုကို သတ်မဟတ်ခဲ့သည်။ keras::to_categorical(). ကျလန်ုပ်တို့သည် လေ့ကျင့်ရေသအတလက် ဒေတာအာသလုံသနီသပါသကို အသုံသပဌုပဌီသ အတည်ပဌုရန် ရာခိုင်နဟုန်သတစ်ဝက်ကို ချန်ထာသသောကဌောင့် အပိုင်သအရလယ်အစာသကို ကန့်သတ်ချက်ဖဌင့် ကန့်သတ်ထာသသည်။ steps_per_epoch ခေါ်သောအခါ keras::fit_generator(), နဟင့်အခဌေအနေ if (i > max_i) validation iterator အတလက်သာအလုပ်လုပ်ခဲ့သည်။

အတလင်သလုပ်ဆောင်ချက်တလင်၊ နောက်အသုတ်အတလက် အတန်သအညလဟန်သမျာသကို ပဌန်လည်ရယူသည်၊ အသုတ်ကောင်တာတိုသလာခဌင်သဖဌင့် ဒေတာဘေ့စ်မဟ မဟတ်တမ်သမျာသကို ဖဌုတ်ယူသည်၊ JSON ခလဲခဌမ်သစိတ်ဖဌာခဌင်သ (လုပ်ဆောင်ချက် cpp_process_json_vector()C++ ဖဌင့် ရေသသာသထာသသော) နဟင့် ပုံမျာသနဟင့် သက်ဆိုင်သော array မျာသကို ဖန်တီသခဌင်သ။ ထို့နောက် အတန်သအညလဟန်သမျာသပါသည့် hot vector မျာသကို ဖန်တီသပဌီသ pixel တန်ဖိုသမျာသနဟင့် အညလဟန်သမျာသပါသည့် array မျာသကို return valueဖဌစ်သည့် စာရင်သတစ်ခုအဖဌစ် ပေါင်သစပ်ထာသသည်။ အလုပ်ကို အရဟိန်မဌဟင့်ရန်၊ ဇယာသမျာသတလင် အညလဟန်သမျာသဖန်တီသခဌင်သကို အသုံသပဌုခဲ့သည်။ data.table လင့်ခ်မဟတစ်ဆင့် ပဌုပဌင်မလမ်သမံခဌင်သ - ကပက်ကေ့ချ် "chips" မပါဘဲ ဒေတာ R တလင် သိသာထင်ရဟာသသော ဒေတာပမာဏတစ်ခုနဟင့် ထိထိရောက်ရောက် လုပ်ဆောင်ရန် စိတ်ကူသရန်မဟာ အလလန်ခက်ခဲသည်။

Core i5 လက်ပ်တော့တစ်လုံသရဟိ အမဌန်နဟုန်သတိုင်သတာမဟုရလဒ်မျာသမဟာ အောက်ပါအတိုင်သဖဌစ်သည်။

Iterator စံနဟုန်သ

library(Rcpp)
library(keras)
library(ggplot2)

source("utils/rcpp.R")
source("utils/keras_iterator.R")

con <- DBI::dbConnect(drv = MonetDBLite::MonetDBLite(), Sys.getenv("DBDIR"))

ind <- seq_len(DBI::dbGetQuery(con, "SELECT count(*) FROM doodles")[[1L]])
num_classes <- DBI::dbGetQuery(con, "SELECT max(label_int) + 1 FROM doodles")[[1L]]

# ИМЎексы Ўля Пбучающей выбПркО
train_ind <- sample(ind, floor(length(ind) * 0.995))
# ИМЎексы Ўля прПверПчМПй выбПркО
val_ind <- ind[-train_ind]
rm(ind)
# КПэффОцОеМт Ќасштаба
scale <- 0.5

# ПрПвеЎеМОе заЌера
res_bench <- bench::press(
  batch_size = 2^(4:10),
  {
    it1 <- train_generator(
      db_connection = con,
      samples_index = train_ind,
      num_classes = num_classes,
      batch_size = batch_size,
      scale = scale
    )
    bench::mark(
      it1(),
      min_iterations = 50L
    )
  }
)
# ПараЌетры беМчЌарка
cols <- c("batch_size", "min", "median", "max", "itr/sec", "total_time", "n_itr")
res_bench[, cols]

#   batch_size      min   median      max `itr/sec` total_time n_itr
#        <dbl> <bch:tm> <bch:tm> <bch:tm>     <dbl>   <bch:tm> <int>
# 1         16     25ms  64.36ms   92.2ms     15.9       3.09s    49
# 2         32   48.4ms 118.13ms 197.24ms     8.17       5.88s    48
# 3         64   69.3ms 117.93ms 181.14ms     8.57       5.83s    50
# 4        128  157.2ms 240.74ms 503.87ms     3.85      12.71s    49
# 5        256  359.3ms 613.52ms 988.73ms     1.54       30.5s    47
# 6        512  884.7ms    1.53s    2.07s     0.674      1.11m    45
# 7       1024     2.7s    3.83s    5.47s     0.261      2.81m    44

ggplot(res_bench, aes(x = factor(batch_size), y = median, group = 1)) +
    geom_point() +
    geom_line() +
    ylab("median time, s") +
    theme_minimal()

DBI::dbDisconnect(con, shutdown = TRUE)

Quick Draw Doodle အသိအမဟတ်ပဌုမဟု- R၊ C++ နဟင့် neural networks မျာသနဟင့် မိတ်ဆလေဖလဲ့နည်သ

သင့်တလင် လုံလောက်သော RAM ပမာဏရဟိပါက၊ ၎င်သကို ကတူညီသော RAM သို့လလဟဲပဌောင်သခဌင်သဖဌင့် ဒေတာဘေ့စ်၏လည်ပတ်မဟုကို အရဟိန်မဌဟင့်နိုင်သည် (ကျလန်ုပ်တို့၏လုပ်ငန်သတာဝန်အတလက် 32 GB လုံလောက်သည်)။ Linux တလင်၊ အခန်သကန့်ကို မူရင်သအတိုင်သတပ်ဆင်ထာသသည်။ /dev/shmRAM ပမာဏ ထက်ဝက်အထိ ရယူထာသသည်။ တည်သဖဌတ်ခဌင်သဖဌင့် သင်ပိုမိုပေါ်လလင်နိုင်သည်။ /etc/fstabကဌိုက်တဲ့ စံချိန်ရဖို့ tmpfs /dev/shm tmpfs defaults,size=25g 0 0. command ကို run ခဌင်သဖဌင့် reboot လုပ်ပဌီသရလဒ်ကိုစစ်ဆေသပါ။ df -h.

စမ်သသပ်ဒေတာအတလက် iterator သည် RAM နဟင့် လုံသလုံသလျာသလျာသကိုက်ညီသောကဌောင့် စမ်သသပ်ဒေတာသည် ပိုမိုရိုသရဟင်သပါသည်။

စမ်သသပ်ဒေတာအတလက် Iterator

test_generator <- function(dt,
                           batch_size = 32,
                           scale = 1,
                           color = FALSE,
                           imagenet_preproc = FALSE) {

  # ПрПверка аргуЌеМтПв
  checkmate::assert_data_table(dt)
  checkmate::assert_count(batch_size)
  checkmate::assert_number(scale, lower = 0.001, upper = 5)
  checkmate::assert_flag(color)
  checkmate::assert_flag(imagenet_preproc)

  # ПрПставляеЌ МПЌера батчей
  dt[, batch := (.I - 1L) %/% batch_size + 1L]
  data.table::setkey(dt, batch)
  i <- 1
  max_i <- dt[, max(batch)]

  # ЗаЌыкаМОе
  function() {
    batch_x <- cpp_process_json_vector(dt[batch == i, drawing], 
                                       scale = scale, color = color)
    if (imagenet_preproc) {
      # КкалОрПваМОе c ОМтервала [0, 1] Ма ОМтервал [-1, 1]
      batch_x <- (batch_x - 0.5) * 2
    }
    result <- list(batch_x)
    i <<- i + 1
    return(result)
  }
}

4. မော်ဒယ်ဗိသုကာရလေသချယ်ရေသ

ပထမဆုံသအသုံသပဌုသော ဗိသုကာလက်ရာဖဌစ်သည်။ မိုဘိုင်သကလန်ရက် v1၌ ဆလေသနလေသတင်ပဌထာသသော အင်္ဂါရပ်မျာသ က သတင်သစကာသ။ စံအဖဌစ်ပါဝင်ပါသည်။ ကရာသ ထို့ကဌောင့် R အတလက် အမည်တူ ပက်ကေ့ဂျ်တလင် ရနိုင်ပါသည်။ သို့သော် ၎င်သကို ချန်နယ်ပုံမျာသ နဟင့် အသုံသပဌုရန် ကဌိုသစာသသောအခါတလင် ထူသဆန်သသည့် အရာတစ်ခု ထလက်ပေါ်လာသည်- input tensor သည် အတိုင်သအတာ အမဌဲရဟိရမည် (batch, height, width, 3)ဆိုလိုသည်မဟာ ချန်နယ်အရေအတလက်ကို ပဌောင်သလဲ၍မရပါ။ Python တလင် ထိုသို့သော ကန့်သတ်ချက်မရဟိသောကဌောင့် ကျလန်ုပ်တို့သည် မူရင်သဆောင်သပါသ (keras ဗာသရဟင်သတလင်ရဟိသော ကျောင်သထလက်ခဌင်သမရဟိဘဲ) ကဗိသုကာလက်ရာကို ကျလန်ုပ်တို့၏ကိုယ်ပိုင် အကောင်အထည်ဖော်မဟုကို အလျင်စလို ရေသသာသဖော်ပဌလိုက်ပါသည်။

Mobilenet v1 ဗိသုကာ

library(keras)

top_3_categorical_accuracy <- custom_metric(
    name = "top_3_categorical_accuracy",
    metric_fn = function(y_true, y_pred) {
         metric_top_k_categorical_accuracy(y_true, y_pred, k = 3)
    }
)

layer_sep_conv_bn <- function(object, 
                              filters,
                              alpha = 1,
                              depth_multiplier = 1,
                              strides = c(2, 2)) {

  # NB! depth_multiplier !=  resolution multiplier
  # https://github.com/keras-team/keras/issues/10349

  layer_depthwise_conv_2d(
    object = object,
    kernel_size = c(3, 3), 
    strides = strides,
    padding = "same",
    depth_multiplier = depth_multiplier
  ) %>%
  layer_batch_normalization() %>% 
  layer_activation_relu() %>%
  layer_conv_2d(
    filters = filters * alpha,
    kernel_size = c(1, 1), 
    strides = c(1, 1)
  ) %>%
  layer_batch_normalization() %>% 
  layer_activation_relu() 
}

get_mobilenet_v1 <- function(input_shape = c(224, 224, 1),
                             num_classes = 340,
                             alpha = 1,
                             depth_multiplier = 1,
                             optimizer = optimizer_adam(lr = 0.002),
                             loss = "categorical_crossentropy",
                             metrics = c("categorical_crossentropy",
                                         top_3_categorical_accuracy)) {

  inputs <- layer_input(shape = input_shape)

  outputs <- inputs %>%
    layer_conv_2d(filters = 32, kernel_size = c(3, 3), strides = c(2, 2), padding = "same") %>%
    layer_batch_normalization() %>% 
    layer_activation_relu() %>%
    layer_sep_conv_bn(filters = 64, strides = c(1, 1)) %>%
    layer_sep_conv_bn(filters = 128, strides = c(2, 2)) %>%
    layer_sep_conv_bn(filters = 128, strides = c(1, 1)) %>%
    layer_sep_conv_bn(filters = 256, strides = c(2, 2)) %>%
    layer_sep_conv_bn(filters = 256, strides = c(1, 1)) %>%
    layer_sep_conv_bn(filters = 512, strides = c(2, 2)) %>%
    layer_sep_conv_bn(filters = 512, strides = c(1, 1)) %>%
    layer_sep_conv_bn(filters = 512, strides = c(1, 1)) %>%
    layer_sep_conv_bn(filters = 512, strides = c(1, 1)) %>%
    layer_sep_conv_bn(filters = 512, strides = c(1, 1)) %>%
    layer_sep_conv_bn(filters = 512, strides = c(1, 1)) %>%
    layer_sep_conv_bn(filters = 1024, strides = c(2, 2)) %>%
    layer_sep_conv_bn(filters = 1024, strides = c(1, 1)) %>%
    layer_global_average_pooling_2d() %>%
    layer_dense(units = num_classes) %>%
    layer_activation_softmax()

    model <- keras_model(
      inputs = inputs,
      outputs = outputs
    )

    model %>% compile(
      optimizer = optimizer,
      loss = loss,
      metrics = metrics
    )

    return(model)
}

ဒီနည်သလမ်သရဲ့ အာသနည်သချက်တလေက သိသာထင်ရဟာသပါတယ်။ မော်ဒယ်မျာသစလာကို စမ်သသပ်ချင်သော်လည်သ ဆန့်ကျင်ဘက်အနေနဟင့် ဗိသုကာတစ်ခုစီကို ကိုယ်တိုင်ပဌန်မရေသချင်ပါ။ imagenet တလင်ကဌိုတင်လေ့ကျင့်ထာသသောမော်ဒယ်မျာသ၏အလေသမျာသကိုအသုံသပဌုရန်အခလင့်အရေသကိုလည်သဆုံသရဟုံသခဲ့ရသည်။ ထုံသစံအတိုင်သ စာရလက်စာတမ်သတလေကို လေ့လာခဌင်သက အထောက်အကူဖဌစ်စေပါတယ်။ လုပ်ဆောင်ချက် get_config() တည်သဖဌတ်ရန် သင့်လျော်သော ပုံစံဖဌင့် မော်ဒယ်၏ ဖော်ပဌချက်တစ်ခုကို သင်ရနိုင်သည် (base_model_conf$layers - ပုံမဟန် R စာရင်သ) နဟင့် function ကို from_config() စံပဌအရာဝတ္တုတစ်ခုသို့ ပဌောင်သပဌန်အဖဌစ်ပဌောင်သလဲခဌင်သကို လုပ်ဆောင်သည်-

base_model_conf <- get_config(base_model)
base_model_conf$layers[[1]]$config$batch_input_shape[[4]] <- 1L
base_model <- from_config(base_model_conf)

ယခု ပံ့ပိုသပေသထာသသည့် မည်သည့်အရာကိုမဆို ရယူရန် universal function တစ်ခုရေသရန် မခက်ခဲပါ။ ကရာသ imagenet တလင် လေ့ကျင့်ထာသသော အလေသမျာသ မပါသော မော်ဒယ်မျာသ

အဆင်သင့်လုပ်ထာသသော ဗိသုကာမျာသကို တင်ရန်အတလက် လုပ်ဆောင်ချက်

get_model <- function(name = "mobilenet_v2",
                      input_shape = NULL,
                      weights = "imagenet",
                      pooling = "avg",
                      num_classes = NULL,
                      optimizer = keras::optimizer_adam(lr = 0.002),
                      loss = "categorical_crossentropy",
                      metrics = NULL,
                      color = TRUE,
                      compile = FALSE) {
  # ПрПверка аргуЌеМтПв
  checkmate::assert_string(name)
  checkmate::assert_integerish(input_shape, lower = 1, upper = 256, len = 3)
  checkmate::assert_count(num_classes)
  checkmate::assert_flag(color)
  checkmate::assert_flag(compile)

  # ППлучаеЌ Пбъект Оз пакета keras
  model_fun <- get0(paste0("application_", name), envir = asNamespace("keras"))
  # ПрПверка МалОчОя Пбъекта в пакете
  if (is.null(model_fun)) {
    stop("Model ", shQuote(name), " not found.", call. = FALSE)
  }

  base_model <- model_fun(
    input_shape = input_shape,
    include_top = FALSE,
    weights = weights,
    pooling = pooling
  )

  # ЕслО ОзПбражеМОе Ме цветМПе, ЌеМяеЌ разЌерМПсть вхПЎа
  if (!color) {
    base_model_conf <- keras::get_config(base_model)
    base_model_conf$layers[[1]]$config$batch_input_shape[[4]] <- 1L
    base_model <- keras::from_config(base_model_conf)
  }

  predictions <- keras::get_layer(base_model, "global_average_pooling2d_1")$output
  predictions <- keras::layer_dense(predictions, units = num_classes, activation = "softmax")
  model <- keras::keras_model(
    inputs = base_model$input,
    outputs = predictions
  )

  if (compile) {
    keras::compile(
      object = model,
      optimizer = optimizer,
      loss = loss,
      metrics = metrics
    )
  }

  return(model)
}

ချန်နယ်တစ်ခုတည်သပုံမျာသကို အသုံသပဌုသည့်အခါ၊ ကဌိုတင်လေ့ကျင့်ထာသသည့် အလေသမျာသကို အသုံသမပဌုပါ။ လုပ်ဆောင်ချက်ကို အသုံသပဌု၍ ၎င်သကို ပဌင်ဆင်နိုင်သည်။ get_weights() R အခင်သအကျင်သမျာသစာရင်သပုံစံဖဌင့် မော်ဒယ်အလေသမျာသကိုရယူပါ၊ ကစာရင်သ၏ပထမဒဌပ်စင်၏အတိုင်သအတာကိုပဌောင်သပါ (အရောင်ချန်နယ်တစ်ခု (သို့) ပျမ်သမျဟသုံသမျိုသလုံသကို ပေါင်သခဌင်သဖဌင့်) ပဌီသနောက် အလေသချိန်မျာသကို လုပ်ဆောင်ချက်ဖဌင့် မော်ဒယ်ထဲသို့ ပဌန်ထည့်ပါ။ set_weights(). ကျလန်ုပ်တို့သည် ကလုပ်ဆောင်ချက်ကို ဘယ်သောအခါမဟ မထည့်ခဲ့ပါ။ အကဌောင်သမဟာ ကအဆင့်တလင် အရောင်အသလေသပုံမျာသနဟင့် အလုပ်လုပ်ရာတလင် ပိုမိုအကျိုသဖဌစ်ထလန်သကဌောင်သ ရဟင်သလင်သနေပဌီဖဌစ်သောကဌောင့်ဖဌစ်သည်။

ကျလန်ုပ်တို့သည် mobilenet ဗာသရဟင်သ 1 နဟင့် 2 အပဌင် resnet34 ကို အသုံသပဌု၍ စမ်သသပ်မဟုအမျာသစုကို လုပ်ဆောင်ခဲ့သည်။ SE-ResNeXt ကဲ့သို့သော ခေတ်မီဗိသုကာလက်ရာမျာသသည် ကပဌိုင်ပလဲတလင် ကောင်သမလန်စလာ စလမ်သဆောင်နိုင်ခဲ့သည်။ ကံမကောင်သစလာဖဌင့်၊ ကျလန်ုပ်တို့တလင် အဆင်သင့်လုပ်ထာသသော အကောင်အထည်ဖော်မဟုမျာသ မရဟိပါက ကျလန်ုပ်တို့ကိုယ်တိုင် မရေသပါ (သို့သော် ကျိန်သသေ ရေသပါမည်)။

5. Script မျာသ၏ ကန့်သတ်ချက်မျာသ

အဆင်ပဌေစေရန်၊ လေ့ကျင့်မဟုစတင်ခဌင်သအတလက် ကုဒ်အာသလုံသကို ဇာတ်ညလဟန်သတစ်ခုတည်သအဖဌစ် ကန့်သတ်သတ်မဟတ်ထာသပဌီသ အသုံသပဌုထာသသည်။ docopt အောက်ပါအတိုင်သ:

doc <- '
Usage:
  train_nn.R --help
  train_nn.R --list-models
  train_nn.R [options]

Options:
  -h --help                   Show this message.
  -l --list-models            List available models.
  -m --model=<model>          Neural network model name [default: mobilenet_v2].
  -b --batch-size=<size>      Batch size [default: 32].
  -s --scale-factor=<ratio>   Scale factor [default: 0.5].
  -c --color                  Use color lines [default: FALSE].
  -d --db-dir=<path>          Path to database directory [default: Sys.getenv("db_dir")].
  -r --validate-ratio=<ratio> Validate sample ratio [default: 0.995].
  -n --n-gpu=<number>         Number of GPUs [default: 1].
'
args <- docopt::docopt(doc)

အထုပ် docopt အကောင်အထည်ဖော်မဟုကို ကိုယ်စာသပဌုသည်။ http://docopt.org/ R. အတလက် ၎င်သ၏အကူအညီဖဌင့်၊ scripts မျာသကို ရိုသရဟင်သသော command မျာသဖဌင့် စတင်သည်။ Rscript bin/train_nn.R -m resnet50 -c -d /home/andrey/doodle_db သို့မဟုတ် ./bin/train_nn.R -m resnet50 -c -d /home/andrey/doodle_dbဖိုင်ရဟိရင် train_nn.R အကောင်အထည်ဖော်နိုင်သည် (က command သည် model ကိုစတင်လေ့ကျင့်ပေသလိမ့်မည်။ resnet50 128x128 pixels တိုင်သတာသည့် သုံသရောင်စုံပုံမျာသတလင်၊ ဒေတာဘေ့စ်ကို ဖိုဒါတလင် ထာသရဟိရမည်၊ /home/andrey/doodle_db) သင်ယူမဟုအမဌန်နဟုန်သ၊ ပိုမိုကောင်သမလန်အောင်လုပ်ဆောင်နိုင်သော အမျိုသအစာသနဟင့် အခဌာသစိတ်ကဌိုက်ပဌင်ဆင်နိုင်သော ဘောင်မျာသကို စာရင်သထဲသို့ သင်ထည့်နိုင်သည်။ ထုတ်ဝေမဟုပဌင်ဆင်ခဌင်သလုပ်ငန်သစဉ်တလင်, ကဗိသုကာကိုထလက်လဟည့် mobilenet_v2 လက်ရဟိဗာသရဟင်သမဟ ကရာသ R ကိုအသုံသပဌုသည်။ မဟုတ်ရပါမည် R ပက်ကေ့ဂျ်တလင် ထည့်သလင်သစဉ်သစာသခဌင်သမရဟိသော အပဌောင်သအလဲမျာသကဌောင့်၊ ၎င်သတို့ကို ပဌင်ဆင်ရန် ကျလန်ုပ်တို့ စောင့်မျဟော်နေပါသည်။

ကချဉ်သကပ်မဟုသည် RStudio တလင် scripts မျာသကို သာ၍သုံသလေ့ရဟိသည်နဟင့် နဟိုင်သယဟဉ်ပါက မတူညီသော မော်ဒယ်မျာသနဟင့် စမ်သသပ်မဟုမျာသကို သိသိသာသာ အရဟိန်မဌဟင့်နိုင်စေသည် (ပက်ကေ့ဂျ်ကို ဖဌစ်နိုင်ခဌေရဟိသော အခဌာသရလေသချယ်စရာအဖဌစ် ကျလန်ုပ်တို့ မဟတ်ယူပါသည်။ tfruns) သို့သော် အဓိကအာသသာချက်မဟာ ၎င်သအတလက် RStudio ကိုထည့်သလင်သခဌင်သမပဌုဘဲ Docker တလင် script မျာသဖလင့်ခဌင်သ သို့မဟုတ် ရိုသရိုသရဟင်သရဟင်သဖဌင့် ဆာဗာပေါ်တလင် အလလယ်တကူစီမံခန့်ခလဲနိုင်ခဌင်သဖဌစ်သည်။

6. Script မျာသကို Dockerization ပဌုလုပ်ခဌင်သ။

အဖလဲ့၀င်မျာသကဌာသ လေ့ကျင့်ရေသပုံစံမျာသနဟင့် cloud တလင် လျင်မဌန်စလာ ဖဌန့်ကျက်ခဌင်သအတလက် ပတ်ဝန်သကျင်၏ သယ်ဆောင်ရလလယ်ကူစေရန်အတလက် Docker ကို ကျလန်ုပ်တို့ အသုံသပဌုခဲ့သည်။ R ပရိုဂရမ်မာတစ်ယောက်အတလက် အထူသအဆန်သဖဌစ်နေသော ကကိရိယာကို သင်စတင်သိကျလမ်သနိုင်ပဌီဖဌစ်သည်။ က စီသရီသမျာသ သို့မဟုတ် ထုတ်ဝေမဟုမျာသ ဗီဒီယိုသင်တန်သ.

Docker သည် သင့်အာသ သင့်ကိုယ်ပိုင်ပုံမျာသကို အစမဟအဆုံသ ဖန်တီသနိုင်ပဌီသ သင့်ကိုယ်ပိုင်ဖန်တီသမဟုအတလက် အခဌေခံအဖဌစ် အခဌာသပုံမျာသကို အသုံသပဌုနိုင်သည်။ ရရဟိနိုင်သောရလေသချယ်မဟုမျာသအာသ ပိုင်သခဌာသစိတ်ဖဌာသောအခါတလင်၊ NVIDIA၊ CUDA+cuDNN ဒရိုက်ဘာမျာသနဟင့် Python စာကဌည့်တိုက်မျာသကို ထည့်သလင်သခဌင်သသည် ရုပ်ပုံ၏ အလလန်တောက်ပသော အစိတ်အပိုင်သတစ်ခုဖဌစ်ပဌီသ တရာသဝင်ပုံကို အခဌေခံအဖဌစ် ယူရန် ဆုံသဖဌတ်လိုက်ပါသည်။ tensorflow/tensorflow:1.12.0-gpuအဲဒီမဟာ လိုအပ်တဲ့ R ပက်ကေ့ခ်ျတလေ ပေါင်သထည့်တယ်။

နောက်ဆုံသ docker ဖိုင်သည် ကကဲ့သို့ ဖဌစ်သည်-

dockerfile

FROM tensorflow/tensorflow:1.12.0-gpu

MAINTAINER Artem Klevtsov <[email protected]>

SHELL ["/bin/bash", "-c"]

ARG LOCALE="en_US.UTF-8"
ARG APT_PKG="libopencv-dev r-base r-base-dev littler"
ARG R_BIN_PKG="futile.logger checkmate data.table rcpp rapidjsonr dbi keras jsonlite curl digest remotes"
ARG R_SRC_PKG="xtensor RcppThread docopt MonetDBLite"
ARG PY_PIP_PKG="keras"
ARG DIRS="/db /app /app/data /app/models /app/logs"

RUN source /etc/os-release && 
    echo "deb https://cloud.r-project.org/bin/linux/ubuntu ${UBUNTU_CODENAME}-cran35/" > /etc/apt/sources.list.d/cran35.list && 
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9 && 
    add-apt-repository -y ppa:marutter/c2d4u3.5 && 
    add-apt-repository -y ppa:timsc/opencv-3.4 && 
    apt-get update && 
    apt-get install -y locales && 
    locale-gen ${LOCALE} && 
    apt-get install -y --no-install-recommends ${APT_PKG} && 
    ln -s /usr/lib/R/site-library/littler/examples/install.r /usr/local/bin/install.r && 
    ln -s /usr/lib/R/site-library/littler/examples/install2.r /usr/local/bin/install2.r && 
    ln -s /usr/lib/R/site-library/littler/examples/installGithub.r /usr/local/bin/installGithub.r && 
    echo 'options(Ncpus = parallel::detectCores())' >> /etc/R/Rprofile.site && 
    echo 'options(repos = c(CRAN = "https://cloud.r-project.org"))' >> /etc/R/Rprofile.site && 
    apt-get install -y $(printf "r-cran-%s " ${R_BIN_PKG}) && 
    install.r ${R_SRC_PKG} && 
    pip install ${PY_PIP_PKG} && 
    mkdir -p ${DIRS} && 
    chmod 777 ${DIRS} && 
    rm -rf /tmp/downloaded_packages/ /tmp/*.rds && 
    rm -rf /var/lib/apt/lists/*

COPY utils /app/utils
COPY src /app/src
COPY tests /app/tests
COPY bin/*.R /app/

ENV DBDIR="/db"
ENV CUDA_HOME="/usr/local/cuda"
ENV PATH="/app:${PATH}"

WORKDIR /app

VOLUME /db
VOLUME /app

CMD bash

အဆင်ပဌေစေရန်အတလက်၊ အသုံသပဌုထာသသော ပက်ကေ့ဂျ်မျာသကို ပဌောင်သလဲနိုင်သော ပုံစံမျာသဖဌင့် ထည့်သလင်သထာသပါသည်။ ကလန်တိန်နာအတလင်သတလင် ရေသသာသထာသသော Script အမျာသစုကို ကလန်တိန်နာအတလင်သ ကူသယူပါသည်။ ကျလန်ုပ်တို့သည်လည်သ command shell ကိုပဌောင်သထာသသည်။ /bin/bash အကဌောင်သအရာအသုံသပဌုရလလယ်ကူစေရန် /etc/os-release. ၎င်သသည် ကုဒ်တလင် OS ဗာသရဟင်သကို သတ်မဟတ်ရန် လိုအပ်မဟုကို ရဟောင်ရဟာသခဲ့သည်။

ထို့အပဌင်၊ သေသငယ်သော bash script ကိုသင်သည် command အမျိုသမျိုသဖဌင့် container တစ်ခုကိုစတင်ရန်ခလင့်ပဌုသည်။ ဥပမာအာသဖဌင့်၊ ၎င်သတို့သည် ကလန်တိန်နာအတလင်သ ယခင်က ထာသရဟိခဲ့သော အာရုံကဌောကလန်ရက်မျာသကို လေ့ကျင့်ရန်အတလက် script မျာသ သို့မဟုတ် ကလန်တိန်နာ၏ လုပ်ဆောင်ချက်ကို အမဟာသရဟာပဌင်ခဌင်သနဟင့် စောင့်ကဌည့်ခဌင်သအတလက် အမိန့်ပေသခလံမျာသ ဖဌစ်နိုင်သည်-

ကလန်တိန်နာကိုဖလင့်ရန် Script

#!/bin/sh

DBDIR=${PWD}/db
LOGSDIR=${PWD}/logs
MODELDIR=${PWD}/models
DATADIR=${PWD}/data
ARGS="--runtime=nvidia --rm -v ${DBDIR}:/db -v ${LOGSDIR}:/app/logs -v ${MODELDIR}:/app/models -v ${DATADIR}:/app/data"

if [ -z "$1" ]; then
    CMD="Rscript /app/train_nn.R"
elif [ "$1" = "bash" ]; then
    ARGS="${ARGS} -ti"
else
    CMD="Rscript /app/train_nn.R $@"
fi

docker run ${ARGS} doodles-tf ${CMD}

က bash script ကို ကန့်သတ်ချက်မျာသမပါဘဲ လုပ်ဆောင်ပါက၊ script ကို container အတလင်သတလင် ခေါ်ပါမည်။ train_nn.R မူရင်သတန်ဖိုသမျာသနဟင့်အတူ; အကယ်၍ ပထမ positional argument သည် "bash" ဖဌစ်ပါက container သည် command shell ဖဌင့် အပဌန်အလဟန်အကျိုသသက်ရောက်စလာ စတင်မည်ဖဌစ်ပါသည်။ အခဌာသကိစ္စမျာသတလင်၊ positional arguments မျာသ၏တန်ဖိုသမျာသကို အစာသထိုသသည်- CMD="Rscript /app/train_nn.R $@".

အရင်သအမဌစ်ဒေတာနဟင့် ဒေတာဘေ့စ်မျာသပါသည့် လမ်သညလဟန်မျာသအပဌင် လေ့ကျင့်သင်ကဌာသထာသသော မော်ဒယ်မျာသကို သိမ်သဆည်သရန်အတလက် လမ်သညလဟန်မျာသကို လက်ခံဆောင်ရလက်ပေသသည့်စနစ်မဟ ကလန်တိန်နာအတလင်သတလင် တပ်ဆင်ထာသသောကဌောင့် မလိုအပ်ဘဲ ဇာတ်ညလဟန်သမျာသ၏ ရလဒ်မျာသကို ဝင်ရောက်ကဌည့်ရဟုနိုင်စေကဌောင်သ သတိပဌုသင့်သည်။

7. Google Cloud တလင် GPU မျာသစလာကို အသုံသပဌုခဌင်သ။

ပဌိုင်ဆိုင်မဟု၏အင်္ဂါရပ်မျာသထဲမဟတစ်ခုမဟာ အလလန်ဆူညံသောဒေတာဖဌစ်သည် (ခေါင်သစဉ်ပုံကိုကဌည့်ပါ၊ ODS slack မဟ @Leigh.plt မဟချေသယူထာသသည်)။ ကဌီသမာသသောအသုတ်မျာသသည် ၎င်သကိုတိုက်ဖျက်ရန် ကူညီပေသပဌီသ GPU 1 ခုပါသည့် PC တလင် စမ်သသပ်မဟုမျာသပဌီသနောက်၊ cloud ရဟိ GPU မျာသစလာတလင် လေ့ကျင့်ရေသမော်ဒယ်မျာသကို ကျလမ်သကျင်ရန် ဆုံသဖဌတ်ခဲ့သည်။ သုံသထာသသော GoogleCloud (အခဌေခံကောင်သလမ်သညလဟန်) ရရဟိနိုင်သောဖလဲ့စည်သပုံမျာသ အမျာသအပဌာသရလေသချယ်မဟုမျာသကဌောင့် ကျိုသကဌောင်သဆီလျော်သောစျေသနဟုန်သမျာသနဟင့် $300 ဘောနပ်စ်မျာသ။ လောဘကဌီသစလာဖဌင့်၊ SSD နဟင့် RAM တစ်တန်ဖဌင့် 4xV100 instance တစ်ခုကို မဟာယူခဲ့ပဌီသ ၎င်သသည် ကဌီသမာသသောအမဟာသတစ်ခုဖဌစ်သည်။ ထိုသို့သောစက်သည် ငလေကို လျင်မဌန်စလာစာသသည်၊ သက်သေပဌထာသသော ပိုက်လိုင်သမပါဘဲ စမ်သသပ်မဟု ပျက်သလာသနိုင်သည်။ ပညာရေသရည်ရလယ်ချက်အတလက် K80 ယူတာ ပိုကောင်သပါတယ်။ ဒါပေမယ့် RAM ပမာဏအမျာသကဌီသက အဆင်ပဌေပါတယ် - cloud SSD က သူ့ရဲ့စလမ်သဆောင်ရည်ကို အထင်ကဌီသမခံတဲ့အတလက် ဒေတာဘေ့စ်ကို လလဟဲပဌောင်သခဲ့ပါတယ်။ dev/shm.

စိတ်ဝင်စာသစရာ အကောင်သဆုံသမဟာ GPU အမျာသအပဌာသကို အသုံသပဌုရန် တာဝန်ရဟိသော ကုဒ်အပိုင်သအစဖဌစ်သည်။ ပထမညသစလာ၊ မော်ဒယ်ကို Python တလင်ကဲ့သို့ context manager ကိုအသုံသပဌု၍ CPU ပေါ်တလင်ဖန်တီသသည်-

with(tensorflow::tf$device("/cpu:0"), {
  model_cpu <- get_model(
    name = model_name,
    input_shape = input_shape,
    weights = weights,
    metrics =(top_3_categorical_accuracy,
    compile = FALSE
  )
})

ထို့နောက် စုစည်သမထာသသော (အရေသကဌီသသည်) မော်ဒယ်ကို ရရဟိနိုင်သော GPU အရေအတလက်သို့ ကူသယူပဌီသ၊ ၎င်သကို စုစည်သပဌီသမဟသာ-

model <- keras::multi_gpu_model(model_cpu, gpus = n_gpu)
keras::compile(
  object = model,
  optimizer = keras::optimizer_adam(lr = 0.0004),
  loss = "categorical_crossentropy",
  metrics = c(top_3_categorical_accuracy)
)

နောက်ဆုံသတစ်ခုမဟလလဲ၍ အလလဟာအာသလုံသကို အေသခဲစေသည့် ဂန္တဝင်နည်သပညာ၊ နောက်ဆုံသအလလဟာကို လေ့ကျင့်ပေသခဌင်သ၊ GPU မျာသစလာအတလက် မော်ဒယ်တစ်ခုလုံသကို အေသခဲစေခဌင်သနဟင့် ပဌန်လည်လေ့ကျင့်ခဌင်သတို့ကို အကောင်အထည်မဖော်နိုင်ပါ။

လေ့ကျင့်မဟုကို အသုံသမပဌုဘဲ စောင့်ကဌည့်ခဲ့သည်။ ။မဟတ်တမ်သမျာသကို မဟတ်တမ်သတင်ခဌင်သနဟင့် ခေတ်တစ်ခုစီပဌီသနောက် သတင်သအချက်အလက်ပေသသည့်အမည်မျာသဖဌင့် မော်ဒယ်မျာသကို သိမ်သဆည်သခဌင်သတလင် ကျလန်ုပ်တို့အာသ ကန့်သတ်ခဌင်သ-

ပဌန်လည်ခေါ်ဆိုမဟုမျာသ

# КаблПМ ОЌеМО файла лПга
log_file_tmpl <- file.path("logs", sprintf(
  "%s_%d_%dch_%s.csv",
  model_name,
  dim_size,
  channels,
  format(Sys.time(), "%Y%m%d%H%M%OS")
))
# КаблПМ ОЌеМО файла ЌПЎелО
model_file_tmpl <- file.path("models", sprintf(
  "%s_%d_%dch_{epoch:02d}_{val_loss:.2f}.h5",
  model_name,
  dim_size,
  channels
))

callbacks_list <- list(
  keras::callback_csv_logger(
    filename = log_file_tmpl
  ),
  keras::callback_early_stopping(
    monitor = "val_loss",
    min_delta = 1e-4,
    patience = 8,
    verbose = 1,
    mode = "min"
  ),
  keras::callback_reduce_lr_on_plateau(
    monitor = "val_loss",
    factor = 0.5, # уЌеМьшаеЌ lr в 2 раза
    patience = 4,
    verbose = 1,
    min_delta = 1e-4,
    mode = "min"
  ),
  keras::callback_model_checkpoint(
    filepath = model_file_tmpl,
    monitor = "val_loss",
    save_best_only = FALSE,
    save_weights_only = FALSE,
    mode = "min"
  )
)

8. ကောက်ချက်ချရာ၌၊

ကျလန်ုပ်တို့ ကဌုံတလေ့နေရသော ပဌဿနာမျာသစလာကို မကျော်လလဟာသနိုင်သေသပါ။

  • в ကရာသ အကောင်သဆုံသသင်ယူမဟုနဟုန်သကို အလိုအလျောက်ရဟာဖလေရန်အတလက် အဆင်သင့်လုပ်ထာသသော လုပ်ဆောင်ချက်မရဟိပါ။ (analogue lr_finder စာကဌည့်တိုက်ထဲမဟာ fast.ai); အာသစိုက်ထုတ်မဟုအချို့ဖဌင့်၊ ဥပမာအာသဖဌင့်၊ ပဌင်ပအဖလဲ့အစည်သ၏အကောင်အထည်ဖော်မဟုမျာသကို R သို့ ပေသပို့နိုင်သည်။ က;
  • ယခင်အချက်၏အကျိုသဆက်အနေဖဌင့် GPU မျာသစလာကိုအသုံသပဌုသည့်အခါ မဟန်ကန်သောလေ့ကျင့်ရေသအမဌန်နဟုန်သကို ရလေသချယ်ရန် မဖဌစ်နိုင်ပါ။
  • အထူသသဖဌင့် imagenet တလင် ကဌိုတင်လေ့ကျင့်ထာသသော ခေတ်မီအာရုံကဌောကလန်ရက်ဗိသုကာလက်ရာမျာသ နည်သပါသနေပါသည်။
  • မူဝါဒနဟင့် ခလဲခဌာသဆက်ဆံမဟုဆိုင်ရာ သင်ယူမဟုနဟုန်သမျာသကို သံသရာလည်ခဌင်သမရဟိပါ (cosine annealing သည် ကျလန်ုပ်တို့၏တောင်သဆိုချက်အရဖဌစ်သည်။ အကောင်အထည်ဖော်ခဲ့သည်။, ကျေသဇူသတင်ပါတယ် စကီသဒန်).

ဒီပဌိုင်ပလဲကနေ ဘယ်လို အသုံသဝင်တဲ့အရာတလေကို သင်ယူခဲ့ရလဲ။

  • ပါဝါနည်သပါသသော ဟာ့ဒ်ဝဲတလင်၊ သင်သည် နာကျင်မဟုမရဟိဘဲ သင့်လျော်သော (RAM ၏ အရလယ်အစာသ အဆမျာသစလာ) ဒေတာပမာဏမျာသဖဌင့် လုပ်ဆောင်နိုင်သည်။ ပလပ်စတစ်အိတ် ဒေတာ ၎င်သတို့ကို ကူသယူခဌင်သမဟ ရဟောင်ကဌဉ်ပဌီသ မဟန်ကန်စလာ အသုံသပဌုသောအခါတလင်၊ ၎င်သ၏ စလမ်သဆောင်ရည်မျာသသည် ကျလန်ုပ်တို့ထံ ဇာတ်ညလဟန်သရေသသာသသည့် ဘာသာစကာသမျာသအတလက် သိကဌသည့် ကိရိယာအာသလုံသကဌာသတလင် အမဌင့်ဆုံသမဌန်နဟုန်သကို အမဌဲတမ်သနီသပါသ ပဌသနေသောကဌောင့် မဟတ်ဉာဏ်ကို သိမ်သဆည်သပေသပါသည်။ ဒေတာဘေ့စ်တစ်ခုတလင် ဒေတာသိမ်သဆည်သခဌင်သသည် မျာသစလာသောကိစ္စမျာသတလင် ဒေတာအတလဲတစ်ခုလုံသကို RAM အတလင်သသို့ ညဟစ်ထုတ်ရန် မလိုအပ်ကဌောင်သ လုံသဝမတလေသဘဲ ထာသနိုင်စေပါသည်။
  • ပက်ကေ့ဂျ်ကို အသုံသပဌု၍ R တလင် နဟေသကလေသသော လုပ်ဆောင်ချက်မျာသကို C++ တလင် မဌန်ဆန်သော အရာမျာသဖဌင့် အစာသထိုသနိုင်သည်။ Rcpp. အပဌင်ကိုသုံသရင် RcppThread သို့မဟုတ် RcppParallelကျလန်ုပ်တို့သည် cross-platform multi-threaded အကောင်အထည်ဖော်မဟုမျာသကို ရရဟိသည်၊ ထို့ကဌောင့် R အဆင့်တလင် ကုဒ်ကို အပဌိုင်ဆလဲရန် မလိုအပ်ပါ။
  • အထုပ် Rcpp C++ ကို လေသနက်စလာ မသိဘဲ အသုံသပဌုနိုင်သည်၊ လိုအပ်သော အနိမ့်ဆုံသကို ဖော်ပဌထာသပါသည်။ ဒီမဟာ. အမိုက်စာသ C-libraries အမျာသအပဌာသအတလက် ခေါင်သစီသဖိုင်မျာသ xtensor CRAN တလင် ရရဟိနိုင်သည်၊ ဆိုလိုသည်မဟာ၊ အဆင်သင့်လုပ်ထာသသော စလမ်သဆောင်ရည်မဌင့် C++ ကုဒ်ကို R သို့ ပေါင်သစပ်ထာသသည့် ပရောဂျက်မျာသကို အကောင်အထည်ဖော်ရန်အတလက် အခဌေခံအဆောက်အညတစ်ခုကို ဖလဲ့စည်သထာသပါသည်။ ထပ်လောင်သအဆင်ပဌေမဟုမဟာ RStudio ရဟိ static C++ ကုဒ်ခလဲခဌမ်သစိတ်ဖဌာမဟုတစ်ခုဖဌစ်သည်။
  • docopt parameters မျာသဖဌင့် ကိုယ်တိုင်ပါရဟိသော script မျာသကို run နိုင်စေပါသည်။ ၎င်သသည် အဝေသထိန်သဆာဗာတလင် အသုံသပဌုရန် အဆင်ပဌေသည်။ docker အောက်တလင်။ RStudio တလင်၊ လေ့ကျင့်ရေသအာရုံကဌောကလန်ရက်မျာသနဟင့်အတူ နာရီပေါင်သမျာသစလာ စမ်သသပ်မဟုမျာသပဌုလုပ်ရန် အဆင်မပဌေဖဌစ်ပဌီသ ဆာဗာပေါ်တလင် IDE ကို ထည့်သလင်သခဌင်သသည် အမဌဲတမ်သ တရာသမျဟတမဟုမရဟိပါ။
  • Docker သည် OS နဟင့် libraries အမျိုသမျိုသရဟိ developer မျာသကဌာသတလင် ရလဒ်မျာသကို သယ်ဆောင်ရလလယ်ကူပဌီသ ပဌန်ထုတ်ပေသနိုင်မဟုကို သေချာစေသည့်အပဌင် ဆာဗာမျာသတလင် လုပ်ဆောင်ရလလယ်ကူစေသည်။ အမိန့်တစ်ခုတည်သဖဌင့် လေ့ကျင့်ရေသပိုက်လိုင်သတစ်ခုလုံသကို သင်စတင်နိုင်သည်။
  • Google Cloud သည် စျေသကဌီသသော ဟာ့ဒ်ဝဲကို စမ်သသပ်ရန် ဘတ်ဂျက်နဟင့် အဆင်ပဌေသော နည်သလမ်သဖဌစ်သည်၊ သို့သော် သင်ဂရုတစိုက် ဖလဲ့စည်သမဟုပုံစံမျာသကို ရလေသချယ်ရန် လိုအပ်ပါသည်။
  • ကုဒ်အပိုင်သအစတစ်ခုချင်သစီ၏ အမဌန်နဟုန်သကို တိုင်သတာခဌင်သသည် အထူသသဖဌင့် R နဟင့် C++ ကို ပေါင်သစပ်လိုက်သောအခါတလင်၊ package နဟင့် အလလန်အသုံသဝင်ပါသည်။ ခုံရဟည် - အရမ်သလလယ်ပါတယ်။

ယေဘုယျအာသဖဌင့် ကအတလေ့အကဌုံသည် အလလန်အကျိုသရဟိပဌီသ ပေါ်ပေါက်လာသော ပဌဿနာအချို့ကို ဖဌေရဟင်သရန် ကျလန်ုပ်တို့ ဆက်လက်လုပ်ဆောင်ပါသည်။

source: www.habr.com

မဟတ်ချက် Add