เดนเต เดนเดฌเตผ!
เดเดดเดฟเดเตเด เดถเดฐเดคเตเดเดพเดฒเดคเตเดคเดฟเตฝ, เดเตเดเตเดฃเตเดเต เดตเดฐเดเตเด เดเดฟเดคเตเดฐเดเตเดเตพ, เดเตเดตเดฟเดเตเดเต เดกเตเดฐเต เดกเตเดกเดฟเตฝ เดฑเตเดเตเดเดเตเดจเดฟเดทเตป เดคเดฐเดเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดฎเดคเตเดธเดฐเด Kaggle เดธเดเดเดเดฟเดชเตเดชเดฟเดเตเดเต, เด
เดคเดฟเตฝ, เดฎเดฑเตเดฑเตเดณเตเดณเดตเดฏเดฟเตฝ, R-เดถเดพเดธเตเดคเตเดฐเดเตเดเดฐเตเดเต เดเดฐเต เดธเดเดเด เดชเดเตเดเตเดเตเดคเตเดคเต:
เดเดคเตเดคเดตเดฃ เดฎเตเดกเตฝ เดซเดพเดฎเดฟเดเดเดฟเตฝ เดเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดฟเดฒเตเดฒ, เดชเดเตเดทเต เดตเดฟเดฒเดชเตเดชเตเดเตเด เดงเดพเดฐเดพเดณเด เด
เดจเตเดญเดตเดเตเดเตพ เดฒเดญเดฟเดเตเดเต, เด
เดคเดฟเดจเดพเตฝ เดเดเตเดฒเตเดฏเดฟเดฒเตเด เดฆเตเดจเดเดฆเดฟเดจ เดเตเดฒเดฟเดฏเดฟเดฒเตเด เดเดฑเตเดฑเดตเตเด เดฐเดธเดเดฐเดตเตเด เดเดชเดฏเตเดเดชเตเดฐเดฆเดตเตเดฎเดพเดฏ เดจเดฟเดฐเดตเดงเดฟ เดเดพเดฐเตเดฏเดเตเดเดณเตเดเตเดเตเดฑเดฟเดเตเดเต เดธเดฎเตเดนเดคเตเดคเตเดเต เดชเดฑเดฏเดพเตป เดเดพเตป เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเต. เดเตผเดเตเด เดเตเดฏเตเดค เดตเดฟเดทเดฏเดเตเดเดณเดฟเตฝ: เดฌเตเดฆเตเดงเดฟเดฎเตเดเตเดเตเดณเตเดณ เดเตเดตเดฟเดคเด เดเดชเตเดชเตบโเดธเดฟโเดตเดฟ, JSON เดชเดพเดดเตโเดธเดฟเดเดเต (เด เดเดฆเดพเดนเดฐเดฃเดเตเดเตพ R เดเดชเดฏเตเดเดฟเดเตเดเต เดธเตโเดเตเดฐเดฟเดชเตเดฑเตเดฑเตเดเดณเดฟเดฒเตเดเตเดเต เดชเดพเดเตเดเตเดเตเดเดณเดฟเดฒเตเดเตเดเต C++ เดเตเดกเดฟเดจเตเดฑเต เดธเดเดฏเตเดเดจเด เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเต Rcpp), เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเตเดเดณเตเดเต เดชเดพเดฐเดพเดฎเตเดฑเตเดฑเดฑเตเดธเตเดทเดจเตเด เด
เดจเตเดคเดฟเดฎ เดชเดฐเดฟเดนเดพเดฐเดคเตเดคเดฟเดจเตเดฑเต เดกเตเดเตเดเดฑเตเดธเตเดทเดจเตเด. เดจเดฟเตผเดตเตเดตเดนเดฃเดคเตเดคเดฟเดจเต เด
เดจเตเดฏเตเดเตเดฏเดฎเดพเดฏ เดเดฐเต เดซเตเดฎเดฟเตฝ เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดเดฒเตเดฒเดพ เดเตเดกเตเด เดฒเดญเตเดฏเดฎเดพเดฃเต
เดเดณเตเดณเดเดเตเดเด:
CSV-เดฏเดฟเตฝ เดจเดฟเดจเตเดจเต MonetDB-เดฏเดฟเดฒเตเดเตเดเต เดกเดพเดฑเตเดฑ เดเดพเดฐเตเดฏเดเตเดทเดฎเดฎเดพเดฏเดฟ เดฒเตเดกเต เดเตเดฏเตเดฏเตเด เดฌเดพเดเตเดเตเดเตพ เดคเดฏเตเดฏเดพเดฑเดพเดเตเดเตเดจเตเดจเต เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเตฝ เดจเดฟเดจเตเดจเต เดฌเดพเดเตเดเตเดเตพ เด เตบเดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฑเตเดฑเดฑเตเดฑเตเดฑเดฑเตเดเตพ เดเดฐเต เดฎเตเดกเตฝ เดเตผเดเตเดเดฟเดเตเดเตเดเตผ เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเดจเตเดจเต เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเต เดชเดพเดฐเดพเดฎเตเดฑเตเดฑเดฑเตเดธเตเดทเตป เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเตเดเดณเตเดเต เดกเตเดเตเดเดฑเตเดธเตเดทเตป Google เดเตเดฒเตเดกเดฟเตฝ เดเดจเตเดจเดฟเดฒเดงเดฟเดเด GPU-เดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต เดชเดเดฐเด เดเดฐเต เดจเดฟเดเดฎเดจเดคเตเดคเดฟเตฝ เดเดจเตเดจ
1. MonetDB เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเดฒเตเดเตเดเต CSV-เดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดกเดพเดฑเตเดฑ เดเดพเดฐเตเดฏเดเตเดทเดฎเดฎเดพเดฏเดฟ เดฒเตเดกเต เดเตเดฏเตเดฏเตเด
เด เดฎเดคเตเดธเดฐเดคเตเดคเดฟเดฒเต เดกเดพเดฑเตเดฑ เดจเตฝเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเต เดฑเตเดกเดฟเดฎเตเดฏเตเดกเต เดเดฎเตเดเตเดเดณเตเดเต เดฐเตเดชเดคเตเดคเดฟเดฒเดฒเตเดฒ, เดฎเดฑเดฟเดเตเดเต เดชเตเดฏเดฟเดจเตเดฑเต เดเตเตผเดกเดฟเดจเตเดฑเตเดฑเตเดเดณเตเดณเตเดณ JSON-เดเตพ เด เดเดเตเดเดฟเดฏ 340 CSV เดซเดฏเดฒเตเดเดณเตเดเต (เดเดฐเต เดเตเดฒเดพเดธเดฟเดจเตเด เดเดฐเต เดซเดฏเตฝ) เดฐเตเดชเดคเตเดคเดฟเดฒเดพเดฃเต. เด เดชเตเดฏเดฟเดจเตเดฑเตเดเตพ เดฒเตเดจเตเดเดณเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดฒเตเดเต, 256x256 เดชเดฟเดเตเดธเดฒเตเดเตพ เด เดณเดเตเดเตเดจเตเดจ เดเดฐเต เด เดจเตเดคเดฟเดฎ เดเดฟเดคเตเดฐเด เดจเดฎเตเดเตเดเต เดฒเดญเดฟเดเตเดเตเด. เดเดฐเต เดฑเตเดเตเดเตเตผเดกเดฟเดจเตเด เดกเดพเดฑเตเดฑเดพเดธเตเดฑเตเดฑเต เดถเตเดเดฐเดฟเดเตเดเตเดจเตเดจ เดธเดฎเดฏเดคเตเดคเต เดเดชเดฏเตเดเดฟเดเตเด เดเตเดฒเดพเดธเดฟเดซเดฏเตผ เดเดฟเดคเตเดฐเด เดถเดฐเดฟเดฏเดพเดฏเดฟ เดคเดฟเดฐเดฟเดเตเดเดฑเดฟเดเตเดเต เดเดจเตเดจเต เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจ เดเดฐเต เดฒเตเดฌเตฝ เดเดฃเตเดเต, เดเดฟเดคเตเดฐเดคเตเดคเดฟเดจเตเดฑเต เดฐเดเดฏเดฟเดคเดพเดตเต เดคเดพเดฎเดธเดฟเดเตเดเตเดจเตเดจ เดฐเดพเดเตเดฏเดคเตเดคเดฟเดจเตเดฑเต เดฐเดฃเตเดเดเตเดทเดฐ เดเตเดกเต, เดเดฐเต เด เดฆเตเดตเดฟเดคเตเดฏ เดเดกเดจเตเดฑเดฟเดซเดฏเตผ, เดเดฐเต เดเตเดเดธเตเดฑเตเดฑเดพเดฎเตเดชเต เดซเดฏเดฒเดฟเดจเตเดฑเต เดชเตเดฐเตเดฎเดพเดฏเดฟ เดชเตเดฐเตเดคเตเดคเดชเตเดชเตเดเตเดจเตเดจ เดเดฐเต เดเตเดฒเดพเดธเต เดจเดพเดฎเดตเตเด. เดฏเดฅเดพเตผเดคเตเดฅ เดกเดพเดฑเตเดฑเดฏเตเดเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดชเดคเดฟเดชเตเดชเต เดเตผเดเตเดเตเดตเดฟเตฝ 7.4 GB เดญเดพเดฐเดตเตเด เด เตบเดชเดพเดเตเดเต เดเตเดฏเตเดคเดคเดฟเดจเต เดถเตเดทเด เดเดเดฆเตเดถเด 20 GB เดเดฃเต, เด เตบเดชเดพเดเตเดเต เดเตเดฏเตเดคเดคเดฟเดจเต เดถเตเดทเดฎเตเดณเตเดณ เดฎเตเดดเตเดตเตป เดกเดพเดฑเตเดฑเดฏเตเด 240 GB เดเดเตเดเตเดเตเด. เดฐเดฃเตเดเต เดชเดคเดฟเดชเตเดชเตเดเดณเตเด เดเดฐเต เดกเตเดฐเตเดฏเดฟเดเดเตเดเตพ เดชเตเดจเตผเดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเตเดจเตเดจเตเดตเตเดจเตเดจเต เดธเดเดเดพเดเดเตผ เดเดฑเดชเตเดชเดพเดเตเดเดฟ, เด เดคเดพเดฏเดคเต เดชเตเตผเดฃเตเดฃ เดชเดคเดฟเดชเตเดชเต เด เดจเดพเดตเดถเตเดฏเดฎเดพเดฃเต. เดเดคเดพเดฏเดพเดฒเตเด, เดเตเดฐเดพเดซเดฟเดเต เดซเดฏเดฒเตเดเดณเดฟเดฒเต เด เดฑเตเดเดณเตเดเต เดฐเตเดชเดคเตเดคเดฟเดฒเต 50 เดฆเดถเดฒเดเตเดทเด เดเดฟเดคเตเดฐเดเตเดเตพ เดธเดเดญเดฐเดฟเดเตเดเตเดจเตเดจเดคเต เดฒเดพเดญเดเดฐเดฎเดฒเตเดฒเตเดจเตเดจเต เดเดเดจเดเดฟ เดชเดฐเดฟเดเดฃเดฟเดเตเดเดชเตเดชเตเดเตเดเต, เดเตเดเดพเดคเต เดเดฒเตเดฒเดพ CSV เดซเดฏเดฒเตเดเดณเตเด เดเตผเดเตเดเตเดตเดฟเตฝ เดจเดฟเดจเตเดจเต เดฒเดฏเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดเดเตเดเตพ เดคเตเดฐเตเดฎเดพเดจเดฟเดเตเดเต. train_simplified.zip เดเดฐเต เดฌเดพเดเตเดเดฟเดจเตเด เดเดตเดถเตเดฏเดฎเดพเดฏ เดตเดฒเตเดชเตเดชเดคเตเดคเดฟเดฒเตเดณเตเดณ "เดเตบ เดฆเดฟ เดซเตเดฒเต" เดเดฎเตเดเตเดเดณเตเดเต เดคเตเดเตผเดจเตเดจเตเดณเตเดณ เดคเดฒเดฎเตเดฑเดเดณเตเดณเตเดณ เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเดฒเตเดเตเดเต.
เดจเดจเตเดจเดพเดฏเดฟ เดคเตเดณเดฟเดฏเดฟเดเตเดเดชเตเดชเตเดเตเด เดเดฐเต เดธเดเดตเดฟเดงเดพเดจเด เดกเดฟเดฌเดฟเดเดเดเดธเดพเดฏเดฟ เดคเดฟเดฐเดเตเดเตเดเตเดคเตเดคเต เดฎเตเดจเตเดฑเตเดฑเตเดกเดฟเดฌเดฟ, เด
เดคเดพเดฏเดคเต R เดเดฐเต เดชเดพเดเตเดเตเดเดพเดฏเดฟ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตฝ
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 - เดเดฎเดพเตปเดกเต เดเดชเดฏเตเดเดฟเดเตเดเต CSV เดซเดฏเดฒเตเดเตพ เดจเตเดฐเดฟเดเตเดเต เดชเดเตผเดคเตเดคเตเด เดเดจเตเดจเดคเดพเดฃเต เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเดฒเตเดเตเดเต เดกเดพเดฑเตเดฑ เดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฑเตเดฑเดตเตเด เดตเตเดเดคเดฏเตเดฑเดฟเดฏ เดฎเดพเตผเดเด. COPY OFFSET 2 INTO tablename FROM path USING DELIMITERS ',','n','"' NULL AS '' BEST EFFORT
เดเดตเดฟเดเต tablename
- เดชเดเตเดเดฟเดเดฏเตเดเต เดชเตเดฐเต เดเดชเตเดชเด path
- เดซเดฏเดฒเดฟเดฒเตเดเตเดเตเดณเตเดณ เดชเดพเดค. เดเตผเดเตเดเตเดตเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดฎเตเดชเตเตพ, เดฌเดฟเตฝเดฑเตเดฑเต-เดเตป เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตฝ เดเดฃเตเดเตเดคเตเดคเดฟ unzip
เดเตผเดเตเดเตเดตเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดจเดฟเดฐเดตเดงเดฟ เดซเดฏเดฒเตเดเดณเดฟเตฝ R เดถเดฐเดฟเดฏเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ, เด
เดคเดฟเดจเดพเตฝ เดเดเตเดเตพ เดธเดฟเดธเตเดฑเตเดฑเด เดเดชเดฏเตเดเดฟเดเตเดเต unzip
(เดชเดพเดฐเดพเดฎเตเดฑเตเดฑเตผ เดเดชเดฏเตเดเดฟเดเตเดเต 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
เดกเดพเดฑเตเดฑ เดฐเตเดชเดพเดจเตเดคเดฐเดชเตเดชเตเดเตเดคเตเดคเตเดจเตเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเด.
เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเดฒเตเดเตเดเต เดคเตเดเตผเดเตเดเดฏเดพเดฏเดฟ เดกเดพเดฑเตเดฑ เดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเตเดกเต:
เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเดฒเตเดเตเดเต เดกเดพเดฑเตเดฑ เดเดดเตเดคเตเดจเตเดจเต
# ะกะฟะธัะพะบ ัะฐะนะปะพะฒ ะดะปั ะทะฐะฟะธัะธ
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
เดเดชเดฏเตเดเดฟเดเตเด เดกเตเดฐเตเดตเดฟเดจเตเดฑเต เดธเตเดชเตเดกเต เดธเดตเดฟเดถเตเดทเดคเดเดณเต เดเดถเตเดฐเดฏเดฟเดเตเดเต เดกเดพเดฑเตเดฑ เดฒเตเดกเดฟเดเดเต เดธเดฎเดฏเด เดตเตเดฏเดคเตเดฏเดพเดธเดชเตเดชเตเดเดพเด. เดเดเตเดเดณเตเดเต เดเดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดเดฐเต เดเดธเตเดเดธเตเดกเดฟเดฏเดฟเตฝ เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดฐเต เดซเตเดฒเดพเดทเต เดกเตเดฐเตเดตเดฟเตฝ (เดธเตเดดเตเดธเต เดซเดฏเตฝ) เดจเดฟเดจเตเดจเต เดเดฐเต เดเดธเตเดเดธเตเดกเดฟเดฏเดฟเดฒเตเดเตเดเต (เดกเดฟเดฌเดฟ) เดตเดพเดฏเดฟเดเตเดเดพเดจเตเด เดเดดเตเดคเดพเดจเตเด 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
. เดเดคเดฟเดจเดพเดฏเดฟ เดเดเตเดเตพ 3 เดคเดจเตเดคเตเดฐเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต. เดจเดฟเดฐเตเดเตเดทเดฃ เดเดกเดฟ เดธเดเดญเดฐเดฟเดเตเดเตเดจเตเดจ เดคเดฐเดคเตเดคเดฟเดจเตเดฑเต เด
เดณเดตเต เดเตเดฑเดฏเตเดเตเดเตเด เดเดจเตเดจเดคเดพเดฏเดฟเดฐเตเดจเตเดจเต เดเดฆเตเดฏเดคเตเดคเตเดคเต. เดฏเดฅเดพเตผเดคเตเดฅ เดกเดพเดฑเตเดฑเดพ เดธเตเดฑเตเดฑเดฟเตฝ, เดเดกเดฟ เดธเดเดญเดฐเดฟเดเตเดเดพเตป เดเดตเดถเตเดฏเดฎเดพเดฏ เดคเดฐเด bigint
, เดเดจเตเดจเดพเตฝ เดจเดฟเดฐเตเดเตเดทเดฃเดเตเดเดณเตเดเต เดเดฃเตเดฃเด เด
เดตเดฏเตเดเต เดเดกเดจเตเดฑเดฟเดซเดฏเดฑเตเดเตพ, เดเตผเดกเดฟเดจเตฝ เดจเดฎเตเดชเดฑเดฟเดจเต เดคเตเดฒเตเดฏเดฎเดพเดฏ เดคเดฐเดคเตเดคเดฟเดฒเตเดเตเดเต เดเดเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเต เดธเดพเดงเตเดฏเดฎเดพเดเตเดเตเดจเตเดจเต. int
. เด เดธเดพเดนเดเดฐเตเดฏเดคเตเดคเดฟเตฝ เดคเดฟเดฐเดเตเดเดฟเตฝ เดตเดณเดฐเต เดตเตเดเดคเตเดคเดฟเดฒเดพเดฃเต. เดฐเดฃเตเดเดพเดฎเดคเตเดคเต เดคเดจเตเดคเตเดฐเด เดเดชเดฏเตเดเดฟเดเตเดเตเดเดฏเดพเดฏเดฟเดฐเตเดจเตเดจเต ORDERED INDEX
- เดฒเดญเตเดฏเดฎเดพเดฏ เดเดฒเตเดฒเดพ เดเดพเดฐเตเดฏเดเตเดเดณเดฟเดฒเตเดเตเดฏเตเด เดเดเตเดเตพ เด
เดจเตเดญเดตเดชเดฐเดฎเดพเดฏเดฟ เด เดคเตเดฐเตเดฎเดพเดจเดคเตเดคเดฟเดฒเตเดคเตเดคเดฟ PREPARE
เดเดฐเต เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดเดฐเต เดเตเดเตเดเด เด
เดจเตเดตเตเดทเดฃเดเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเตเดฎเตเดชเตเตพ เดคเดฏเตเดฏเดพเดฑเดพเดเตเดเดฟเดฏ เดเดฐเต เดชเดฆเดชเตเดฐเดฏเตเดเดคเตเดคเดฟเดจเตเดฑเต เดคเตเดเตผเดจเตเดจเตเดณเตเดณ เดเดชเดฏเตเดเดคเตเดคเดฟเดฒเตเดเต, เดเดจเตเดจเดพเตฝ เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ เดฒเดณเดฟเดคเดฎเดพเดฏ เดเดจเตเดจเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเดชเตเดชเตเดเตเดคเตเดคเตเดฎเตเดชเตเตพ เดเดฐเต เดจเตเดเตเดเดฎเตเดฃเตเดเต SELECT
เดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเดเตเดเดฃเดเตเดเต เดชเดฟเดถเดเดฟเดจเตเดฑเต เดชเดฐเดฟเดงเดฟเดเตเดเตเดณเตเดณเดฟเดฒเดพเดฃเตเดจเตเดจเต เดคเตเดณเดฟเดเตเดเต.
เดกเดพเดฑเตเดฑ เด เดชเตโเดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจ เดชเตเดฐเดเตเดฐเดฟเดฏเดฏเตเดเตเดเต 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)
2. เดฌเดพเดเตเดเตเดเตพ เดคเดฏเตเดฏเดพเดฑเดพเดเตเดเตเดจเตเดจเต
เดฎเตเดดเตเดตเตป เดฌเดพเดเตเดเต เดคเดฏเตเดฏเดพเดฑเดพเดเตเดเตฝ เดชเตเดฐเดเตเดฐเดฟเดฏเดฏเตเด เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดเดเตเดเดเตเดเตพ เดเตพเดเตเดเตเดณเตเดณเตเดจเตเดจเต:
- เดชเตเดฏเดฟเดจเตเดฑเตเดเดณเตเดเต เดเตเตผเดกเดฟเดจเตเดฑเตเดฑเตเดเดณเตเดณเตเดณ เดธเตเดเตเดฐเดฟเดเดเตเดเดณเตเดเต เดตเตเดเตโเดเดฑเตเดเตพ เด เดเดเตเดเดฟเดฏ เดจเดฟเดฐเดตเดงเดฟ JSON-เดเตพ เดชเดพเดดเตโเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเต.
- เดเดตเดถเตเดฏเดฎเตเดณเตเดณ เดตเดฒเตเดชเตเดชเดคเตเดคเดฟเดฒเตเดณเตเดณ เดเดฐเต เดเดฎเตเดเดฟเตฝ เดชเตเดฏเดฟเดจเตเดฑเตเดเดณเตเดเต เดเตเตผเดกเดฟเดจเตเดฑเตเดฑเตเดเดณเต เด เดเดฟเดธเตเดฅเดพเดจเดฎเดพเดเตเดเดฟ เดจเดฟเดฑเดฎเตเดณเตเดณ เดตเดฐเดเตพ เดตเดฐเดฏเตเดเตเดเตเดจเตเดจเต (เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, 256ร256 เด เดฒเตเดฒเตเดเตเดเดฟเตฝ 128ร128).
- เดคเดคเตเดซเดฒเดฎเดพเดฏเตเดฃเตเดเดพเดเตเดจเตเดจ เดเดฟเดคเตเดฐเดเตเดเตพ เดเดฐเต เดเตเตปเดธเดฑเดฟเดฒเตเดเตเดเต เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด เดเตเดฏเตเดฏเตเดจเตเดจเต.
เดชเตเดคเตเดคเตบ เดเตเตผเดฃเดฒเตเดเตพ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดฎเดคเตเดธเดฐเดคเตเดคเดฟเดจเตเดฑเต เดญเดพเดเดฎเดพเดฏเดฟ, เดชเตเดฐเดถเตเดจเด เดชเตเดฐเดพเดฅเดฎเดฟเดเดฎเดพเดฏเดฟ เดเดชเดฏเตเดเดฟเดเตเดเต เดชเดฐเดฟเดนเดฐเดฟเดเตเดเต เดเดชเตเดชเตบโเดธเดฟโเดตเดฟ. R-เดฒเต เดเดฑเตเดฑเดตเตเด เดฒเดณเดฟเดคเดตเตเด เดตเตเดฏเดเตเดคเดตเตเดฎเดพเดฏ เด เดจเดฒเตเดเตเดเดณเดฟเตฝ เดเดจเตเดจเต เดเดคเตเดชเตเดฒเต เดเดพเดฃเดชเตเดชเตเดเตเด:
R-เตฝ 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 เดเตเดณเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดกเตเดฐเตเดฏเดฟเดเดเต เดจเดเดคเตเดคเตเดเดฏเตเด เดฑเดพเดฎเดฟเตฝ เดธเดเดญเดฐเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจ เดเดฐเต เดคเดพเตฝเดเตเดเดพเดฒเดฟเด PNG-เดฒเตเดเตเดเต เดธเดเดฐเดเตเดทเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต (เดฒเดฟเดจเดเตเดธเดฟเตฝ, เดคเดพเตฝเดเตเดเดพเดฒเดฟเด R เดกเดฏเดฑเดเตเดเดฑเดฟเดเตพ เดกเดฏเดฑเดเตเดเดฑเดฟเดฏเดฟเตฝ เดธเตเดฅเดฟเดคเดฟเดเตเดฏเตเดฏเตเดจเตเดจเต. /tmp
, เดฑเดพเดฎเดฟเตฝ เดเดเดฟเดชเตเดชเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต). เด เดซเดฏเตฝ เดชเดฟเดจเตเดจเตเดเต 0 เดฎเตเดคเตฝ 1 เดตเดฐเตเดฏเตเดณเตเดณ เดธเดเดเตเดฏเดเดณเตเดณเตเดณ เดเดฐเต เดคเตเดฐเดฟเดฎเดพเดจ เด
เดฑเต เดเดฏเดฟ เดตเดพเดฏเดฟเดเตเดเตเดจเตเดจเต. เดเดคเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต, เดเดพเดฐเดฃเด เดเตเดเตเดคเตฝ เดชเดฐเดฎเตเดชเดฐเดพเดเดคเดฎเดพเดฏ BMP, เดนเตเดเตโเดธเต เดเดณเตผ เดเตเดกเตเดเดณเตเดณเตเดณ เดเดฐเต เดฑเต เด
เดฑเตเดฏเดฟเดฒเตเดเตเดเต เดฑเตเดกเต เดเตเดฏเตเดฏเดชเตเดชเตเดเตเด.
เดจเดฎเตเดเตเดเต เดซเดฒเด เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเดพเด:
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))
เดฌเดพเดเตเดเต เดคเดจเตเดจเต เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดฐเตเดคเดฟเดฏเดฟเตฝ เดฐเตเดชเตเดเดฐเดฟเดเตเดเตเด:
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
เด เดจเดเดชเตเดชเดพเดเตเดเตฝ เดเดเตเดเตพเดเตเดเต เดเดชเดฏเตเดเตเดคเดฎเดพเดฏเดฟ เดคเตเดจเตเดจเดฟ, เดเดพเดฐเดฃเด เดตเดฒเดฟเดฏ เดฌเดพเดเตเดเตเดเดณเตเดเต เดฐเตเดชเตเดเดฐเดฃเดคเตเดคเดฟเดจเต เดตเดณเดฐเต เดธเดฎเดฏเดฎเตเดเตเดเตเดเตเด, เดเตเดเดพเดคเต เดถเดเตเดคเดฎเดพเดฏ เดเดฐเต เดฒเตเดฌเตเดฐเดฑเดฟ เดเดชเดฏเตเดเดฟเดเตเดเต เดเดเตเดเดณเตเดเต เดธเดนเดชเตเดฐเดตเตผเดคเตเดคเดเดฐเตเดเต เด เดจเตเดญเดตเด เดชเตเดฐเดฏเตเดเดจเดชเตเดชเตเดเตเดคเตเดคเดพเตป เดเดเตเดเตพ เดคเตเดฐเตเดฎเดพเดจเดฟเดเตเดเต. เดเดชเตเดชเตบโเดธเดฟโเดตเดฟ. เด เดธเดฎเดฏเดคเตเดคเต R-เดจเดพเดฏเดฟ เดเดฐเต เดฑเตเดกเดฟเดฎเตเดฏเตเดกเต เดชเดพเดเตเดเตเดเต เดเดฒเตเดฒเดพเดฏเดฟเดฐเตเดจเตเดจเต (เดเดชเตเดชเตเตพ เดเดจเตเดจเตเดฎเดฟเดฒเตเดฒ), เด เดคเดฟเดจเดพเตฝ เดเดตเดถเตเดฏเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเดฑเต เดเดฑเตเดฑเดตเตเด เดเตเดฑเดเตเด เดจเดฟเตผเดตเตเดตเดนเดฃเด C++ เตฝ เดเดดเตเดคเดฟเดฏเดคเต เดเดชเดฏเตเดเดฟเดเตเดเต R เดเตเดกเดฟเดฒเตเดเตเดเต เดธเดเดฏเตเดเดฟเดชเตเดชเดฟเดเตเดเต Rcpp.
เดชเตเดฐเดถเตเดจเด เดชเดฐเดฟเดนเดฐเดฟเดเตเดเดพเตป, เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดชเดพเดเตเดเตเดเตเดเดณเตเด เดฒเตเดฌเตเดฐเดฑเดฟเดเดณเตเด เดเดชเดฏเตเดเดฟเดเตเดเต:
-
เดเดชเตเดชเตบโเดธเดฟโเดตเดฟ เดเดฟเดคเตเดฐเดเตเดเดณเตเด เดตเดฐเดเดณเตเด เดเดชเดฏเตเดเดฟเดเตเดเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเตป. เดฎเตเตปเดเตเดเตเดเดฟ เดเตปเดธเตเดฑเตเดฑเดพเตพ เดเตเดฏเตเดค เดธเดฟเดธเตเดฑเตเดฑเด เดฒเตเดฌเตเดฐเดฑเดฟเดเดณเตเด เดนเตเดกเตผ เดซเดฏเดฒเตเดเดณเตเด เดกเตเดจเดพเดฎเดฟเดเต เดฒเดฟเดเตเดเดฟเดเดเตเด เดเดชเดฏเตเดเดฟเดเตเดเต.
-
เดเดเตเดธเตเดฑเตเดฑเตปเดธเตผ เดฎเตพเดเตเดเดฟเดกเตเดฎเตปเดทเดฃเตฝ เด เดฑเตเดเดณเตเด เดเตเตปเดธเดฑเตเดเดณเตเด เดเดชเดฏเตเดเดฟเดเตเดเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต. เด เดคเต เดชเตเดฐเดฟเดฒเตเดณเตเดณ R เดชเดพเดเตเดเตเดเดฟเตฝ เดเตพเดชเตเดชเตเดเตเดคเตเดคเดฟเดฏเดฟเดเตเดเตเดณเตเดณ เดนเตเดกเตผ เดซเดฏเดฒเตเดเตพ เดเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต. เดตเดฐเดฟ เดฎเตเดเตผ, เดเตเดณเด เดฎเตเดเตผ เดเตเดฐเดฎเดคเตเดคเดฟเตฝ เดฎเตพเดเตเดเดฟเดกเตเดฎเตปเดทเดฃเตฝ เด เดฑเตเดเตพเดเตเดเตเดชเตเดชเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเตป เดฒเตเดฌเตเดฐเดฑเดฟ เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต.
-
ndjson JSON เดชเดพเดดเตโเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต. เด เดฒเตเดฌเตเดฐเดฑเดฟ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต เดเดเตเดธเตเดฑเตเดฑเตปเดธเตผ เด เดคเต เดชเตเดฐเตเดเดเตเดฑเตเดฑเดฟเตฝ เดเดฃเตเดเตเดเตเดเดฟเตฝ เดธเตเดตเดฏเดฎเตเดต.
-
RcppThread JSON-เตฝ เดจเดฟเดจเตเดจเต เดตเตเดเตโเดเดฑเดฟเดจเตเดฑเต เดฎเตพเดเตเดเดฟ-เดคเตเดฐเตเดกเต เดชเตเดฐเตเดธเดธเตเดธเดฟเดเดเต เดธเดเดเดเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต. เด เดชเดพเดเตเดเตเดเต เดจเตฝเดเตเดจเตเดจ เดนเตเดกเตผ เดซเดฏเดฒเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต. เดเตเดเตเดคเตฝ เดเดจเดชเตเดฐเดฟเดฏเดฎเดพเดฏเดคเดฟเตฝ เดจเดฟเดจเตเดจเต RcppParallel เดชเดพเดเตเดเตเดเดฟเดจเต, เดฎเดฑเตเดฑเต เดเดพเดฐเตเดฏเดเตเดเตพเดเตเดเตเดชเตเดชเด, เดเดฐเต เดฌเดฟเตฝเดฑเตเดฑเต-เดเตป เดฒเตเดชเตเดชเต เดเดจเตเดฑเดฑเดชเตเดฑเตเดฑเต เดฎเตเดเตเดเดพเดจเดฟเดธเดฎเตเดฃเตเดเต.
เด เดคเต เดถเตเดฐเดฆเตเดงเตเดฏเดฎเดพเดฃเต เดเดเตเดธเตเดฑเตเดฑเตปเดธเตผ เดเดฐเต เดฆเตเดตเดพเดจเตเดเตเดฐเดนเดฎเดพเดฏเดฟ เดฎเดพเดฑเดฟ: เดเดคเดฟเดจเต เดตเดฟเดชเตเดฒเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดทเดฎเดคเดฏเตเด เดเดฏเตผเดจเตเดจ เดชเตเดฐเดเดเดจเดตเตเดฎเตเดฃเตเดเต เดเดจเตเดจเดคเดฟเดจเต เดชเตเดฑเดฎเต, เด เดคเดฟเดจเตเดฑเต เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผ เดคเดฟเดเดเตเดเตเด เดชเตเดฐเดคเดฟเดเดฐเดฟเดเตเดเตเดเดฏเตเด เดเตเดฆเตเดฏเดเตเดเตพเดเตเดเต เดเดเดจเดเดฟ เดตเดฟเดถเดฆเดฎเดพเดฏเตเด เดเดคเตเดคเดฐเด เดจเตฝเดเตเดเดฏเตเด เดเตเดฏเตเดคเต. เด เดตเดฐเตเดเต เดธเดนเดพเดฏเดคเตเดคเตเดเต, เดเดชเตเดชเตบเดธเดฟเดตเดฟ เดฎเตเดเตเดฐเดฟเดเตเดธเตเดเดณเต เดเดเตโเดธเตโเดเตเตปเดธเตผ เดเตเตปเดธเดฑเตเดเดณเดพเดฏเดฟ เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด เดเตเดฏเตเดฏเดพเดจเตเด 3-เดกเตเดฎเตปเดทเดฃเตฝ เดเดฎเตเดเต เดเตเตปเดธเดฑเตเดเดณเต เดถเดฐเดฟเดฏเดพเดฏ เด เดณเดตเดฟเดจเตเดฑเต (เดฌเดพเดเตเดเต เดคเดจเตเดจเต) 4-เดกเตเดฎเตปเดทเดฃเตฝ เดเตเตปเดธเดฑเดฟเดฒเตเดเตเดเต เดธเดเดฏเตเดเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดฎเดพเตผเดเดตเตเด เดธเดพเดงเตเดฏเดฎเดพเดฏเดฟ.
Rcpp, xtensor, RcppThread เดเดจเตเดจเดฟเดต เดชเด เดฟเดเตเดเดพเดจเตเดณเตเดณ เดธเดพเดฎเดเตเดฐเดฟเดเตพ
เดธเดฟเดธเตเดฑเตเดฑเด เดซเดฏเดฒเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจ เดซเดฏเดฒเตเดเตพ เดเดเดชเตเตฝ เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดเตปเดธเตเดฑเตเดฑเดพเตพ เดเตเดฏเตเดคเดฟเดเตเดเตเดณเตเดณ เดฒเตเดฌเตเดฐเดฑเดฟเดเดณเตเดฎเดพเดฏเตเดณเตเดณ เดกเตเดจเดพเดฎเดฟเดเต เดฒเดฟเดเตเดเดฟเดเดเดฟเดจเตเด เดเดเตเดเตพ เดชเดพเดเตเดเตเดเดฟเตฝ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดฟเดฏ เดชเตเดฒเดเดฟเตป เดฎเตเดเตเดเดพเดจเดฟเดธเด เดเดชเดฏเตเดเดฟเดเตเดเต. Rcpp. เดชเดพเดคเดเดณเตเด เดซเตเดฒเดพเดเตเดเดณเตเด เดธเตเดตเดฏเดฎเตเดต เดเดฃเตเดเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต, เดเดเตเดเตพ เดเดฐเต เดเดจเดชเตเดฐเดฟเดฏ Linux เดฏเตเดเตเดเดฟเดฒเดฟเดฑเตเดฑเดฟ เดเดชเดฏเตเดเดฟเดเตเดเต pkg-config.
OpenCV เดฒเตเดฌเตเดฐเดฑเดฟ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต Rcpp เดชเตเดฒเดเดฟเตป เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตฝ
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 เดชเดพเดดเตโเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด เดฎเตเดกเดฒเดฟเดฒเตเดเตเดเต เดชเตเดฐเดเตเดทเตเดชเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เดเดฐเต เดฌเดพเดเตเดเต เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตฝ เดเตเดกเต เดธเตโเดชเตเดฏเดฟเดฒเดฑเดฟเดจเต เดเตเดดเดฟเตฝ เดจเตฝเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต. เดเดฆเตเดฏเด, เดนเตเดกเตผ เดซเดฏเดฒเตเดเตพเดเตเดเดพเดฏเดฟ เดคเดฟเดฐเดฏเดพเตป เดเดฐเต เดชเตเดฐเดพเดฆเตเดถเดฟเด เดชเตเดฐเตเดเดเตเดฑเตเดฑเต เดกเดฏเดฑเดเตโเดเดฑเดฟ เดเตเตผเดเตเดเตเด (ndjson-เดจเต เดเดตเดถเตเดฏเดฎเดพเดฃเต):
Sys.setenv("PKG_CXXFLAGS" = paste0("-I", normalizePath(file.path("src"))))
C++-เตฝ 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
เดเดฎเดพเตปเดกเต เดเดชเดฏเตเดเดฟเดเตเดเต เดเดเดชเตเตฝ เดเตเดฏเตเดฏเตเด Rcpp::sourceCpp(file = "src/cv_xt.cpp", env = .GlobalEnv)
; เดเตเดฒเดฟเดเตเดเตเด เดเดตเดถเตเดฏเดฎเดพเดฃเต nlohmann/json.hpp
เดจเดฟเดจเตเดจเต
-
to_xt
โ เดเดฐเต เดเดฎเตเดเต เดฎเดพเดเตเดฐเดฟเดเตเดธเต เดฐเตเดชเดพเดจเตเดคเดฐเดชเตเดชเตเดเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดเตเดเดชเตเดฒเตเดฑเตเดฑเดกเต เดซเดเดเตเดทเตป (cv::Mat
) เดเดฐเต เดเตเตปเดธเดฑเดฟเดฒเตเดเตเดเตxt::xtensor
; -
parse_json
- เดซเดเดเตโเดทเตป เดเดฐเต JSON เดธเตเดเตเดฐเดฟเดเดเต เดชเดพเดดเตโเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเต, เดชเตเดฏเดฟเดจเตเดฑเตเดเดณเตเดเต เดเตเตผเดกเดฟเดจเตเดฑเตเดฑเตเดเตพ เดเดเตโเดธเตโเดเตเดฐเดพเดเตโเดฑเตเดฑเต เดเตเดฏเตเดฏเตเดจเตเดจเต, เด เดตเดฏเต เดเดฐเต เดตเตเดเตโเดเดฑเดฟเดฒเตเดเตเดเต เดชเดพเดเตเดเต เดเตเดฏเตเดฏเตเดจเตเดจเต; -
ocv_draw_lines
- เดคเดคเตเดซเดฒเดฎเดพเดฏเตเดฃเตเดเดพเดเตเดจเตเดจ เดชเตเดฏเดฟเดจเตเดฑเตเดเดณเตเดเต เดตเตเดเตเดฑเตเดฑเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต, เดฎเตพเดเตเดเดฟ-เดเดณเตผ เดฒเตเดจเตเดเตพ เดตเดฐเดฏเตเดเตเดเตเดจเตเดจเต; -
process
- เดฎเตเดเดณเดฟเดฒเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดเตพ เดธเดเดฏเตเดเดฟเดชเตเดชเดฟเดเตเดเตเดเดฏเตเด เดคเดคเตเดซเดฒเดฎเดพเดฏเตเดฃเตเดเดพเดเตเดจเตเดจ เดเดฎเตเดเต เดธเตเดเตเดฏเดฟเตฝ เดเตเดฏเตเดฏเดพเดจเตเดณเตเดณ เดเดดเดฟเดตเต เดเตเตผเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต; -
cpp_process_json_str
- เดซเดเดเตเดทเดจเดฟเตฝ เดชเตเดคเดฟเดฏเตเดprocess
, เดเดฐเต R-เดเดฌเตเดเดเตเดฑเตเดฑเดฟเดฒเตเดเตเดเต (เดฎเตพเดเตเดเดฟเดกเตเดฎเตปเดทเดฃเตฝ เด เดฑเต) เดซเดฒเด เดเดฏเดฑเตเดฑเตเดฎเดคเดฟ เดเตเดฏเตเดฏเตเดจเตเดจเต; -
cpp_process_json_vector
- เดซเดเดเตเดทเดจเดฟเตฝ เดชเตเดคเดฟเดฏเตเดcpp_process_json_str
, เดเดคเต เดฎเตพเดเตเดเดฟ-เดคเตเดฐเตเดกเดกเต เดฎเตเดกเดฟเตฝ เดเดฐเต เดธเตเดเตเดฐเดฟเดเดเต เดตเตเดเตเดฑเตเดฑเตผ เดชเตเดฐเตเดธเดธเตเดธเต เดเตเดฏเตเดฏเดพเตป เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต.
เดฎเตพเดเตเดเดฟ-เดเดณเตผ เดฒเตเดจเตเดเตพ เดตเดฐเดฏเตเดเตเดเตเดจเตเดจเดคเดฟเดจเต, HSV เดเดณเตผ เดฎเตเดกเตฝ เดเดชเดฏเตเดเดฟเดเตเดเต, เดคเตเดเตผเดจเตเดจเต RGB-เดฏเดฟเดฒเตเดเตเดเต เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด เดเตเดฏเตเดคเต. เดจเดฎเตเดเตเดเต เดซเดฒเด เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเดพเด:
arr <- cpp_process_json_str(tmp_data[4, drawing])
dim(arr)
# [1] 256 256 3
plot(magick::image_read(arr))
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")
เดจเดฟเดเตเดเตพเดเตเดเต เดเดพเดฃเดพเดจเดพเดเตเดจเตเดจเดคเตเดชเตเดฒเต, เดตเตเดเดค เดตเตผเดฆเตเดงเดจเดตเต เดตเดณเดฐเต เดชเตเดฐเดพเดงเดพเดจเตเดฏเดฎเตผเดนเดฟเดเตเดเตเดจเตเดจเดคเดพเดฏเดฟ เดฎเดพเดฑเดฟ, เดเตเดเดพเดคเต R เดเตเดกเต เดธเดฎเดพเดจเตเดคเดฐเดฎเดพเดเตเดเดฟ C++ เดเตเดกเต เดเดฃเตเดเตเดคเตเดคเตเดจเตเดจเดคเต เดธเดพเดงเตเดฏเดฎเดฒเตเดฒ.
3. เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเตฝ เดจเดฟเดจเตเดจเต เดฌเดพเดเตเดเตเดเตพ เด เตบเดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฑเตเดฑเดฑเตเดฑเตเดฑเดฑเตเดเตพ
RAM-เตฝ เดฏเตเดเดฟเดเตเด เดกเดพเดฑเตเดฑ เดชเตเดฐเตเดธเดธเตเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเตฝ R-เดจเต เด เตผเดนเดฎเดพเดฏ เดชเตเดฐเดถเดธเตเดคเดฟ เดเดฃเตเดเต, เด เดคเตเดธเดฎเดฏเด เดชเตเดคเตเดคเดฃเดฟเดจเต เดเดตเตผเดคเตเดคเดจ เดกเดพเดฑเตเดฑเดพ เดชเตเดฐเตเดธเดธเตเดธเดฟเดเดเดพเดฃเต เดเตเดเตเดคเตฝ เดธเดตเดฟเดถเตเดทเดค, เดเดคเต เดจเดฟเดเตเดเตพเดเตเดเต เดเดเตเดเต-เดเดซเต-เดเตเตผ เดเดฃเดเตเดเตเดเตเดเตเดเดฒเตเดเตพ (เดฌเดพเดนเตเดฏ เดฎเตเดฎเตเดฎเดฑเดฟ เดเดชเดฏเตเดเดฟเดเตเดเตเดณเตเดณ เดเดฃเดเตเดเตเดเตเดเตเดเดฒเตเดเตพ) เดเดณเตเดชเตเดชเดคเตเดคเดฟเดฒเตเด เดธเตเดตเดพเดญเดพเดตเดฟเดเดฎเดพเดฏเตเด เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดพเตป เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต. เดตเดฟเดตเดฐเดฟเดเตเด เดชเตเดฐเดถเตเดจเดคเตเดคเดฟเดจเตเดฑเต เดชเดถเตเดเดพเดคเตเดคเดฒเดคเตเดคเดฟเตฝ เดเดเตเดเตพเดเตเดเต เดเดฐเต เดฎเดฟเดเดเตเดเดคเตเด เดชเตเดฐเดธเดเตเดคเดตเตเดฎเดพเดฏ เดเดฆเดพเดนเดฐเดฃเด เดเตเดฐเตเดกเดฟเดฏเดจเตเดฑเต เดกเดฟเดธเตเดจเตเดฑเต เดฐเตเดคเดฟ เดเดชเดฏเตเดเดฟเดเตเดเต เดชเดฐเดฟเดถเตเดฒเดฟเดชเตเดชเดฟเดเตเด เดเดดเดคเตเดคเดฟเดฒเตเดณเตเดณ เดจเตเดฏเตเดฑเตฝ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเตเดเดณเดพเดฃเต, เดเดฐเต เดเดเตเดเดคเตเดคเดฟเดฒเตเด เดเตเดฐเตเดกเดฟเดฏเดจเตเดฑเดฟเดจเตเดฑเต เดเดเดฆเตเดถ เดเดฃเดเตเดเต เดเดชเดฏเตเดเดฟเดเตเดเต เดจเดฟเดฐเตเดเตเดทเดฃเดเตเดเดณเตเดเต เดเดฐเต เดเตเดฑเดฟเดฏ เดญเดพเดเด เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดฎเดฟเดจเดฟ-เดฌเดพเดเตเดเต.
เดชเตเดคเตเดคเดฃเดฟเตฝ เดเดดเตเดคเดฟเดฏ เดเดดเดคเตเดคเดฟเดฒเตเดณเตเดณ เดชเด เดจ เดเดเตเดเดเตเดเตเดเตเดเตพเดเตเดเต เดกเดพเดฑเตเดฑเดฏเต เด เดเดฟเดธเตเดฅเดพเดจเดฎเดพเดเตเดเดฟเดฏเตเดณเตเดณ เดเดฑเตเดฑเดฑเตเดฑเตเดฑเดฑเตเดเตพ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจ เดชเตเดฐเดคเตเดฏเตเด เดเตเดฒเดพเดธเตเดเตพ เดเดฃเตเดเต: เดชเดเตเดเดฟเดเดเตพ, เดซเตเตพเดกเดฑเตเดเดณเดฟเดฒเต เดเดฟเดคเตเดฐเดเตเดเตพ, เดฌเตเดจเดฑเดฟ เดซเตเตผเดฎเดพเดฑเตเดฑเตเดเตพ เดฎเตเดคเดฒเดพเดฏเดต. เดจเดฟเดเตเดเตพเดเตเดเต เดฑเตเดกเดฟเดฎเตเดฏเตเดกเต เดเดชเตเดทเดจเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเดพเด เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเด เดเตเดฒเดฟเดเตพเดเตเดเดพเดฏเดฟ เดธเตเดตเดจเตเดคเดฎเดพเดฏเดฟ เดเดดเตเดคเดพเด. R-เตฝ เดจเดฎเตเดเตเดเต เดชเตเดคเตเดคเตบ เดฒเตเดฌเตเดฐเดฑเดฟเดฏเตเดเต เดเดฒเตเดฒเดพ เดธเดตเดฟเดถเตเดทเดคเดเดณเตเด เดชเตเดฐเดฏเตเดเดจเดชเตเดชเตเดเตเดคเตเดคเดพเด keras เด เดคเต เดชเตเดฐเดฟเดฒเตเดณเตเดณ เดชเดพเดเตเดเตเดเต เดเดชเดฏเตเดเดฟเดเตเดเต เด เดคเดฟเดจเตเดฑเต เดตเดฟเดตเดฟเดง เดฌเดพเดเตเดเตเตปเดกเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต, เด เดคเต เดชเดพเดเตเดเตเดเดฟเดจเตเดฑเต เดฎเตเดเดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต เดเดพเดฒเดฟเด. เดฐเดฃเตเดเดพเดฎเดคเตเดคเตเดคเต เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด เดจเตเดฃเตเด เดฒเตเดเดจเด เด เตผเดนเดฟเดเตเดเตเดจเตเดจเต; R-เตฝ เดจเดฟเดจเตเดจเต เดชเตเดคเตเดคเตบ เดเตเดกเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดเดคเต เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเด เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, R, Python เดธเตเดทเดจเตเดเตพเดเตเดเดฟเดเดฏเดฟเตฝ เดเดฌเตเดเดเตเดฑเตเดฑเตเดเตพ เดเตเดฎเดพเดฑเดพเดจเตเด เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต, เดเดตเดถเตเดฏเดฎเดพเดฏ เดเดฒเตเดฒเดพ เดคเดฐเด เดชเดฐเดฟเดตเตผเดคเตเดคเดจเดเตเดเดณเตเด เดธเตเดตเดฏเดฎเตเดต เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเต.
MonetDBLite เดเดชเดฏเตเดเดฟเดเตเดเต เดเดฒเตเดฒเดพ เดกเดพเดฑเตเดฑเดฏเตเด เดฑเดพเดฎเดฟเตฝ เดธเดเดญเดฐเดฟเดเตเดเตเดฃเตเดเดคเดฟเดจเตเดฑเต เดเดตเดถเตเดฏเดเดค เดเดเตเดเตพ เดเดดเดฟเดตเดพเดเตเดเดฟ, เดเดฒเตเดฒเดพ "เดจเตเดฏเตเดฑเตฝ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต" เดเตเดฒเดฟเดเดณเตเด เดชเตเดคเตเดคเดฃเดฟเดฒเต เดเดฑเดฟเดเดฟเดจเตฝ เดเตเดกเต เดฎเตเดเตเดจ เดจเดฟเตผเดตเตเดตเดนเดฟเดเตเดเตเด, เดเดจเตเดจเตเด เดคเดฏเตเดฏเดพเดฑเดฒเตเดฒเดพเดคเตเดคเดคเดฟเดจเดพเตฝ เดเดเตเดเตพ เดกเดพเดฑเตเดฑเดฏเตเดเตเดเต เดฎเตเดเดณเดฟเตฝ เดเดฐเต เดเดฑเตเดฑเดฑเตเดฑเตเดฑเตผ เดเดดเตเดคเตเดฃเตเดเดคเตเดฃเตเดเต. R เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดชเตเดคเตเดคเดฃเดฟเตฝ เด เดคเตเดคเดฐเด เดเดฐเต เดธเดพเดนเดเดฐเตเดฏเดคเตเดคเดฟเดจเต. เดเดคเดฟเดจเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฏเตเด เดฐเดฃเตเดเต เดเดตเดถเตเดฏเดเดคเดเตพ เดฎเดพเดคเตเดฐเดฎเตเดฏเตเดณเตเดณเต: เดเดคเต เด เดจเดจเตเดคเดฎเดพเดฏ เดฒเตเดชเตเดชเดฟเตฝ เดฌเดพเดเตเดเตเดเตพ เดคเดฟเดฐเดฟเดเต เดจเตฝเดเตเดเดฏเตเด เดเดตเตผเดคเตเดคเดจเดเตเดเตพเดเตเดเดฟเดเดฏเดฟเตฝ เด เดคเดฟเดจเตเดฑเต เด เดตเดธเตเดฅ เดธเดเดฐเดเตเดทเดฟเดเตเดเตเดเดฏเตเด เดตเตเดฃเด (เดเตผ-เตฝ เดฐเดฃเตเดเดพเดฎเดคเตเดคเตเดคเต เด เดเดเตเดเตเดชเตเดเตเดเดฒเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดฐเตเดคเดฟเดฏเดฟเตฝ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเต). เดฎเตเดฎเตเดชเต, เดเดฑเตเดฑเดฑเตเดฑเตเดฑเดฑเดฟเดจเตเดณเตเดณเดฟเดฒเต เดจเดฎเตเดชเดฟ เด เดฑเตเดเดณเดพเดเตเดเดฟ เดเตผ เด เดฑเตเดเดณเต เดตเตเดฏเดเตเดคเดฎเดพเดฏเดฟ เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด เดเตเดฏเตเดฏเตเดฃเตเดเดคเต เดเดตเดถเตเดฏเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต, เดเดจเตเดจเดพเตฝ เดชเดพเดเตเดเตเดเดฟเดจเตเดฑเต เดจเดฟเดฒเดตเดฟเดฒเต เดชเดคเดฟเดชเตเดชเต keras เด เดคเต เดธเตเดตเดฏเด เดเตเดฏเตเดฏเตเดจเตเดจเต.
เดชเดฐเดฟเดถเตเดฒเดจเดคเตเดคเดฟเดจเตเด เดฎเตเดฒเตเดฏเดจเดฟเตผเดฃเตเดฃเดฏ เดกเดพเดฑเตเดฑเดฏเตเดเตเดเตเดฎเตเดณเตเดณ เดเดฑเตเดฑเดฑเตเดฑเตเดฑเตผ เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดคเดพเดฏเดฟ เดฎเดพเดฑเดฟ:
เดชเดฐเดฟเดถเตเดฒเดจเดคเตเดคเดฟเดจเตเด เดฎเตเดฒเตเดฏเดจเดฟเตผเดฃเตเดฃเดฏ เดกเดพเดฑเตเดฑเดฏเตเดเตเดเตเดฎเตเดณเตเดณ เดเดฑเตเดฑเดฑเตเดฑเตเดฑเตผ
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 เดชเดฟเดเตเดธเดฒเตเดเดณเตเดเต เดฑเตเตปเดกเดฑเดฟเดเดเต เดเดฎเตเดเตเดเตพเดเตเดเต เดธเดฎเดพเดจเดฎเดพเดฃเต, scale = 0.5
โ 128x128 เดชเดฟเดเตเดธเดฒเตเดเตพ), เดตเตผเดฃเตเดฃ เดธเตเดเดเด (color = FALSE
เดเดชเดฏเตเดเดฟเดเตเดเตเดฎเตเดชเตเตพ เดเตเดฐเตเดธเตเดเตเดฏเดฟเดฒเดฟเตฝ เดฑเตเตปเดกเดฑเดฟเดเดเต เดตเตเดฏเดเตเดคเดฎเดพเดเตเดเตเดจเตเดจเต color = TRUE
เดเดฐเต เดธเตเดเตเดฐเตเดเตเดเตเด เดเดฐเต เดชเตเดคเดฟเดฏ เดจเดฟเดฑเดคเตเดคเดฟเดฒเดพเดฃเต เดตเดฐเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเต) เดเตเดเดพเดคเต เดเดฎเตเดเตเดจเตเดฑเตเดฑเดฟเตฝ เดฎเตเตปเดเตเดเตเดเดฟ เดชเดฐเดฟเดถเตเดฒเดฟเดเตเด เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเตเดเตพเดเตเดเดพเดฏเตเดณเตเดณ เดเดฐเต เดชเตเดฐเตเดชเตเดฐเตเดธเดธเดฟเดเดเต เดธเตเดเดเดตเตเด. เดชเดฟเดเตเดธเตฝ เดฎเตเดฒเตเดฏเดเตเดเตพ เดเดเดตเตเดณ [0, 1] เดฎเตเดคเตฝ เดเดเดตเตเดณ [-1, 1] เดตเดฐเต เดธเตเดเตเดฏเดฟเตฝ เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดฐเดฃเตเดเดพเดฎเดคเตเดคเตเดคเต เดเดตเดถเตเดฏเดฎเดพเดฃเต, เดเดคเต เดตเดฟเดคเดฐเดฃเด เดเตเดฏเตเดคเดตเดฐเต เดชเดฐเดฟเดถเตเดฒเดฟเดชเตเดชเดฟเดเตเดเตเดฎเตเดชเตเตพ เดเดชเดฏเตเดเดฟเดเตเดเต. keras เดฎเตเดกเดฒเตเดเตพ.
เดฌเดพเดนเตเดฏ เดซเดเดเตโเดทเดจเดฟเตฝ เดเตผเดเตเดฏเตเดฎเตเดจเตเดฑเต เดคเดฐเด เดชเดฐเดฟเดถเตเดงเดจ, เดเดฐเต เดชเดเตเดเดฟเด เด
เดเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต data.table
เดเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดเตเดฐเดฎเดฐเดนเดฟเดคเดฎเดพเดฏเดฟ เดฎเดฟเดเตเดธเดกเต เดฒเตเตป เดจเดฎเตเดชเดฑเตเดเตพ samples_index
เดเตเดเดพเดคเต เดฌเดพเดเตเดเต เดจเดฎเตเดชเดฑเตเดเตพ, เดเตเดฃเตเดเตผ, เดชเดฐเดฎเดพเดตเดงเดฟ เดเดฃเตเดฃเด เดฌเดพเดเตเดเตเดเตพ, เดเตเดเดพเดคเต เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเตฝ เดจเดฟเดจเตเดจเต เดกเดพเดฑเตเดฑ เด
เตบเดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฐเต SQL เดเดเตเดธเตเดชเตเดฐเดทเตป. เดเตเดเดพเดคเต, เดเดณเตเดณเดฟเดฒเต เดซเดเดเตโเดทเดจเตเดฑเต เดเดฐเต เดซเดพเดธเตเดฑเตเดฑเต เด
เดจเดฒเตเดเต เดเดเตเดเตพ เดจเดฟเตผเดตเดเดฟเดเตเดเต keras::to_categorical()
. เดชเดฐเดฟเดถเตเดฒเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เดเดเตเดเตพ เดฎเดฟเดเตเดเดตเดพเดฑเตเด เดเดฒเตเดฒเดพ เดกเดพเดฑเตเดฑเดฏเตเด เดเดชเดฏเตเดเดฟเดเตเดเต, เดฎเตเดฒเตเดฏเดจเดฟเตผเดฃเตเดฃเดฏเดคเตเดคเดฟเดจเต เด
เดฐ เดถเดคเดฎเดพเดจเด เดถเตเดทเดฟเดเตเดเตเดจเตเดจเต, เด
เดคเดฟเดจเดพเตฝ เดฏเตเดเดคเตเดคเดฟเดจเตเดฑเต เดตเดฒเตเดชเตเดชเด เดชเดพเดฐเดพเดฎเตเดฑเตเดฑเดฑเดฟเตฝ เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเตเดเตเดคเตเดคเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต steps_per_epoch
เดตเดฟเดณเดฟเดเตเดเดชเตเดชเตเตพ keras::fit_generator()
, เดตเตเดฏเดตเดธเตเดฅเดฏเตเด if (i > max_i)
เดฎเตเดฒเตเดฏเดจเดฟเตผเดฃเตเดฃเดฏ เดเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เดฎเดพเดคเตเดฐเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเต.
เดเดจเตเดฑเตเดฃเตฝ เดซเดเดเตโเดทเดจเดฟเตฝ, เด
เดเตเดคเตเดค เดฌเดพเดเตเดเดฟเดจเดพเดฏเดฟ เดตเดฐเดฟ เดธเตเดเดฟเดเดเตพ เดตเตเดฃเตเดเตเดเตเดเตเดเตเดจเตเดจเต, เดฌเดพเดเตเดเต เดเตเดฃเตเดเตผ เดตเตผเดฆเตเดงเดฟเดเตเดเตเดจเตเดจเดคเตเดเต เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเตฝ เดจเดฟเดจเตเดจเต เดฑเตเดเตเดเตเตผเดกเตเดเตพ เด
เตบเดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเต, JSON เดชเดพเดดเตโเดธเดฟเดเดเต (เดซเดเดเตเดทเตป cpp_process_json_vector()
, C++ เตฝ เดเดดเตเดคเตเดเดฏเตเด เดเดฟเดคเตเดฐเดเตเดเตพเดเตเดเต เด
เดจเตเดฏเตเดเตเดฏเดฎเดพเดฏ เด
เดฑเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต. เดคเตเดเตผเดจเตเดจเต เดเตเดฒเดพเดธเต เดฒเตเดฌเดฒเตเดเดณเตเดณเตเดณ เดตเตบ-เดนเตเดเตเดเต เดตเตเดเตเดฑเตเดฑเดฑเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจเต, เดชเดฟเดเตเดธเตฝ เดฎเตเดฒเตเดฏเดเตเดเดณเตเด เดฒเตเดฌเดฒเตเดเดณเตเด เดเดณเตเดณ เด
เดฑเตเดเตพ เดเดฐเต เดฒเดฟเดธเตเดฑเตเดฑเดฟเดฒเตเดเตเดเต เดธเดเดฏเตเดเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเต, เด
เดคเต เดฑเดฟเดเตเดเตเตบ เดฎเตเดฒเตเดฏเดฎเดพเดฃเต. เดเตเดฒเดฟ เดตเตเดเดคเตเดคเดฟเดฒเดพเดเตเดเดพเตป, เดเดเตเดเตพ เดชเดเตเดเดฟเดเดเดณเดฟเตฝ เดธเตเดเดฟเดเดเดณเตเดเต เดธเตเดทเตเดเดฟ เดเดชเดฏเตเดเดฟเดเตเดเต data.table
เดเตเดเดพเดคเต เดฒเดฟเดเตเดเต เดตเดดเดฟเดฏเตเดณเตเดณ เดชเดฐเดฟเดทเตเดเตเดเดฐเดฃเดตเตเด - เด เดชเดพเดเตเดเตเดเต "เดเดฟเดชเตเดชเตเดเตพ" เดเดฒเตเดฒเดพเดคเต เดกเดพเดฑเตเดฑ. เดชเดเตเดเดฟเด R-เดฒเต เดเดคเตเดเตเดเดฟเดฒเตเด เดชเตเดฐเดงเดพเดจเดชเตเดชเตเดเตเด เดกเดพเดฑเตเดฑ เดเดชเดฏเตเดเดฟเดเตเดเต เดซเดฒเดชเตเดฐเดฆเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเต เดธเดเตเดเตฝเดชเตเดชเดฟเดเตเดเดพเตป เดชเตเดฐเดฏเดพเดธเดฎเดพเดฃเต.
เดเดฐเต Core i5 เดฒเดพเดชเตโเดเตเดชเตเดชเดฟเดฒเต เดตเตเดเดค เด เดณเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดฑเต เดซเดฒเดเตเดเตพ เดเดชเตเดฐเดเดพเดฐเดฎเดพเดฃเต:
เดเดฑเตเดฑเดฑเตเดฑเตเดฑเตผ เดฌเตเดเตเดเตเดฎเดพเตผเดเตเดเต
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)
เดจเดฟเดเตเดเตพเดเตเดเต เดฎเดคเดฟเดฏเดพเดฏ เดฑเดพเด เดเดฃเตเดเตเดเตเดเดฟเตฝ, เด
เดคเต เดฑเดพเดฎเดฟเดฒเตเดเตเดเต เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเดฟเดฒเตเดเต เดจเดฟเดเตเดเตพเดเตเดเต เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเดจเตเดฑเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด เดตเตเดเดคเตเดคเดฟเดฒเดพเดเตเดเดพเตป เดเดดเดฟเดฏเตเด (เดเดเตเดเดณเตเดเต เดเตเดฎเดคเดฒเดฏเตเดเตเดเต 32 เดเดฟเดฌเดฟ เดฎเดคเดฟ). เดฒเดฟเดจเดเตเดธเดฟเตฝ, เดชเดพเตผเดเตเดเตเดทเตป เดกเดฟเดซเตเตพเดเตเดเดพเดฏเดฟ เดฎเตเดฃเตเดเต เดเตเดฏเตเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต /dev/shm
, เดฑเดพเด เดถเตเดทเดฟเดฏเตเดเต เดชเดเตเดคเดฟ เดตเดฐเต เดเตพเดเตเดเตเดณเตเดณเตเดจเตเดจเต. เดเดกเดฟเดฑเตเดฑเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดฒเตเดเต เดจเดฟเดเตเดเตพเดเตเดเต เดเตเดเตเดคเตฝ เดนเตเดฒเตเดฑเตเดฑเต เดเตเดฏเตเดฏเดพเด /etc/fstab
เดชเตเดฒเตเดณเตเดณ เดเดฐเต เดฑเตเดเตเดเตเตผเดกเต เดฒเดญเดฟเดเตเดเดพเตป tmpfs /dev/shm tmpfs defaults,size=25g 0 0
. เดเดฎเดพเตปเดกเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเต เดฑเตเดฌเตเดเตเดเต เดเตเดฏเตเดคเต เดซเดฒเด เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเดคเต เดเดฑเดชเตเดชเดพเดเตเดเตเด df -h
.
เดเตเดธเตเดฑเตเดฑเต เดกเดพเดฑเตเดฑเดฏเตเดเตเดเตเดณเตเดณ เดเดฑเตเดฑเดฑเตเดฑเตเดฑเตผ เดตเดณเดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏเดฟ เดเดพเดฃเดชเตเดชเตเดเตเดจเตเดจเต, เดเดพเดฐเดฃเด เดเตเดธเตเดฑเตเดฑเต เดกเดพเดฑเตเดฑเดพเดธเตเดฑเตเดฑเต เดชเตเตผเดฃเตเดฃเดฎเดพเดฏเตเด เดฑเดพเดฎเดฟเดฒเตเดเตเดเต เดฏเตเดเดฟเดเตเดเตเดจเตเดจเต:
เดเตเดธเตเดฑเตเดฑเต เดกเดพเดฑเตเดฑเดฏเตเดเตเดเตเดณเตเดณ เดเดฑเตเดฑเดฑเตเดฑเตเดฑเตผ
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. เดฎเดพเดคเตเดเดพ เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏเดฏเตเดเต เดคเดฟเดฐเดเตเดเตเดเตเดชเตเดชเต
เดเดฆเตเดฏเดฎเดพเดฏเดฟ เดเดชเดฏเตเดเดฟเดเตเด เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏ (batch, height, width, 3)
, เด
เดคเดพเดฏเดคเต, เดเดพเดจเดฒเตเดเดณเตเดเต เดเดฃเตเดฃเด เดฎเดพเดฑเตเดฑเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ. เดชเตเดคเตเดคเดฃเดฟเตฝ เด
เดคเตเดคเดฐเด เดชเดฐเดฟเดฎเดฟเดคเดฟเดเดณเตเดจเตเดจเตเดฎเดฟเดฒเตเดฒ, เด
เดคเดฟเดจเดพเตฝ เดฏเดฅเดพเตผเดคเตเดฅ เดฒเตเดเดจเด (เดเตเดฐเดพเดธเต เดชเดคเดฟเดชเตเดชเดฟเดฒเต เดกเตเดฐเตเดชเตเดชเตเดเดเตเดเต เดเดฒเตเดฒเดพเดคเต) เดชเดฟเดจเตเดคเตเดเตผเดจเตเดจเต เดเดเตเดเตพ เดคเดฟเดฐเดเตเดเดฟเดเตเดเต เด เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏเดฏเตเดเต เดธเตเดตเดจเตเดคเด เดจเดเดชเตเดชเดพเดเตเดเตฝ เดเดดเตเดคเดฟ.
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)
}
เด เดธเดฎเตเดชเดจเดคเตเดคเดฟเดจเตเดฑเต เดชเตเดฐเดพเดฏเตเดฎเดเตพ เดตเตเดฏเดเตเดคเดฎเดพเดฃเต. เดเดจเดฟเดเตเดเต เดเดฐเตเดชเดพเดเต เดฎเตเดกเดฒเตเดเตพ เดชเดฐเตเดเตเดทเดฟเดเตเดเดพเตป เดเดเตเดฐเดนเดฎเตเดฃเตเดเต, เดเดจเตเดจเดพเตฝ เดจเตเดฐเตเดฎเดฑเดฟเดเตเดเต, เดเดฐเต เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเตเด เดธเตเดตเดฎเตเดงเดฏเดพ เดตเตเดฃเตเดเตเด เดเดดเตเดคเดพเตป เดเดพเตป เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ. เดเดฎเตเดเตเดจเตเดฑเตเดฑเดฟเตฝ เดฎเตเตปเดเตเดเตเดเดฟ เดชเดฐเดฟเดถเตเดฒเดฟเดชเตเดชเดฟเดเตเด เดฎเตเดกเดฒเตเดเดณเตเดเต เดญเดพเดฐเด เดเดชเดฏเตเดเดฟเดเตเดเดพเดจเตเดณเตเดณ เด
เดตเดธเดฐเดตเตเด เดเดเตเดเตพเดเตเดเต เดจเดทเตเดเดฎเดพเดฏเดฟ. เดชเดคเดฟเดตเตเดชเตเดฒเต, เดกเตเดเตเดฏเตเดฎเตเดจเตเดฑเตเดทเตป เดชเด เดฟเดเตเดเตเดจเตเดจเดคเต เดธเดนเดพเดฏเดฟเดเตเดเต. เดซเดเดเตเดทเตป get_config()
เดเดกเดฟเดฑเตเดฑเดฟเดเดเดฟเดจเต เด
เดจเตเดฏเตเดเตเดฏเดฎเดพเดฏ เดฐเตเดชเดคเตเดคเดฟเตฝ เดฎเตเดกเดฒเดฟเดจเตเดฑเต เดเดฐเต เดตเดฟเดตเดฐเดฃเด เดฒเดญเดฟเดเตเดเดพเตป เดจเดฟเดเตเดเดณเต เด
เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต (base_model_conf$layers
- เดเดฐเต เดธเดพเดงเดพเดฐเดฃ R เดฒเดฟเดธเตเดฑเตเดฑเต), เดเดชเตเดชเด เดซเดเดเตโเดทเดจเตเด 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)
เดเดชเตเดชเตเตพ เดตเดฟเดคเดฐเดฃเด เดเตเดฏเตเดค เดเดคเตเดเตเดเดฟเดฒเตเด เดเดฐเต เดธเดพเตผเดตเดคเตเดฐเดฟเด เดซเดเดเตเดทเตป เดเดดเตเดคเตเดจเตเดจเดคเต เดฌเตเดฆเตเดงเดฟเดฎเตเดเตเดเตเดณเตเดณ เดเดพเดฐเตเดฏเดฎเดฒเตเดฒ keras เดเดฎเตเดเตเดจเตเดฑเตเดฑเดฟเตฝ เดชเดฐเดฟเดถเตเดฒเดฟเดชเตเดชเดฟเดเตเด เดญเดพเดฐเดฎเตเดณเตเดณเดคเต เดเดฒเตเดฒเดพเดคเตเดคเดคเต เดเดฏ เดฎเตเดกเดฒเตเดเตพ:
เดฑเตเดกเดฟเดฎเตเดฏเตเดกเต เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเตเดเตพ เดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเด
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()
. เดเดเตเดเตพ เด เดชเตเดฐเดตเตผเดคเตเดคเดจเด เดเดฐเดฟเดเตเดเดฒเตเด เดเตเตผเดคเตเดคเดฟเดเตเดเดฟเดฒเตเดฒ, เดเดพเดฐเดฃเด เด เดเดเตเดเดคเตเดคเดฟเตฝ เดตเตผเดฃเตเดฃ เดเดฟเดคเตเดฐเดเตเดเดณเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเต เดเตเดเตเดคเตฝ เดเตฝเดชเตเดชเดพเดฆเดจเดเตเดทเดฎเดคเดฏเตเดณเตเดณเดคเดพเดฃเตเดจเตเดจเต เดเดคเดฟเดจเดเด เดตเตเดฏเดเตเดคเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต.
เดฎเตเดฌเตเตฝเดจเตเดฑเตเดฑเต เดชเดคเดฟเดชเตเดชเตเดเตพ 1, 2 เดเดจเตเดจเดฟเดตเดฏเตเด resnet34 เดเดชเดฏเตเดเดฟเดเตเดเตเด เดเดเตเดเตพ เดฎเดฟเดเตเด เดชเดฐเตเดเตเดทเดฃเดเตเดเดณเตเด เดจเดเดคเตเดคเดฟ. SE-ResNeXt เดชเตเดฒเตเดณเตเดณ เดเตเดเตเดคเตฝ เดเดงเตเดจเดฟเด เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเตเดเตพ เด เดฎเดคเตเดธเดฐเดคเตเดคเดฟเตฝ เดฎเดฟเดเดเตเด เดชเตเดฐเดเดเดจเด เดเดพเดดเตเดเดตเดเตเดเต. เดจเดฟเตผเดญเดพเดเตเดฏเดตเดถเดพเตฝ, เดเดเตเดเดณเตเดเต เดชเดเตเดเตฝ เดฑเตเดกเดฟเดฎเตเดฏเตเดกเต เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดฒเตเดเตพ เดเดฒเตเดฒเดพเดฏเดฟเดฐเตเดจเตเดจเต, เดเดเตเดเตพ เดธเตเดตเดจเตเดคเดฎเดพเดฏเดฟ เดเดดเตเดคเดฟเดฏเดฟเดฒเตเดฒ (เดชเดเตเดทเต เดเดเตเดเตพ เดคเตเตผเดเตเดเดฏเดพเดฏเตเด เดเดดเตเดคเตเด).
5. เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเตเดเดณเตเดเต เดชเดพเดฐเดพเดฎเตเดฑเตเดฑเดฑเตเดธเตเดทเตป
เดธเตเดเดฐเตเดฏเดพเตผเดคเตเดฅเด, เดชเดฐเดฟเดถเตเดฒเดจเด เดเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฒเตเดฒเดพ เดเตเดกเตเดเดณเตเด เดเดฐเตเดฑเตเดฑ เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเดพเดฏเดฟ เดฐเตเดชเดเตฝเดชเตเดชเดจ เดเตเดฏเตโเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต, เดชเดพเดฐเดพเดฎเตเดฑเตเดฑเตผ เดเดชเดฏเตเดเดฟเดเตเดเต
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)
เดชเดพเดเตเดเตเดเต เดกเตเดเตเดชเตเดฑเตเดฑเต เดจเดเดชเตเดชเดพเดเตเดเดฒเดฟเดจเต เดชเตเดฐเดคเดฟเดจเดฟเดงเตเดเดฐเดฟเดเตเดเตเดจเตเดจเต 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
เดเดเตเดธเดฟเดเตเดฏเตเดเตเดเดฌเดฟเตพ เดเดฃเต (เด เดเดฎเดพเตปเดกเต เดฎเตเดกเดฒเดฟเดจเต เดชเดฐเดฟเดถเตเดฒเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดคเตเดเดเตเดเตเด resnet50
128x128 เดชเดฟเดเตเดธเดฒเตเดเตพ เด
เดณเดเตเดเตเดจเตเดจ เดฎเตเดจเตเดจเต เดตเตผเดฃเตเดฃ เดเดฟเดคเตเดฐเดเตเดเดณเดฟเตฝ, เดกเดพเดฑเตเดฑเดพเดฌเตเดธเต เดซเตเตพเดกเดฑเดฟเตฝ เดธเตเดฅเดฟเดคเดฟเดเตเดฏเตเดฏเดฃเด /home/andrey/doodle_db
). เดจเดฟเดเตเดเตพเดเตเดเต เดชเด เดจ เดตเตเดเดค, เดเดชเตเดฑเตเดฑเดฟเดฎเตเดธเตผ เดคเดฐเด, เดฎเดฑเตเดฑเต เดเดทเตเดเดพเดจเตเดธเตเดคเดฎเดพเดเตเดเดพเดตเตเดจเตเดจ เดชเดพเดฐเดพเดฎเตเดฑเตเดฑเดฑเตเดเตพ เดเดจเตเดจเดฟเดต เดชเดเตเดเดฟเดเดฏเดฟเดฒเตเดเตเดเต เดเตเตผเดเตเดเดพเตป เดเดดเดฟเดฏเตเด. เดชเตเดฐเดธเดฟเดฆเตเดงเตเดเดฐเดฃเด เดคเดฏเตเดฏเดพเดฑเดพเดเตเดเตเดจเตเดจ เดชเตเดฐเดเตเดฐเดฟเดฏเดฏเดฟเตฝ, เด
เดคเต เดตเดพเดธเตเดคเตเดตเดฟเดฆเตเดฏเดฏเดพเดฃเตเดจเตเดจเต เดคเตเดณเดฟเดเตเดเต mobilenet_v2
เดจเดฟเดฒเดตเดฟเดฒเต เดชเดคเดฟเดชเตเดชเดฟเตฝ เดจเดฟเดจเตเดจเต keras R เดเดชเดฏเตเดเดคเตเดคเดฟเตฝ
RStudio-เดฏเดฟเดฒเต เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเตเดเดณเตเดเต เดชเดฐเดฎเตเดชเดฐเดพเดเดค เดฒเตเดเตเดเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเดชเตเดชเตเดเตเดคเตเดคเตเดฎเตเดชเตเตพ เดตเตเดฏเดคเตเดฏเดธเตเดค เดฎเตเดกเดฒเตเดเดณเตเดฎเดพเดฏเตเดณเตเดณ เดชเดฐเตเดเตเดทเดฃเดเตเดเตพ เดเดฃเตเดฏเดฎเดพเดฏเดฟ เดตเตเดเดคเตเดคเดฟเดฒเดพเดเตเดเดพเตป เด เดธเดฎเตเดชเดจเด เดธเดพเดงเตเดฏเดฎเดพเดเตเดเดฟ (เดธเดพเดงเตเดฏเดฎเดพเดฏ เดเดฐเต เดฌเดฆเดฒเดพเดฏเดฟ เดเดเตเดเตพ เดชเดพเดเตเดเตเดเต เดถเตเดฐเดฆเตเดงเดฟเดเตเดเตเดจเตเดจเต.
6. เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเตเดเดณเตเดเต เดกเตเดเตเดเดฑเตเดธเตเดทเตป
เดเตเด เด
เดเดเดเตเดเตพ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดชเดฐเดฟเดถเตเดฒเดจ เดฎเตเดกเดฒเตเดเตพเดเตเดเตเด เดเตเดฒเตเดกเดฟเตฝ เดฆเตเดฐเตเดคเดเดคเดฟเดฏเดฟเดฒเตเดณเตเดณ เดตเดฟเดจเตเดฏเดพเดธเดคเตเดคเดฟเดจเตเด เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟเดฏเตเดเต เดชเตเตผเดเตเดเดฌเดฟเดฒเดฟเดฑเตเดฑเดฟ เดเดฑเดชเตเดชเดพเดเตเดเดพเตป เดเดเตเดเตพ เดกเตเดเตเดเตผ เดเดชเดฏเตเดเดฟเดเตเดเต. เดเตผ เดชเตเดฐเตเดเตเดฐเดพเดฎเตผเดเตเดเต เดคเดพเดฐเดคเดฎเตเดฏเตเดจ เด
เดธเดพเดงเดพเดฐเดฃเดฎเดพเดฏ เด เดเตเดณเตเดฎเดพเดฏเดฟ เดจเดฟเดเตเดเตพเดเตเดเต เดชเดฐเดฟเดเดฏเดชเตเดชเตเดเดพเตป เดคเตเดเดเตเดเดพเด
เดเดฆเตเดฏเด เดฎเตเดคเตฝ เดจเดฟเดเตเดเดณเตเดเต เดธเตเดตเดจเตเดคเด เดเดฟเดคเตเดฐเดเตเดเตพ เดธเตเดทเตโเดเดฟเดเตเดเดพเดจเตเด เดจเดฟเดเตเดเดณเตเดเตเดคเต เดธเตเดทเตโเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด
เดเดฟเดธเตเดฅเดพเดจเดฎเดพเดฏเดฟ เดฎเดฑเตเดฑเต เดเดฟเดคเตเดฐเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเดพเดจเตเด เดกเตเดเตเดเตผ เดจเดฟเดเตเดเดณเต เด
เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต. เดฒเดญเตเดฏเดฎเดพเดฏ เดเดชเตโเดทเดจเตเดเตพ เดตเดฟเดถเดเดฒเดจเด เดเตเดฏเตเดฏเตเดฎเตเดชเตเตพ, NVIDIA, CUDA+cuDNN เดกเตเดฐเตเดตเดฑเตเดเตพ, เดชเตเดคเตเดคเตบ เดฒเตเดฌเตเดฐเดฑเดฟเดเตพ เดเดจเตเดจเดฟเดต เดเตปเดธเตเดฑเตเดฑเดพเตพ เดเตเดฏเตเดฏเตเดจเตเดจเดคเต เดเดฟเดคเตเดฐเดคเตเดคเดฟเดจเตเดฑเต เดตเดฒเดฟเดฏเตเดฐเต เดญเดพเดเดฎเดพเดฃเตเดจเตเดจ เดจเดฟเดเดฎเดจเดคเตเดคเดฟเดฒเตเดคเตเดคเดฟ, เดเดฆเตเดฏเตเดเดฟเด เดเดฟเดคเตเดฐเด เดเดฐเต เด
เดเดฟเดธเตเดฅเดพเดจเดฎเดพเดฏเดฟ เดเดเตเดเตเดเดพเตป เดเดเตเดเตพ เดคเตเดฐเตเดฎเดพเดจเดฟเดเตเดเต. tensorflow/tensorflow:1.12.0-gpu
, เดเดตเดถเตเดฏเดฎเดพเดฏ R เดชเดพเดเตเดเตเดเตเดเตพ เด
เดตเดฟเดเต เดเตเตผเดเตเดเตเดจเตเดจเต.
เด เดตเดธเดพเดจ เดกเตเดเตเดเตผ เดซเดฏเตฝ เดเดคเตเดชเตเดฒเต เดเดพเดฃเดชเตเดชเตเดเตเดเต:
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
เดธเตเดเดฐเตเดฏเดพเตผเดคเตเดฅเด, เดเดชเดฏเตเดเดฟเดเตเด เดชเดพเดเตเดเตเดเตเดเตพ เดตเตเดฐเดฟเดฏเดฌเดฟเดณเตเดเดณเดฟเตฝ เดเตพเดชเตเดชเตเดเตเดคเตเดคเดฟเดฏเดฟเดเตเดเตเดฃเตเดเต; เดเดดเตเดคเดชเตเดชเตเดเตเด เดธเตโเดเตเดฐเดฟเดชเตเดฑเตเดฑเตเดเดณเตเดเต เดญเตเดฐเดฟเดญเดพเดเดตเตเด เด
เดธเดเดฌเตเดฒเดฟ เดธเดฎเดฏเดคเตเดคเต เดเดฃเตเดเตเดฏเตโเดจเดฑเดฟเดจเตเดณเตเดณเดฟเตฝ เดชเดเตผเดคเตเดคเตเดจเตเดจเต. เดเดเตเดเตพ เดเดฎเดพเตปเดกเต เดทเตเดฒเตเดฒเตเด เดฎเดพเดฑเตเดฑเดฟ /bin/bash
เดเดณเตเดณเดเดเตเดเดคเตเดคเดฟเดจเตเดฑเต เดเดณเตเดชเตเดชเดคเตเดคเดฟเดจเดพเดฏเดฟ /etc/os-release
. เดเดคเต เดเตเดกเดฟเดฒเต OS เดชเดคเดฟเดชเตเดชเต เดตเตเดฏเดเตเดคเดฎเดพเดเตเดเตเดฃเตเดเดคเดฟเดจเตเดฑเต เดเดตเดถเตเดฏเดเดค เดเดดเดฟเดตเดพเดเตเดเดฟ.
เดเตเดเดพเดคเต, เดตเดฟเดตเดฟเดง เดเดฎเดพเตปเดกเตเดเดณเตเดณเตเดณ เดเดฐเต เดเดฃเตเดเตเดฏเตเดจเตผ เดธเดฎเดพเดฐเดเดญเดฟเดเตเดเดพเตป เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจ เดเดฐเต เดเตเดฑเดฟเดฏ เดฌเดพเดทเต เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเต เดเดดเตเดคเดฟเดฏเดฟเดเตเดเตเดฃเตเดเต. เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดเดต เดฎเตเดฎเตเดชเต เดเดฃเตเดเตเดฏเตโเดจเดฑเดฟเดจเตเดณเตเดณเดฟเตฝ เดธเตเดฅเดพเดชเดฟเดเตเดเดฟเดฐเตเดจเตเดจ เดจเตเดฏเตเดฑเตฝ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเตเดเดณเต เดชเดฐเดฟเดถเตเดฒเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดธเตโเดเตเดฐเดฟเดชเตโเดฑเตเดฑเตเดเดณเดพเดเดพเด เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดฃเตเดเตเดฏเตโเดจเดฑเดฟเดจเตเดฑเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด เดกเตเดฌเดเตเดเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด เดจเดฟเดฐเตเดเตเดทเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดเดฐเต เดเดฎเดพเตปเดกเต เดทเตเดฒเตเดฒเดพเดฏเดฟเดฐเดฟเดเตเดเดพเด:
เดเดฃเตเดเตเดฏเตเดจเตผ เดฒเตเดเตเดเต เดเตเดฏเตเดฏเดพเดจเตเดณเตเดณ เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเต
#!/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}
เด เดฌเดพเดทเต เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเต เดชเดพเดฐเดพเดฎเตเดฑเตเดฑเดฑเตเดเตพ เดเดฒเตเดฒเดพเดคเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเต เดเดฃเตเดเตเดฏเตเดจเดฑเดฟเดจเตเดณเตเดณเดฟเตฝ เดตเดฟเดณเดฟเดเตเดเดชเตเดชเตเดเตเด train_nn.R
เดธเตเดฅเดฟเดฐ เดฎเตเดฒเตเดฏเดเตเดเตพเดเตเดเตเดชเตเดชเด; เดเดฆเตเดฏเดคเตเดคเต เดชเตเดธเดฟเดทเดฃเตฝ เดเตผเดเตเดฏเตเดฎเตเดจเตเดฑเต "เดฌเดพเดทเต" เดเดฃเตเดเตเดเดฟเตฝ, เดเดฃเตเดเตเดฏเตเดจเตผ เดเดฐเต เดเดฎเดพเตปเดกเต เดทเตเดฒเตเดฒเตเดฎเดพเดฏเดฟ เดธเดเดตเตเดฆเดจเดพเดคเตเดฎเดเดฎเดพเดฏเดฟ เดเดฐเดเดญเดฟเดเตเดเตเด. เดฎเดฑเตเดฑเตเดฒเตเดฒเดพ เดธเดพเดนเดเดฐเตเดฏเดเตเดเดณเดฟเดฒเตเด, เดชเตเดธเดฟเดทเดฃเตฝ เดเตผเดเตเดฏเตเดฎเตเดจเตเดฑเตเดเดณเตเดเต เดฎเตเดฒเตเดฏเดเตเดเตพ เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเดเตเดเตเดจเตเดจเต: CMD="Rscript /app/train_nn.R $@"
.
เดเดฑเดตเดฟเด เดกเดพเดฑเตเดฑเดฏเตเด เดกเดพเดฑเตเดฑเดพเดฌเตเดธเตเด เดเดณเตเดณ เดกเดฏเดฑเดเตเดเดฑเดฟเดเดณเตเด เดชเดฐเดฟเดถเตเดฒเดจเด เดฒเดญเดฟเดเตเด เดฎเตเดกเดฒเตเดเตพ เดธเดเดฐเดเตเดทเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดกเดฏเดฑเดเตเดเดฑเดฟเดฏเตเด เดนเตเดธเตเดฑเตเดฑเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดฃเตเดเตเดฏเตเดจเดฑเดฟเดจเตเดณเตเดณเดฟเตฝ เดเดเดฟเดชเตเดชเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต เดเดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเดเตเดเตเดฃเตเดเดคเดพเดฃเต, เดเดคเต เด เดจเดพเดตเดถเตเดฏ เดเตเดคเตเดฐเดฟเดฎเดคเตเดตเดเตเดเดณเดฟเดฒเตเดฒเดพเดคเต เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเตเดเดณเตเดเต เดซเดฒเดเตเดเตพ เดเดเตเดธเดธเต เดเตเดฏเตเดฏเดพเตป เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต.
7. Google เดเตเดฒเตเดกเดฟเตฝ เดเดจเตเดจเดฟเดฒเดงเดฟเดเด GPU-เดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต
เดฎเดคเตเดธเดฐเดคเตเดคเดฟเดจเตเดฑเต เดธเดตเดฟเดถเตเดทเดคเดเดณเดฟเดฒเตเดจเตเดจเต เดตเดณเดฐเต เดถเดฌเตเดฆเดฎเดฏเดฎเดพเดฏ เดกเดพเดฑเตเดฑเดฏเดพเดฏเดฟเดฐเตเดจเตเดจเต (เดถเตเตผเดทเด เดเดฟเดคเตเดฐเด เดเดพเดฃเตเด, ODS เดธเตเดฒเดพเดเตเดเดฟเตฝ เดจเดฟเดจเตเดจเต @Leigh.plt-เตฝ เดจเดฟเดจเตเดจเต เดเดเดฎเตเดเตเดคเตเดคเดคเต). เดตเดฒเดฟเดฏ เดฌเดพเดเตเดเตเดเตพ เดเดคเดฟเดจเต เดเตเดฑเตเดเตเดเดพเตป เดธเดนเดพเดฏเดฟเดเตเดเตเดจเตเดจเต, 1 เดเดฟเดชเดฟเดฏเต เดเดณเตเดณ เดเดฐเต เดชเดฟเดธเดฟเดฏเดฟเดฒเต เดชเดฐเตเดเตเดทเดฃเดเตเดเตพเดเตเดเต เดถเตเดทเด, เดเตเดฒเตเดกเดฟเดฒเต เดจเดฟเดฐเดตเดงเดฟ เดเดฟเดชเดฟเดฏเตเดเดณเดฟเตฝ เดชเดฐเดฟเดถเตเดฒเดจ เดฎเตเดกเดฒเตเดเตพ เดฎเดพเดธเตเดฑเตเดฑเตผ เดเตเดฏเตเดฏเดพเตป เดเดเตเดเตพ เดคเตเดฐเตเดฎเดพเดจเดฟเดเตเดเต. เดเดชเดฏเตเดเดฟเดเตเด GoogleCloud (dev/shm
.
เดเดจเตเดจเดฟเดฒเดงเดฟเดเด GPU-เดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดเดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฏ เดเตเดกเต เดถเดเดฒเดฎเดพเดฃเต เดเดฑเตเดฑเดตเตเด เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณเดคเต. เดเดฆเตเดฏเด, เดชเตเดคเตเดคเดฃเดฟเดฒเต เดชเตเดฒเต เดเดฐเต เดเตเตบเดเตเดเตเดธเตเดฑเตเดฑเต เดฎเดพเดจเตเดเตผ เดเดชเดฏเตเดเดฟเดเตเดเดพเดฃเต เดฎเตเดกเตฝ เดธเดฟเดชเดฟเดฏเตเดตเดฟเตฝ เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเต:
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
)
})
เดเดเดชเตเตฝ เดเตเดฏเตเดฏเดพเดคเตเดค (เดเดคเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต) เดฎเตเดกเตฝ เดฒเดญเตเดฏเดฎเดพเดฏ เดฒเดญเตเดฏเดฎเดพเดฏ เดเดฟเดชเดฟเดฏเตเดตเตเดเดณเดฟเดฒเตเดเตเดเต เดชเดเตผเดคเตเดคเดฟ, เด เดคเดฟเดจเตเดถเตเดทเด เดฎเดพเดคเตเดฐเดฎเต เด เดคเต เดเดเดชเตเตฝ เดเตเดฏเตเดฏเตเดเดฏเตเดณเตเดณเต:
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)
)
เด เดตเดธเดพเดจเดคเตเดคเตเดคเต เดเดดเดฟเดเตเดฏเตเดณเตเดณ เดเดฒเตเดฒเดพ เดฒเตเดฏเดฑเตเดเดณเตเด เดซเตเดฐเตเดธเตเดเตเดฏเตเดฏเตเด, เด เดตเดธเดพเดจเดคเตเดคเต เดฒเตเดฏเตผ เดชเดฐเดฟเดถเตเดฒเดฟเดชเตเดชเดฟเดเตเดเตเด, เดจเดฟเดฐเดตเดงเดฟ เดเดฟเดชเดฟเดฏเตเดตเตเดเตพเดเตเดเดพเดฏเดฟ เดฎเตเดดเตเดตเตป เดฎเตเดกเดฒเตเด เด เตบเดซเตเดฐเตเดธเต เดเตเดฏเตเดฏเตเดเดฏเตเด เดตเตเดฃเตเดเตเด เดชเดฐเดฟเดถเตเดฒเดฟเดชเตเดชเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจ เดเตเดฒเดพเดธเดฟเดเต เดธเดพเดเตเดเตเดคเดฟเดเดค เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดพเตป เดเดดเดฟเดเตเดเดฟเดฒเตเดฒ.
เดชเดฐเดฟเดถเตเดฒเดจเด เดเดชเดฏเตเดเดฟเดเตเดเดพเดคเต เดจเดฟเดฐเตเดเตเดทเดฟเดเตเดเต. เดเตเตปเดธเตผเดฌเตเตผเดกเต, เดเดฐเต เดฏเตเดเดคเตเดคเดฟเดจเตเดถเตเดทเดตเตเด เดฒเตเดเตเดเตพ เดฑเตเดเตเดเตเตผเดกเตเดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด เดตเดฟเดตเดฐเดฆเดพเดฏเดเดฎเดพเดฏ เดชเตเดฐเตเดเดณเตเดณเตเดณ เดฎเตเดกเดฒเตเดเตพ เดธเดเดฐเดเตเดทเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเด เดธเตเดตเดฏเด เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเตเดเตเดคเตเดคเตเดจเตเดจเต:
เดเตเตพเดฌเดพเดเตเดเตเดเตพ
# ะจะฐะฑะปะพะฝ ะธะผะตะฝะธ ัะฐะนะปะฐ ะปะพะณะฐ
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. เดเดฐเต เดจเดฟเดเดฎเดจเดคเตเดคเดฟเดจเต เดชเดเดฐเด
เดเดเตเดเตพ เดจเตเดฐเดฟเดเตเด เดจเดฟเดฐเดตเดงเดฟ เดชเตเดฐเดถเตเดจเดเตเดเตพ เดเดคเตเดตเดฐเต เดคเดฐเดฃเด เดเตเดฏเตเดคเดฟเดเตเดเดฟเดฒเตเดฒ:
- ะฒ keras เดเดชเตเดฑเตเดฑเดฟเดฎเตฝ เดชเด เดจ เดจเดฟเดฐเดเตเดเต (เด
เดจเดฒเตเดเต) เดธเตเดตเดฏเดฎเตเดต เดคเดฟเดฐเดฏเตเดจเตเดจเดคเดฟเดจเต เดฑเตเดกเดฟเดฎเตเดฏเตเดกเต เดซเดเดเตโเดทเตป เดเดจเตเดจเตเดฎเดฟเดฒเตเดฒ
lr_finder
เดฒเตเดฌเตเดฐเดฑเดฟเดฏเดฟเตฝ เดซเดพเดธเตเดฑเตเดฑเต.เด); เดเตเดฑเดเตเดเต เดชเดฐเดฟเดถเตเดฐเดฎเดคเตเดคเดฟเดฒเตเดเต, เดฎเตเดจเตเดจเดพเด เดเดเตเดทเดฟ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดฒเตเดเตพ R-เดฒเตเดเตเดเต เดชเตเตผเดเตเดเต เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเตเด, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต,เดเดคเต ; - เดฎเตเดฎเตเดชเดคเตเดคเต เดชเตเดฏเดฟเดจเตเดฑเดฟเดจเตเดฑเต เด เดจเดจเตเดคเดฐเดซเดฒเดฎเดพเดฏเดฟ, เดจเดฟเดฐเดตเดงเดฟ เดเดฟเดชเดฟเดฏเต เดเดชเดฏเตเดเดฟเดเตเดเตเดฎเตเดชเตเตพ เดถเดฐเดฟเดฏเดพเดฏ เดชเดฐเดฟเดถเตเดฒเดจ เดตเตเดเดค เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเดพเตป เดเดดเดฟเดเตเดเดฟเดฒเตเดฒ;
- เดเดงเตเดจเดฟเด เดจเตเดฏเตเดฑเตฝ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเตเดเดณเตเดเต เด เดญเดพเดตเดฎเตเดฃเตเดเต, เดชเตเดฐเดคเตเดฏเตเดเดฟเดเตเดเต เดเดฎเตเดเตเดจเตเดฑเตเดฑเดฟเตฝ เดฎเตเตปเดเตเดเตเดเดฟ เดชเดฐเดฟเดถเตเดฒเดจเด เดฒเดญเดฟเดเตเดเดต;
- เดเดฐเต เดธเตเดเตเดเดฟเตพ เดจเดฏเดตเตเด เดตเดฟเดตเตเดเดจเดชเดฐเดฎเดพเดฏ เดชเด เดจ เดจเดฟเดฐเดเตเดเตเดเดณเตเด เดเดฒเตเดฒ (เดเตเดธเตเตป เด
เดจเตเดฒเดฟเดเดเต เดเดเตเดเดณเตเดเต เด
เดญเตเดฏเตผเดคเตเดฅเดจเดชเตเดฐเดเดพเดฐเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต
เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดฟ , เดจเดจเตเดฆเดฟเดธเตเดเตเดฏเตเดกเดพเตป ).
เด เดฎเดคเตเดธเดฐเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดจเตเดคเต เดชเตเดฐเดฏเตเดเดจเดเดฐเดฎเดพเดฏ เดเดพเดฐเตเดฏเดเตเดเตพ เดชเด เดฟเดเตเดเต:
- เดคเดพเดฐเดคเดฎเตเดฏเตเดจ เดเตเดฑเดเตเด เดชเดตเตผ เดนเดพเตผเดกเตโเดตเตเดฏเดฑเดฟเตฝ, เดจเดฟเดเตเดเตพเดเตเดเต เดตเตเดฆเดจเดฏเดฟเดฒเตเดฒเดพเดคเต เดฎเดพเดจเตเดฏเดฎเดพเดฏ (เดฑเดพเดฎเดฟเดจเตเดฑเต เดชเดฒ เดฎเดเดเตเดเต เดตเดฒเตเดชเตเดชเดฎเตเดณเตเดณ) เดกเดพเดฑเตเดฑเดฏเตเดเต เด เดณเดตเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเตเด. เดชเตเดฒเดพเดธเตเดฑเตเดฑเดฟเดเต เดธเดเตเดเดฟ เดกเดพเดฑเตเดฑ. เดชเดเตเดเดฟเด เดเตเดฌเดฟเดณเตเดเดณเตเดเต เดเตป-เดชเตเดฒเตเดธเต เดชเดฐเดฟเดทเตโเดเตเดเดฐเดฃเด เดเดพเดฐเดฃเด เดฎเตเดฎเตเดฎเดฑเดฟ เดธเดเดฐเดเตเดทเดฟเดเตเดเตเดจเตเดจเต, เด เดคเต เด เดต เดชเดเตผเดคเตเดคเตเดจเตเดจเดคเต เดเดดเดฟเดตเดพเดเตเดเตเดจเตเดจเต, เดถเดฐเดฟเดฏเดพเดฏเดฟ เดเดชเดฏเตเดเดฟเดเตเดเตเดฎเตเดชเตเตพ, เด เดคเดฟเดจเตเดฑเต เดเดดเดฟเดตเตเดเตพ เดเดฒเตเดฒเดพเดฏเตเดชเตเดชเตเดดเตเด เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเดฟเดเดเต เดญเดพเดทเดเตพเดเตเดเดพเดฏเดฟ เดจเดฎเตเดเตเดเต เด เดฑเดฟเดฏเดพเดตเตเดจเตเดจ เดเดฒเตเดฒเดพ เดเดชเดเดฐเดฃเดเตเดเดณเดฟเดฒเตเด เดเดฑเตเดฑเดตเตเด เดเดฏเตผเดจเตเดจ เดตเตเดเดค เดชเตเดฐเดเดเดฎเดพเดเตเดเตเดจเตเดจเต. เดเดฐเต เดกเดพเดฑเตเดฑเดพเดฌเตเดธเดฟเตฝ เดกเดพเดฑเตเดฑ เดธเดเดฐเดเตเดทเดฟเดเตเดเตเดจเตเดจเดคเต, เดฎเดฟเดเตเด เดเตเดธเตเดเดณเดฟเดฒเตเด, เดฎเตเดดเตเดตเตป เดกเดพเดฑเตเดฑเดพเดธเตเดฑเตเดฑเตเด เดฑเดพเดฎเดฟเดฒเตเดเตเดเต เดเตเดทเดฃเด เดเตเดฏเตเดฏเตเดฃเตเดเดคเดฟเดจเตเดฑเต เดเดตเดถเตเดฏเดเดคเดฏเตเดเตเดเตเดฑเดฟเดเตเดเต เดเดฟเดจเตเดคเดฟเดเตเดเดพเดคเดฟเดฐเดฟเดเตเดเดพเตป เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต.
- เดชเดพเดเตเดเตเดเต เดเดชเดฏเตเดเดฟเดเตเดเต R เดฒเต เดธเตเดฒเต เดซเดเดเตโเดทเดจเตเดเตพ C++ เดฒเต เดซเดพเดธเตเดฑเตเดฑเต เดเดฏเดต เดเดชเดฏเตเดเดฟเดเตเดเต เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเดเตเดเดพเดจเดพเดเตเด Rcpp. เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดชเตเดฑเดฎเต เดเดฃเตเดเตเดเดฟเตฝ RcppThread เด เดฅเดตเดพ RcppParallel, เดจเดฎเตเดเตเดเต เดเตเดฐเตเดธเต-เดชเตเดฒเดพเดฑเตเดฑเตเดซเตเด เดฎเตพเดเตเดเดฟ-เดคเตเดฐเตเดกเต เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดฒเตเดเตพ เดฒเดญเดฟเดเตเดเตเดจเตเดจเต, เด เดคเดฟเดจเดพเตฝ R เดฒเตเดตเดฒเดฟเตฝ เดเตเดกเต เดธเดฎเดพเดจเตเดคเดฐเดฎเดพเดเตเดเตเดฃเตเด เดเดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ.
- เดชเดพเดเตเดเตเดเต Rcpp C++ เดฏเต เดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดเตเดฐเดตเดฎเดพเดฏ เด
เดฑเดฟเดตเดฟเดฒเตเดฒเดพเดคเต เดเดชเดฏเตเดเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเตเด, เดเดตเดถเตเดฏเดฎเดพเดฏ เดฎเดฟเดจเดฟเดฎเด เดตเดฟเดตเดฐเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต
เดเดตเดฟเดเต . เดชเตเดฒเตเดณเตเดณ เดฐเดธเดเดฐเดฎเดพเดฏ เดจเดฟเดฐเดตเดงเดฟ เดธเดฟ-เดฒเตเดฌเตเดฐเดฑเดฟเดเตพเดเตเดเตเดณเตเดณ เดนเตเดกเตเดกเตผ เดซเดฏเดฒเตเดเตพ เดเดเตเดธเตเดฑเตเดฑเตปเดธเตผ CRAN-เตฝ เดฒเดญเตเดฏเดฎเดพเดฃเต, เด เดคเดพเดฏเดคเต, เดฑเตเดกเดฟเดฎเตเดฏเตเดกเต เดเดฏเตผเดจเตเดจ เดชเตเดฐเดเดเดจเดฎเตเดณเตเดณ C++ เดเตเดกเต R-เดฒเตเดเตเดเต เดธเดฎเดจเตเดตเดฏเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจ เดชเตเดฐเตเดเดเตเดเตเดเตพ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เดเดฐเต เด เดเดฟเดธเตเดฅเดพเดจ เดธเตเดเดฐเตเดฏเด เดฐเตเดชเตเดเดฐเดฟเดเตเดเตเดจเตเดจเต. เด เดงเดฟเด เดธเตเดเดฐเตเดฏเด เดธเดฟเดจเตเดฑเดพเดเตเดธเต เดนเตเดฒเตเดฑเตเดฑเดฟเดเดเตเด RStudio-เดฏเดฟเดฒเต เดเดฐเต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต C++ เดเตเดกเต เด เดจเดฒเตเดธเดฑเตเดฎเดพเดฃเต. - เดกเตเดเตเดชเตเดฑเตเดฑเต เดชเดพเดฐเดพเดฎเตเดฑเตเดฑเดฑเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดธเตเดตเดฏเด เดเตพเดเตเดเตเดณเตเดณเตเดจเตเดจ เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเตเดเตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต. เดตเดฟเดฆเตเดฐ เดธเตเตผเดตเดฑเดฟเตฝ เดเดชเดฏเตเดเดฟเดเตเดเดพเตป เดเดคเต เดธเตเดเดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฃเต, เดเตพเดชเตเดชเตเดเต. เดกเตเดเตเดเดฑเดฟเดจเต เดเตเดดเดฟเตฝ. RStudio-เดฏเดฟเตฝ, เดชเดฐเดฟเดถเตเดฒเดจ เดจเตเดฏเตเดฑเตฝ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดฎเดฃเดฟเดเตเดเตเดฑเตเดเดณเตเดณเด เดชเดฐเตเดเตเดทเดฃเดเตเดเตพ เดจเดเดคเตเดคเตเดจเตเดจเดคเต เด เดธเตเดเดฐเตเดฏเดฎเดพเดฃเต, เดเตเดเดพเดคเต เดธเตเตผเดตเดฑเดฟเตฝ เดคเดจเตเดจเต IDE เดเตปเดธเตเดฑเตเดฑเดพเตพ เดเตเดฏเตเดฏเตเดจเตเดจเดคเต เดเดฒเตเดฒเดพเดฏเตเดชเตเดชเตเดดเตเด เดจเตเดฏเดพเดฏเตเดเดฐเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจเดฟเดฒเตเดฒ.
- OS-เดจเตเดฑเตเดฏเตเด เดฒเตเดฌเตเดฐเดฑเดฟเดเดณเตเดเตเดฏเตเด เดตเตเดฏเดคเตเดฏเดธเตโเดค เดชเดคเดฟเดชเตเดชเตเดเดณเตเดณเตเดณ เดกเตเดตเดฒเดชเตเดชเตผเดฎเดพเตผเดเตเดเดฟเดเดฏเดฟเตฝ เดเตเดกเต เดชเตเตผเดเตเดเดฌเดฟเดฒเดฟเดฑเตเดฑเดฟเดฏเตเด เดซเดฒเดเตเดเดณเตเดเต เดชเตเดจเตผเดจเดฟเตผเดฎเตเดฎเดพเดฃเดตเตเด เดกเตเดเตเดเตผ เดเดฑเดชเตเดชเดพเดเตเดเตเดจเตเดจเต, เดเตเดเดพเดคเต เดธเตเตผเดตเดฑเตเดเดณเดฟเดฒเต เดเดเตโเดธเดฟเดเตเดฏเตเดทเตป เดเดณเตเดชเตเดชเดตเตเด. เดเดฐเต เดเดฎเดพเตปเดกเต เดเดชเดฏเตเดเดฟเดเตเดเต เดจเดฟเดเตเดเตพเดเตเดเต เดฎเตเดดเตเดตเตป เดชเดฐเดฟเดถเตเดฒเดจ เดชเตเดชเตเดชเตเดฒเตเดจเตเด เดธเดฎเดพเดฐเดเดญเดฟเดเตเดเดพเด.
- เดตเดฟเดฒเดเตเดเดฟเดฏ เดนเดพเตผเดกเตโเดตเตเดฏเดฑเดฟเตฝ เดชเดฐเตเดเตเดทเดฃเด เดจเดเดคเตเดคเดพเดจเตเดณเตเดณ เดฌเดเดฑเตเดฑเต เดธเตเดนเตเดฆ เดฎเดพเตผเดเดฎเดพเดฃเต Google เดเตเดฒเตเดกเต, เดเดจเตเดจเดพเตฝ เดจเดฟเดเตเดเตพ เดเตเตบเดซเดฟเดเดฑเตเดทเดจเตเดเตพ เดถเตเดฐเดฆเตเดงเดพเดชเตเตผเดตเตเดตเด เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต.
- เดตเตเดฏเดเตเดคเดฟเดเดค เดเตเดกเต เดถเดเดฒเดเตเดเดณเตเดเต เดตเตเดเดค เด เดณเดเตเดเตเดจเตเดจเดคเต เดตเดณเดฐเต เดเดชเดฏเตเดเดชเตเดฐเดฆเดฎเดพเดฃเต, เดชเตเดฐเดคเตเดฏเตเดเดฟเดเตเดเตเด R, C++ เดเดจเตเดจเดฟเดต เดธเดเดฏเตเดเดฟเดชเตเดชเดฟเดเตเดเตเดฎเตเดชเตเตพ, เดชเดพเดเตเดเตเดเดฟเดจเตเดชเตเดชเด เดฌเตเดเตเดเต - เดตเดณเดฐเต เดเดณเตเดชเตเดชเดฎเดพเดฃเต.
เดฎเตเดคเตเดคเดคเตเดคเดฟเตฝ เด เด เดจเตเดญเดตเด เดตเดณเดฐเต เดชเตเดฐเดคเดฟเดซเดฒเดฆเดพเดฏเดเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต, เดเดจเตเดจเดฏเดฟเดเตเดเดชเตเดชเตเดเตเด เดเดฟเดฒ เดชเตเดฐเดถเตเดจเดเตเดเตพ เดชเดฐเดฟเดนเดฐเดฟเดเตเดเดพเตป เดเดเตเดเตพ เดคเตเดเตผเดจเตเดจเตเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต.
เด เดตเดฒเดเดฌเด: www.habr.com