เจนเฉ เจนเจฌเจฐ!
เจชเจฟเจเจฒเฉ เจเจฟเจฐเจพเจตเจ เจตเจฟเฉฑเจ, เจเจพเจเจฒ เจจเฉ เจนเฉฑเจฅเจพเจ เจจเจพเจฒ เจเจฟเฉฑเจเฉเจเจ เจคเจธเจตเฉเจฐเจพเจ เจจเฉเฉฐ เจตเจฐเจเฉเจเฉเจฐเจฟเจค เจเจฐเจจ เจฒเจ เจเฉฑเจ เจฎเฉเจเจพเจฌเจฒเฉ เจฆเฉ เจฎเฉเจเจผเจฌเจพเจจเฉ เจเฉเจคเฉ, เจคเฉเจเจผ เจกเจฐเจพเจ
เจกเฉเจกเจฒ เจชเจเจพเจฃ, เจเจฟเจธ เจตเจฟเฉฑเจ, เจนเฉเจฐเจพเจ เจตเจฟเฉฑเจ, เจเจฐ-เจตเจฟเจเจฟเจเจจเฉเจเจ เจฆเฉ เจเฉฑเจ เจเฉเจฎ เจจเฉ เจนเจฟเฉฑเจธเจพ เจฒเจฟเจ:
เจเจธ เจตเจพเจฐ เจฎเฉเจกเจฒ เจซเจพเจฐเจฎเจฟเฉฐเจ เจจเจพเจฒ เจเฉฐเจฎ เจจเจนเฉเจ เจนเฉเจเจ, เจชเจฐ เจฌเจนเฉเจค เจธเจพเจฐเจพ เจเฉเจฎเจคเฉ เจคเจเจฐเจฌเจพ เจนเจพเจธเจฒ เจนเฉเจเจ, เจเจธ เจฒเจ เจฎเฉเจ เจเจฎเจฟเจเจจเจฟเจเฉ เจจเฉเฉฐ เจเจพเจเจฒเฉ เจ
เจคเฉ เจฐเฉเจเจผเจพเจจเจพ เจฆเฉ เจเฉฐเจฎ เจตเจฟเฉฑเจ เจฌเจนเฉเจค เจธเจพเจฐเฉเจเจ เจฆเจฟเจฒเจเจธเจช เจ
เจคเฉ เจเจชเจฏเฉเจเฉ เจเฉเจเจผเจพเจ เจฌเจพเจฐเฉ เจฆเฉฑเจธเจฃเจพ เจเจพเจนเจพเจเจเจพเฅค เจเจฐเจเจพ เจเฉเจคเฉ เจเจ เจตเจฟเจธเจผเจฟเจเจ เจตเจฟเฉฑเจเฉเจ: เจฌเจฟเจจเจพเจ เจฎเฉเจธเจผเจเจฒ เจเฉเจตเจจ เจเจชเจจเจธเฉเจตเฉ, JSON เจชเจพเจฐเจธเจฟเฉฐเจ (เจเจน เจเจฆเจพเจนเจฐเจจเจพเจ R เจตเจฟเฉฑเจ เจธเจเฉเจฐเจฟเจชเจเจพเจ เจเจพเจ เจชเฉเจเฉเจเจพเจ เจตเจฟเฉฑเจ C++ เจเฉเจก เจฆเฉ เจเจเฉเจเจฐเจจ เจฆเฉ เจเจพเจเจ เจเจฐเจฆเฉเจเจ เจนเจจเฅค เจเจฐ.เจธเฉ.เจชเฉ.เจชเฉ), เจธเจเฉเจฐเจฟเจชเจเจพเจ เจฆเจพ เจชเฉเจฐเจพเจฎเฉเจเจฐเจพเจเจเจผเฉเจธเจผเจจ เจ
เจคเฉ เจ
เฉฐเจคเจฎ เจนเฉฑเจฒ เจฆเจพ เจกเฉเจเจฐเจพเจเจเจผเฉเจธเจผเจจเฅค เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ เจฒเจ เจขเฉเจเจตเฉเจ เจฐเฉเจช เจตเจฟเฉฑเจ เจธเฉฐเจฆเฉเจธเจผ เจฆเฉ เจธเจพเจฐเฉ เจเฉเจก เจตเจฟเฉฑเจ เจเจชเจฒเจฌเจง เจนเจจ
เจธเจฎเฉฑเจเจฐเฉ:
CSV เจคเฉเจ MonetDB เจตเจฟเฉฑเจ เจเฉเจธเจผเจฒเจคเจพ เจจเจพเจฒ เจกเจพเจเจพ เจฒเฉเจก เจเจฐเฉ เจฌเฉเจเจพเจ เจฆเฉ เจคเจฟเจเจฐเฉ เจกเจพเจเจพเจฌเฉเจธ เจคเฉเจ เจฌเฉเจเจพเจ เจจเฉเฉฐ เจ เจจเจฒเฉเจก เจเจฐเจจ เจฒเจ เจเจเจฐเฉเจเจฐ เจเฉฑเจ เจฎเจพเจกเจฒ เจเจฐเจเฉเจเฉเจเจเจฐ เจฆเฉ เจเฉเจฃ เจธเจเฉเจฐเจฟเจชเจ เจชเฉเจฐเจพเจฎเฉเจเจฐเจพเจเจเจผเฉเจธเจผเจจ เจธเจเฉเจฐเจฟเจชเจเจพเจ เจฆเจพ เจกเฉเจเจฐเจพเจเจเจผเฉเจธเจผเจจ เจเฉเจเจฒ เจเจฒเจพเจเจก 'เจคเฉ เจเจ GPUs เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจเจพ เจธเฉฐเจชเฉเจฐเจจ เจนเฉเจฃ เจฆเฉ เจฌเจเจพเจ
1. CSV เจคเฉเจ เจฎเฉเจจเฉเจเจกเฉเจฌเฉ เจกเฉเจเจพเจฌเฉเจธ เจตเจฟเฉฑเจ เจเฉเจธเจผเจฒเจคเจพ เจจเจพเจฒ เจกเจพเจเจพ เจฒเฉเจก เจเจฐเฉ
เจเจธ เจฎเฉเจเจพเจฌเจฒเฉ เจฆเจพ เจกเฉเจเจพ เจคเจฟเจเจฐ-เจเฉเจคเฉ เจเจฟเฉฑเจคเจฐเจพเจ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจจเจนเฉเจ, เจธเจเฉเจ 340 CSV เจซเจพเจเจฒเจพเจ (เจนเจฐเฉเจ เจเจฒเจพเจธ เจฒเจ เจเฉฑเจ เจซเจพเจเจฒ) เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจชเฉเจฐเจฆเจพเจจ เจเฉเจคเจพ เจเจฟเจ เจนเฉ เจเจฟเจธ เจตเจฟเฉฑเจ เจชเฉเจเจเฉฐเจ เจเฉเจเจฐเจกเฉเจจเฉเจเจธ เจตเจพเจฒเฉ JSON เจนเจจเฅค เจเจนเจจเจพเจ เจฌเจฟเฉฐเจฆเฉเจเจ เจจเฉเฉฐ เจฒเจพเจเจจเจพเจ เจจเจพเจฒ เจเฉเฉ เจเฉ, เจ เจธเฉเจ 256x256 เจชเจฟเจเจธเจฒ เจฎเจพเจชเจฃ เจตเจพเจฒเฉ เจเฉฑเจ เจ เฉฐเจคเจฎ เจเจฟเฉฑเจคเจฐ เจชเฉเจฐเจพเจชเจค เจเจฐเจฆเฉ เจนเจพเจเฅค เจจเจพเจฒ เจนเฉ เจนเจฐเฉเจ เจฐเจฟเจเจพเจฐเจก เจฒเจ เจเฉฑเจ เจฒเฉเจฌเจฒ เจนเฉเฉฐเจฆเจพ เจนเฉ เจเฉ เจเจน เจฆเจฐเจธเจพเจเจเจฆเจพ เจนเฉ เจเจฟ เจเฉ เจกเฉเจเจพเจธเฉเจ เจเจเฉฑเจคเจฐ เจเฉเจคเฉ เจเจพเจฃ เจตเฉเจฒเฉ เจตเจฐเจคเฉ เจเจ เจตเจฐเจเฉเจเจฐเจฃ เจฆเฉเจเจฐเจพ เจคเจธเจตเฉเจฐ เจจเฉเฉฐ เจธเจนเฉ เจขเฉฐเจ เจจเจพเจฒ เจชเจเจพเจฃเจฟเจ เจเจฟเจ เจธเฉ, เจคเจธเจตเฉเจฐ เจฆเฉ เจฒเฉเจเจ เจฆเฉ เจจเจฟเจตเจพเจธ เจฆเฉ เจฆเฉเจธเจผ เจฆเจพ เจเฉฑเจ เจฆเฉ-เจ เฉฑเจเจฐเจพเจ เจฆเจพ เจเฉเจก, เจเฉฑเจ เจตเจฟเจฒเฉฑเจเจฃ เจชเจเจพเจฃเจเจฐเจคเจพ, เจเฉฑเจ เจเจพเจเจฎเจธเจเฉเจเจชเฅค เจ เจคเฉ เจเฉฑเจ เจเจฒเจพเจธ เจจเจพเจฎ เจเฉ เจซเจพเจเจฒ เจจเจพเจฎ เจจเจพเจฒ เจฎเฉเจฒ เจเจพเจเจฆเจพ เจนเฉเฅค เจเจฐเจเจพเจเจต เจตเจฟเฉฑเจ เจฎเฉเจฒ เจกเฉเจเจพ เจฆเฉ เจเฉฑเจ เจธเจฐเจฒ เจฐเฉเจช เจตเจฟเฉฑเจ เจตเจเจผเจจ 7.4 GB เจ เจคเฉ เจ เจจเจชเฉเจ เจเจฐเจจ เจคเฉเจ เจฌเจพเจ เจฆ เจฒเจเจญเจ 20 GB เจนเฉเฉฐเจฆเจพ เจนเฉ, เจ เจจเจชเฉเจ เจเจฐเจจ เจคเฉเจ เจฌเจพเจ เจฆ เจชเฉเจฐเจพ เจกเฉเจเจพ 240 GB เจคเฉฑเจ เจฒเฉ เจเจพเจเจฆเจพ เจนเฉเฅค เจเจฏเฉเจเจเจพเจ เจจเฉ เจเจน เจฏเจเฉเจจเฉ เจฌเจฃเจพเจเจ เจเจฟ เจฆเฉเจตเฉเจ เจธเฉฐเจธเจเจฐเจฃ เจเฉฑเจเฉ เจกเจฐเจพเจเฉฐเจ เจจเฉเฉฐ เจฆเฉเจฌเจพเจฐเจพ เจคเจฟเจเจฐ เจเจฐเจฆเฉ เจนเจจ, เจญเจพเจต เจชเฉเจฐเจพ เจธเฉฐเจธเจเจฐเจฃ เจฌเฉเจฒเฉเฉเจพ เจธเฉเฅค เจเจฟเจธเฉ เจตเฉ เจธเจฅเจฟเจคเฉ เจตเจฟเฉฑเจ, เจเฉเจฐเจพเจซเจฟเจ เจซเจพเจเจฒเจพเจ เจตเจฟเฉฑเจ เจเจพเจ เจเจฐเฉ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ 50 เจฎเจฟเจฒเฉเจ เจจ เจเจฟเฉฑเจคเจฐเจพเจ เจจเฉเฉฐ เจธเจเฉเจฐ เจเจฐเจจเจพ เจคเฉเจฐเฉฐเจค เจเฉเจฐ-เจฒเจพเจญเจเจพเจฐเฉ เจฎเฉฐเจจเจฟเจ เจเจฟเจ เจธเฉ, เจ เจคเฉ เจ เจธเฉเจ เจเจฐเจเจพเจเจต เจคเฉเจ เจธเจพเจฐเฉเจเจ CSV เจซเจพเจเจฒเจพเจ เจจเฉเฉฐ เจฎเจฟเจฒเจพเจเจฃ เจฆเจพ เจซเฉเจธเจฒเจพ เจเฉเจคเจพ เจนเฉ train_simplified.zip เจนเจฐเฉเจ เจฌเฉเจ เจฒเจ "เจเฉฑเจกเจฃ 'เจคเฉ" เจฒเฉเฉเฉเจเจฆเฉ เจเจเจพเจฐ เจฆเฉเจเจ เจคเจธเจตเฉเจฐเจพเจ เจฆเฉ เจ เจเจฒเฉ เจชเฉเฉเฉเจนเฉ เจฆเฉ เจจเจพเจฒ เจกเจพเจเจพเจฌเฉเจธ เจตเจฟเฉฑเจเฅค
เจเฉฑเจ เจเฉฐเจเฉ เจคเจฐเฉเจนเจพเจ เจธเจพเจฌเจค เจชเฉเจฐเจฃเจพเจฒเฉ เจจเฉเฉฐ DBMS เจตเจเฉเจ เจเฉเจฃเจฟเจ เจเจฟเจ เจธเฉ เจฎเฉเจจเฉเจเจกเฉเจฌเฉ, เจ
เจฐเจฅเจพเจค เจเฉฑเจ เจชเฉเจเฉเจ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ 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"
)
)
}
เจกเฉเจเจพเจฌเฉเจธ เจตเจฟเฉฑเจ เจกเฉเจเจพ เจฒเฉเจก เจเจฐเจจ เจฆเจพ เจธเจญ เจคเฉเจ เจคเฉเจเจผ เจคเจฐเฉเจเจพ เจธเฉเจเจธเจฏเฉเจเจฒ - เจเจฎเจพเจเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ CSV เจซเจพเจเจฒเจพเจ เจฆเฉ เจธเจฟเฉฑเจงเฉ เจจเจเจฒ เจเจฐเจจเจพ เจธเฉ COPY OFFSET 2 INTO tablename FROM path USING DELIMITERS ',','n','"' NULL AS '' BEST EFFORT
เจเจฟเฉฑเจฅเฉ tablename
- เจเฉเจฌเจฒ เจฆเจพ เจจเจพเจฎ เจ
เจคเฉ path
- เจซเจพเจเจฒ เจฆเจพ เจฎเจพเจฐเจเฅค เจเจฐเจเจพเจเจต เจฆเฉ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจฆเฉ เจธเจฎเฉเจ, เจเจน เจชเจคเจพ เจฒเจเจพเจเจ เจเจฟเจ เจเจฟ เจฌเจฟเจฒเจ-เจเจจ เจฒเจพเจเฉ เจเจฐเจจเจพ unzip
เจเจฐ เจตเจฟเฉฑเจ เจเจฐเจเจพเจเจต เจฆเฉเจเจ เจเจ เจซเจพเจเจฒเจพเจ เจจเจพเจฒ เจธเจนเฉ เจขเฉฐเจ เจจเจพเจฒ เจเฉฐเจฎ เจจเจนเฉเจ เจเจฐเจฆเจพ, เจเจธเจฒเจ เจ
เจธเฉเจ เจธเจฟเจธเจเจฎ เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจคเฉ 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
เจตเจฐเจคเฉ เจเจ เจกเจฐเจพเจเจต เจฆเฉเจเจ เจเจคเฉ เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ เจฆเฉ เจเจงเจพเจฐ 'เจคเฉ เจกเจพเจเจพ เจฒเฉเจก เจเจฐเจจ เจฆเจพ เจธเจฎเจพเจ เจตเฉฑเจ-เจตเฉฑเจ เจนเฉ เจธเจเจฆเจพ เจนเฉเฅค เจธเจพเจกเฉ เจเฉเจธ เจตเจฟเฉฑเจ, เจเฉฑเจ SSD เจฆเฉ เจ เฉฐเจฆเจฐ เจเจพเจ เจเฉฑเจ เจซเจฒเฉเจธเจผ เจกเจฐเจพเจเจต (เจธเจฐเฉเจค เจซเจพเจเจฒ) เจคเฉเจ เจเฉฑเจ 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
. เจเจธเจฆเฉ เจฒเจ เจ
เจธเฉเจ 3 เจเฉเจฐเจฟเจเจธ เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจคเฉ เจนเฉเฅค เจธเจญ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ เจเจธ เจเจฟเจธเจฎ เจฆเฉ เจ
เจฏเจพเจฎเจคเจพ เจจเฉเฉฐ เจเจเจพเจเจฃเจพ เจธเฉ เจเฉ เจจเจฟเจฐเฉเจเจฃ ID เจจเฉเฉฐ เจธเจเฉเจฐ เจเจฐเจฆเจพ เจนเฉเฅค เจฎเฉเจฒ เจกเจพเจเจพ เจธเฉเฉฑเจ เจตเจฟเฉฑเจ, ID เจจเฉเฉฐ เจธเจเฉเจฐ เจเจฐเจจ เจฒเจ เจฒเฉเฉเฉเจเจฆเฉ เจเจฟเจธเจฎ เจนเฉ bigint
, เจชเจฐ เจจเจฟเจฐเฉเจเจฃเจพเจ เจฆเฉ เจธเฉฐเจเจฟเจ เจเจนเจจเจพเจ เจฆเฉ เจชเจเจพเจฃเจเจฐเจคเจพเจตเจพเจ เจจเฉเฉฐ, เจเจฐเจกเฉเจจเจฒ เจจเฉฐเจฌเจฐ เจฆเฉ เจฌเจฐเจพเจฌเจฐ, เจเจฟเจธเจฎ เจตเจฟเฉฑเจ เจซเจฟเฉฑเจ เจเจฐเจจเจพ เจธเฉฐเจญเจต เจฌเจฃเจพเจเจเจฆเฉ เจนเฉ int
. เจเจธ เจฎเจพเจฎเจฒเฉ เจตเจฟเฉฑเจ เจเฉเจ เจฌเจนเฉเจค เจคเฉเจเจผ เจนเฉ. เจฆเฉเจเฉ เจเจพเจฒ เจธเฉ เจตเจฐเจคเจฃเฉ ORDERED INDEX
- เจ
เจธเฉเจ เจเจธ เจซเฉเจธเจฒเฉ 'เจคเฉ เจ
เจจเฉเจญเจตเฉ เจคเฉเจฐ 'เจคเฉ เจเจ เจนเจพเจ, เจธเจพเจฐเฉเจเจ เจเจชเจฒเจฌเจง เจเฉเจเจผเจพเจ เจตเจฟเฉฑเจเฉเจ เจฒเฉฐเจเจฃ เจคเฉเจ เจฌเจพเจ
เจฆ PREPARE
เจเจธเฉ เจเจฟเจธเจฎ เจฆเฉ เจธเจตเจพเจฒเจพเจ เจฆเจพ เจเฉฑเจ เจธเจฎเฉเจน เจฌเจฃเจพเจเจฃ เจตเฉเจฒเฉ เจเฉฑเจ เจคเจฟเจเจฐ เจธเจฎเฉเจเจฐเจจ เจฆเฉ เจฌเจพเจ
เจฆ เจตเจฟเฉฑเจ เจตเจฐเจคเฉเจ เจฆเฉ เจจเจพเจฒ, เจชเจฐ เจ
เจธเจฒ เจตเจฟเฉฑเจ เจเฉฑเจ เจธเจงเจพเจฐเจจ เจฆเฉ เจคเฉเจฒเจจเจพ เจตเจฟเฉฑเจ เจเฉฑเจ เจซเจพเจเจฆเจพ เจนเฉ SELECT
เจ
เฉฐเจเฉเจพ เจเจฒเจคเฉ เจฆเฉ เจธเฉเจฎเจพ เจฆเฉ เจ
เฉฐเจฆเจฐ เจจเจฟเจเจฒเจฟเจเฅค
เจกเจพเจเจพ เจ เจชเจฒเฉเจก เจเจฐเจจ เจฆเฉ เจชเฉเจฐเจเจฟเจฐเจฟเจ 450 MB เจคเฉเจ เจตเฉฑเจง RAM เจฆเฉ เจเจชเจค เจจเจนเฉเจ เจเจฐเจฆเฉ เจนเฉเฅค เจญเจพเจต, เจตเจฐเจฃเจฟเจค เจชเจนเฉเฉฐเจ เจคเฉเจนเจพเจจเฉเฉฐ เจฒเจเจญเจ เจเจฟเจธเฉ เจตเฉ เจฌเจเจ เจนเจพเจฐเจกเจตเฉเจ เจฐ 'เจคเฉ เจฆเจธเจพเจ เจเฉเจเจพเจฌเจพเจเจ เจตเจเจผเจจ เจตเจพเจฒเฉ เจกเฉเจเจพเจธเฉเจเจพเจ เจจเฉเฉฐ เจฎเฉเจต เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเฉ เจนเฉ, เจเจฟเจธ เจตเจฟเฉฑเจ เจเฉเจ เจธเจฟเฉฐเจเจฒ-เจฌเฉเจฐเจก เจกเจฟเจตเจพเจเจธเจพเจ เจตเฉ เจธเจผเจพเจฎเจฒ เจนเจจ, เจเฉ เจเจฟ เจฌเจนเฉเจค เจตเจงเฉเจ เจนเฉเฅค
เจเฉ เจเฉเจ เจฌเจเจฟเจ เจนเฉ เจเจน เจนเฉ (เจฌเฉเจคเจฐเจคเฉเจฌ) เจกเฉเจเจพ เจจเฉเฉฐ เจฎเฉเฉ เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจฆเฉ เจเจคเฉ เจจเฉเฉฐ เจฎเจพเจชเจฃเจพ เจ เจคเฉ เจตเฉฑเจ-เจตเฉฑเจ เจเจเจพเจฐเจพเจ เจฆเฉ เจฌเฉเจเจพเจ เจฆเจพ เจจเจฎเฉเจจเจพ เจฒเฉเจเจฆเฉ เจธเจฎเฉเจ เจธเจเฉเจฒเจฟเฉฐเจ เจฆเจพ เจฎเฉเจฒเจพเจเจเจฃ เจเจฐเจจเจพ:
เจกเจพเจเจพเจฌเฉเจธ เจฌเฉเจเจเจฎเจพเจฐเจ
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 เจเฉเจฒเจธ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ เจ
เจคเฉ RAM เจตเจฟเฉฑเจ เจธเจเฉเจฐ เจเฉเจคเฉ เจเฉฑเจ เจ
เจธเจฅเจพเจ PNG เจตเจฟเฉฑเจ เจธเฉเจฐเฉฑเจเจฟเจ
เจค เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ (เจฒเฉเจจเจเจธ เจเฉฑเจคเฉ, เจเจฐเจเจผเฉ เจเจฐ เจกเจพเจเจฐเฉเจเจเจฐเฉเจเจ เจกเจพเจเจฐเฉเจเจเจฐเฉ เจตเจฟเฉฑเจ เจธเจฅเจฟเจค เจนเฉเฉฐเจฆเฉเจเจ เจนเจจเฅค /tmp
, RAM เจตเจฟเฉฑเจ เจฎเจพเจเจเจ)เฅค เจเจธ เจซเจพเจเจฒ เจจเฉเฉฐ เจซเจฟเจฐ 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 เจเฉเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจเฉเจเจฐเจฃ เจฆเฉ เจจเจพเจฒ เจฒเจฟเจเจฟเจ เจเจฟเจ เจธเฉเฅค เจเจฐ.เจธเฉ.เจชเฉ.เจชเฉ.
เจธเจฎเฉฑเจธเจฟเจ เจจเฉเฉฐ เจนเฉฑเจฒ เจเจฐเจจ เจฒเจ, เจนเฉเจ เจพเจ เจฆเจฟเฉฑเจคเฉ เจชเฉเจเฉเจ เจ เจคเฉ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉเจเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจคเฉ เจเจ เจธเฉ:
-
เจเจชเจจเจธเฉเจตเฉ เจเจฟเฉฑเจคเจฐเจพเจ เจ เจคเฉ เจกเจฐเจพเจเฉฐเจ เจฒเจพเจเจจเจพเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจเฅค เจชเฉเจฐเจต-เจธเจฅเจพเจชเจค เจธเจฟเจธเจเจฎ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉเจเจ เจ เจคเฉ เจธเจฟเจฐเจฒเฉเจ เจซเจพเจเจฒเจพเจ, เจจเจพเจฒ เจนเฉ เจกเจพเจเจจเจพเจฎเจฟเจ เจฒเจฟเฉฐเจเจฟเฉฐเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจคเฉ เจเจเฅค
-
xtensor เจฌเจนเฉ-เจเจฏเจพเจฎเฉ เจเจฐเฉ เจ เจคเฉ เจเฉเจเจธเจฐเจพเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจเฅค เจ เจธเฉเจ เจเจธเฉ เจจเจพเจฎ เจฆเฉ R เจชเฉเจเฉเจ เจตเจฟเฉฑเจ เจธเจผเจพเจฎเจฒ เจนเฉเจกเจฐ เจซเจพเจเจฒเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจคเฉ เจนเฉเฅค เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจฌเจนเฉ-เจเจฏเจพเจฎเฉ เจเจฐเฉ เจฆเฉ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเฉ เจนเฉ, เจฆเฉเจตเฉเจ เจเจคเจพเจฐ เจฎเฉเจเจฐ เจ เจคเฉ เจเจพเจฒเจฎ เจฎเฉเฉฑเจ เจเฉเจฐเจฎ เจตเจฟเฉฑเจเฅค
-
ndjson JSON เจจเฉเฉฐ เจชเจพเจฐเจธ เจเจฐเจจ เจฒเจเฅค เจตเจฟเฉฑเจ เจเจธ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ xtensor เจเจเฉเจฎเฉเจเจฟเจเจฒเฉ เจเฉ เจเจน เจชเฉเจฐเฉเจเฉเจเจ เจตเจฟเฉฑเจ เจฎเฉเจเฉเจฆ เจนเฉเฅค
-
RcppThread JSON เจคเฉเจ เจตเฉเจเจเจฐ เจฆเฉ เจฎเจฒเจเฉ-เจฅเฉเจฐเฉเจกเจก เจชเฉเจฐเฉเจธเฉเจธเจฟเฉฐเจ เจจเฉเฉฐ เจธเฉฐเจเจ เจฟเจค เจเจฐเจจ เจฒเจเฅค เจเจธ เจชเฉเจเฉเจ เจฆเฉเจเจฐเจพ เจชเฉเจฐเจฆเจพเจจ เจเฉเจคเฉเจเจ เจธเจฟเจฐเจฒเฉเจ เจซเจพเจเจฒเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจคเฉ เจเจ เจนเฉเฅค เจนเฉเจฐ เจชเฉเจฐเจธเจฟเฉฑเจง เจคเฉฑเจ เจเจฐเจธเฉเจชเฉเจชเฉเจชเฉเจฐเจฒเจฒ เจชเฉเจเฉเจ, เจนเฉเจฐ เจเฉเจเจผเจพเจ เจฆเฉ เจจเจพเจฒ, เจเฉฑเจ เจฌเจฟเจฒเจ-เจเจจ เจฒเฉเจช เจเฉฐเจเจฐเฉฑเจชเจ เจตเจฟเจงเฉ เจนเฉเฅค
เจเจน เจเจธ เจตเฉฑเจฒ เจงเจฟเจเจจ เจฆเฉเจฃ เจฏเฉเจ เจนเฉ xtensor เจเฉฑเจ เจฆเฉเจตเจคเจพ เจธเจพเจฌเจค เจนเฉเจเจ: เจเจธ เจคเฉฑเจฅ เจคเฉเจ เจเจฒเจพเจตเจพ เจเจฟ เจเจธเจฆเฉ เจตเจฟเจเจชเจ เจเจพเจฐเจเจเฉเจธเจผเจฒเจคเจพ เจ เจคเฉ เจเฉฑเจ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจนเฉ, เจเจธเจฆเฉ เจกเจฟเจตเฉเจฒเจชเจฐ เจเจพเจซเจผเฉ เจเจตเจพเจฌเจฆเฉเจน เจธเจพเจฌเจค เจนเฉเจ เจ เจคเฉ เจชเฉเจฐเจธเจผเจจเจพเจ เจฆเฉ เจคเฉเจฐเฉฐเจค เจ เจคเฉ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจ เจเจตเจพเจฌ เจฆเจฟเฉฑเจคเฉเฅค เจเจนเจจเจพเจ เจฆเฉ เจฎเจฆเจฆ เจจเจพเจฒ, เจเจชเจจเจธเฉเจตเฉ เจฎเฉเจเฉเจฐเจฟเจเจธ เจฆเฉ เจเจเจธเจเฉเจเจธเจฐ เจเฉเจเจธเจฐเจพเจ เจตเจฟเฉฑเจ เจชเจฐเจฟเจตเจฐเจคเจจ เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐเจจเจพ เจธเฉฐเจญเจต เจธเฉ, เจจเจพเจฒ เจนเฉ 3-เจ เจฏเจพเจฎเฉ เจเจฟเฉฑเจคเจฐ เจเฉเจเจธเจฐเจพเจ เจจเฉเฉฐ เจธเจนเฉ เจฎเจพเจช เจฆเฉ 4-เจ เจฏเจพเจฎเฉ เจเฉเจเจธเจฐ (เจฌเฉเจ เจเฉเจฆ) เจตเจฟเฉฑเจ เจเฉเฉเจจ เจฆเจพ เจเฉฑเจ เจคเจฐเฉเจเจพเฅค
Rcpp, xtensor เจ เจคเฉ RcppThread เจธเจฟเฉฑเจเจฃ เจฒเจ เจธเจฎเฉฑเจเจฐเฉ
เจเจนเจจเจพเจ เจซเจพเจเจฒเจพเจ เจจเฉเฉฐ เจเฉฐเจชเจพเจเจฒ เจเจฐเจจ เจฒเจ เจเฉ เจธเจฟเจธเจเจฎ เจซเจพเจเจฒเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจจ เจ เจคเฉ เจธเจฟเจธเจเจฎ เจคเฉ เจธเจฅเจพเจชเจฟเจค เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉเจเจ เจจเจพเจฒ เจเจคเฉเจธเจผเฉเจฒ เจฒเจฟเฉฐเจเจฟเฉฐเจ เจเจฐเจฆเฉ เจนเจจ, เจ เจธเฉเจ เจชเฉเจเฉเจ เจตเจฟเฉฑเจ เจฒเจพเจเฉ เจชเจฒเฉฑเจเจเจจ เจตเจฟเจงเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจคเฉ เจนเฉ เจเจฐ.เจธเฉ.เจชเฉ.เจชเฉ. เจเจชเจฃเฉ เจเจช เจฎเจพเจฐเจ เจ เจคเฉ เจซเจฒเฉเจ เจฒเฉฑเจญเจฃ เจฒเจ, เจ เจธเฉเจ เจเฉฑเจ เจชเฉเจฐเจธเจฟเฉฑเจง 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. เจกเจพเจเจพเจฌเฉเจธ เจคเฉเจ เจฌเฉเจเจพเจ เจจเฉเฉฐ เจ เจจเจฒเฉเจก เจเจฐเจจ เจฒเจ เจเจเจฐเฉเจเจฐ
R เจเฉเจฒ RAM เจตเจฟเฉฑเจ เจซเจฟเฉฑเจ เจนเฉเจฃ เจตเจพเจฒเฉ เจกเฉเจเจพ เจจเฉเฉฐ เจชเฉเจฐเฉเจธเฉเจธ เจเจฐเจจ เจฒเจ เจเฉฑเจ เจเฉฐเจเฉ-เจฒเจพเจเจ เจชเฉเจฐเจคเจฟเจธเจผเจ เจพ เจนเฉ, เจเจฆเฉเจ เจเจฟ เจชเจพเจเจฅเจจ เจจเฉเฉฐ เจฆเฉเจนเจฐเจพเจเจฃ เจตเจพเจฒเฉ เจกเฉเจเจพ เจชเฉเจฐเฉเจธเฉเจธเจฟเฉฐเจ เจฆเฉเจเจฐเจพ เจตเจงเฉเจฐเฉ เจตเจฟเจธเจผเฉเจธเจผเจคเจพ เจฆเจฟเฉฑเจคเฉ เจเจพเจเจฆเฉ เจนเฉ, เจเจฟเจธ เจจเจพเจฒ เจคเฉเจธเฉเจ เจเจธเจพเจจเฉ เจจเจพเจฒ เจ เจคเฉ เจเฉเจฆเจฐเจคเฉ เจคเฉเจฐ 'เจคเฉ เจเจเจ-เจเจซ-เจเฉเจฐ เจเจฃเจจเจพเจตเจพเจ (เจฌเจพเจนเจฐเฉ เจฎเฉเจฎเฉเจฐเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจเจฃเจจเจพ) เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐ เจธเจเจฆเฉ เจนเฉเฅค เจตเจฐเจฃเจฟเจค เจธเจฎเฉฑเจธเจฟเจ เจฆเฉ เจธเฉฐเจฆเจฐเจญ เจตเจฟเฉฑเจ เจธเจพเจกเฉ เจฒเจ เจเฉฑเจ เจเจเจธเจพเจฒเฉ เจ เจคเฉ เจขเฉเจเจตเฉเจ เจเจฆเจพเจนเจฐเจจ เจนเฉ เจกเฉเฉฐเจเฉ เจจเจฟเจเจฐเจฒ เจจเฉเฉฑเจเจตเจฐเจ เจนเจจ เจเฉ เจเจฐเฉเจกเฉเจเจเจ เจกเจฟเจธเฉเจเจ เจตเจฟเจงเฉ เจฆเฉเจเจฐเจพ เจธเจฟเจเจฒเจพเจ เจชเฉเจฐเจพเจชเจค เจเฉเจคเฉ เจเจ เจนเจจ, เจเฉ เจเจฟ เจจเจฟเจฐเฉเจเจฃเจพเจ เจฆเฉ เจเฉฑเจ เจเฉเจเฉ เจเจฟเจนเฉ เจนเจฟเฉฑเจธเฉ, เจเจพเจ เจฎเจฟเฉฐเจจเฉ-เจฌเฉเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจนเจฐเฉเจ เจชเฉเจพเจ 'เจคเฉ เจเจฐเฉเจกเฉเจเจเจ เจฆเฉ เจ เจจเฉเจฎเจพเจจ เจฆเฉ เจจเจพเจฒ เจนเจจเฅค
เจชเจพเจเจฅเจจ เจตเจฟเฉฑเจ เจฒเจฟเจเฉ เจกเฉเฉฐเจเฉ เจธเจฟเฉฑเจเจฃ เจฆเฉ เจซเจฐเฉเจฎเจตเจฐเจ เจตเจฟเฉฑเจ เจตเจฟเจธเจผเฉเจธเจผ เจเจฒเจพเจธเจพเจ เจนเฉเฉฐเจฆเฉเจเจ เจนเจจ เจเฉ เจกเฉเจเจพ เจฆเฉ เจ เจงเจพเจฐ 'เจคเฉ เจฆเฉเจนเจฐเจพเจ เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐเจฆเฉเจเจ เจนเจจ: เจเฉเจฌเจฒ, เจซเฉเจฒเจกเจฐเจพเจ เจตเจฟเฉฑเจ เจคเจธเจตเฉเจฐเจพเจ, เจฌเจพเจเจจเจฐเฉ เจซเจพเจฐเจฎเฉเจ, เจเจฆเจฟเฅค เจคเฉเจธเฉเจ เจคเจฟเจเจฐ เจตเจฟเจเจฒเจชเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเฉ เจเจพเจ เจเจพเจธ เจเฉฐเจฎเจพเจ เจฒเจ เจเจชเจฃเฉ เจเฉเจฆ เจฆเฉ เจฒเจฟเจ เจธเจเจฆเฉ เจนเฉเฅค เจเจฐ เจตเจฟเฉฑเจ เจ เจธเฉเจ เจชเจพเจเจฅเจจ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉ เจฆเฉเจเจ เจธเจพเจฐเฉเจเจ เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ เจฆเจพ เจฒเจพเจญ เจฒเฉ เจธเจเจฆเฉ เจนเจพเจ เจเฉเจฐเจธ เจเจธเจฆเฉ เจตเฉฑเจ-เจตเฉฑเจ เจฌเฉเจเจเจเจกเจพเจ เจจเจพเจฒ เจเฉฑเจเฉ เจจเจพเจฎ เจฆเฉ เจชเฉเจเฉเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ, เจเฉ เจฌเจฆเจฒเฉ เจตเจฟเฉฑเจ เจชเฉเจเฉเจ เจฆเฉ เจธเจฟเจเจฐ 'เจคเฉ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉ เจเจพเจฒเฉเจฆเจพเจฐ. เจฌเจพเจ เจฆ เจตเจพเจฒเจพ เจเฉฑเจ เจตเฉฑเจเจฐเฉ เจฒเฉฐเจฌเฉ เจฒเฉเจ เจฆเจพ เจนเฉฑเจเจฆเจพเจฐ เจนเฉ; เจเจน เจคเฉเจนเจพเจจเฉเฉฐ เจจเจพ เจธเจฟเจฐเจซเจผ R เจคเฉเจ Python เจเฉเจก เจเจฒเจพเจเจฃ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉ, เจธเจเฉเจ เจคเฉเจนเจพเจจเฉเฉฐ R เจ เจคเฉ Python เจธเฉเจธเจผเจจเจพเจ เจตเจฟเจเจเจพเจฐ เจเจฌเจเฉเจเจ เจเฉเจฐเจพเจเจธเจซเจฐ เจเจฐเจจ เจฆเฉ เจตเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉ, เจเจเฉเจฎเฉเจเจฟเจ เจนเฉ เจธเจพเจฐเฉ เจฒเฉเฉเฉเจเจฆเฉ เจชเฉเจฐเจเจพเจฐ เจฆเฉ เจชเจฐเจฟเจตเจฐเจคเจจ เจเจฐเจฆเฉ เจนเฉเจเฅค
เจ เจธเฉเจ MonetDBLite เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจธเจพเจฐเฉ เจกเฉเจเจพ เจจเฉเฉฐ RAM เจตเจฟเฉฑเจ เจธเจเฉเจฐ เจเจฐเจจ เจฆเฉ เจเจผเจฐเฉเจฐเจค เจคเฉเจ เจเฉเจเจเจพเจฐเจพ เจชเจพ เจฒเจฟเจ เจนเฉ, เจธเจพเจฐเฉ "เจจเจฟเจเจฐเจฒ เจจเฉเจเจตเจฐเจ" เจเฉฐเจฎ เจชเจพเจเจฅเจจ เจตเจฟเฉฑเจ เจ เจธเจฒ เจเฉเจก เจฆเฉเจเจฐเจพ เจเฉเจคเฉ เจเจพเจฃเจเฉ, เจธเจพเจจเฉเฉฐ เจกเฉเจเจพ เจเฉฑเจคเฉ เจเฉฑเจ เจเจเจฐเฉเจเจฐ เจฒเจฟเจเจฃเจพ เจชเจตเฉเจเจพ, เจเจฟเจเจเจเจฟ เจเฉฑเจฅเฉ เจเฉเจ เจตเฉ เจคเจฟเจเจฐ เจจเจนเฉเจ เจนเฉเฅค R เจเจพเจ Python เจตเจฟเฉฑเจ เจ เจเจฟเจนเฉ เจธเจฅเจฟเจคเฉ เจฒเจเฅค เจเจธเจฆเฉ เจฒเจ เจฒเจพเจเจผเจฎเฉ เจคเฉเจฐ 'เจคเฉ เจธเจฟเจฐเจซ เจฆเฉ เจฒเฉเฉเจพเจ เจนเจจ: เจเจธเจจเฉเฉฐ เจเฉฑเจ เจฌเฉเจ เฉฐเจค เจฒเฉเจช เจตเจฟเฉฑเจ เจฌเฉเจเจพเจ เจจเฉเฉฐ เจตเจพเจชเจธ เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ เจ เจคเฉ เจเจธเจฆเฉ เจธเจฅเจฟเจคเฉ เจจเฉเฉฐ เจฆเฉเจนเจฐเจพเจ เจฆเฉ เจตเจฟเจเจเจพเจฐ เจธเฉเจฐเฉฑเจเจฟเจ เจค เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ (เจเจฐ เจตเจฟเฉฑเจ เจฌเจพเจ เจฆ เจตเจพเจฒเฉ เจจเฉเฉฐ เจฌเฉฐเจฆ เจเจฐเจจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจธเจญ เจคเฉเจ เจธเจฐเจฒ เจคเจฐเฉเจเฉ เจจเจพเจฒ เจฒเจพเจเฉ เจเฉเจคเจพ เจเจฟเจ เจนเฉ)เฅค เจชเจนเจฟเจฒเจพเจ, เจเจธ เจจเฉเฉฐ เจธเจชเจธเจผเจ เจคเฉเจฐ 'เจคเฉ เจเจฐ เจเจฐเฉ เจจเฉเฉฐ เจเจเจฐเฉเจเจฐ เจฆเฉ เจ เฉฐเจฆเจฐ เจจเฉฐเจชเฉ เจเจฐเฉ เจตเจฟเฉฑเจ เจฌเจฆเจฒเจฃ เจฆเฉ เจฒเฉเฉ เจธเฉ, เจชเจฐ เจชเฉเจเฉเจ เจฆเจพ เจฎเฉเจเฉเจฆเจพ เจธเฉฐเจธเจเจฐเจฃ เจเฉเจฐเจธ เจเจน เจเจชเจฃเฉ เจเจช เจเจฐเจฆเจพ เจนเฉเฅค
เจธเจฟเจเจฒเจพเจ เจ เจคเฉ เจชเฉเจฐเจฎเจพเจฃเจฟเจเจคเจพ เจกเฉเจเจพ เจฒเจ เจฆเฉเจนเจฐเจพเจ เจนเฉเจ เจฒเจฟเจเฉ เจ เจจเฉเจธเจพเจฐ เจจเจฟเจเจฒเจฟเจ:
เจธเจฟเจเจฒเจพเจ เจ เจคเฉ เจชเฉเจฐเจฎเจพเจฃเจฟเจเจคเจพ เจกเฉเจเจพ เจฒเจ เจเจเจฐเฉเจเจฐ
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] เจคเฉฑเจ เจชเจฟเจเจธเจฒ เจฎเฉเฉฑเจฒเจพเจ เจจเฉเฉฐ เจธเจเฉเจฒ เจเจฐเจจ เจฒเจ เจฌเจพเจ
เจฆ เจตเจพเจฒเฉ เจฆเฉ เจฒเฉเฉ เจนเฉเฉฐเจฆเฉ เจนเฉ, เจเฉ เจเจฟ เจธเจชเจฒเจพเจ เจเฉเจคเฉ เจเจ เจจเฉเฉฐ เจธเจฟเจเจฒเจพเจ เจฆเฉเจฃ เจตเฉเจฒเฉ เจตเจฐเจคเจฟเจ เจเจพเจเจฆเจพ เจธเฉ เจเฉเจฐเจธ เจฎเจพเจกเจฒ
เจฌเจพเจนเจฐเฉ เจซเฉฐเจเจธเจผเจจ เจตเจฟเฉฑเจ เจเจฐเจเฉเจฎเฉเจเจ เจเจฟเจธเจฎ เจฆเฉ เจเจพเจเจ, เจเฉฑเจ เจธเจพเจฐเจฃเฉ เจนเฉเฉฐเจฆเฉ เจนเฉ 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 เจตเจฟเฉฑเจ เจเจฟเจธเฉ เจตเฉ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจฎเจพเจคเจฐเจพ เจตเจฟเฉฑเจ เจกเฉเจเจพ เจฆเฉ เจจเจพเจฒ เจชเฉเจฐเจญเจพเจตเจธเจผเจพเจฒเฉ เจขเฉฐเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฆเฉ เจเจฒเจชเจจเจพ เจเจฐเจจเจพ เจฌเจนเฉเจค เจฎเฉเจธเจผเจเจฒ เจนเฉเฅค
เจเฉเจฐ 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)
เจเฉ เจคเฉเจนเจพเจกเฉ เจเฉเจฒ เจเจพเจซเจผเฉ เจฎเจพเจคเจฐเจพ เจตเจฟเฉฑเจ RAM เจนเฉ, เจคเจพเจ เจคเฉเจธเฉเจ เจเจธ เจจเฉเฉฐ เจเจธเฉ เจฐเฉเจฎ เจตเจฟเฉฑเจ เจเฉเจฐเจพเจเจธเจซเจฐ เจเจฐเจเฉ เจกเฉเจเจพเจฌเฉเจธ เจฆเฉ เจธเฉฐเจเจพเจฒเจจ เจจเฉเฉฐ เจเฉฐเจญเฉเจฐเจคเจพ เจจเจพเจฒ เจคเฉเจเจผ เจเจฐ เจธเจเจฆเฉ เจนเฉ (เจธเจพเจกเฉ เจเฉฐเจฎ เจฒเจ 32 GB เจเจพเจซเจผเฉ เจนเฉ)เฅค เจฒเฉเจจเจเจธ เจตเจฟเฉฑเจ, เจญเจพเจ เจฎเฉเจฒ เจฐเฉเจช เจตเจฟเฉฑเจ เจฎเจพเจเจเจ เจนเฉเฉฐเจฆเจพ เจนเฉ /dev/shm
, เจ
เฉฑเจงเฉ RAM เจธเจฎเจฐเฉฑเจฅเจพ เจคเฉฑเจ เจฆเจพ เจเจฌเจเจผเจพ เจนเฉเฅค เจคเฉเจธเฉเจ เจธเฉฐเจชเจพเจฆเจจ เจเจฐเจเฉ เจนเฉเจฐ เจเจเจพเจเจฐ เจเจฐ เจธเจเจฆเฉ เจนเฉ /etc/fstab
เจตเจฐเจเจพ เจฐเจฟเจเจพเจฐเจก เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจฒเจ tmpfs /dev/shm tmpfs defaults,size=25g 0 0
. เจฐเฉเจฌเฉเจ เจเจฐเจจเจพ เจฏเจเฉเจจเฉ เจฌเจฃเจพเจ เจ
เจคเฉ เจเจฎเจพเจเจก เจเจฒเจพ เจเฉ เจจเจคเฉเจเจพ เจเฉเฉฑเจ เจเจฐเฉ df -h
.
เจเฉเจธเจ เจกเฉเจเจพ เจฒเจ เจเจเจฐเฉเจเจฐ เจฌเจนเฉเจค เจธเจฐเจฒ เจฆเจฟเจเจพเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉ, เจเจฟเจเจเจเจฟ เจเฉเจธเจ เจกเฉเจเจพเจธเฉเจ เจชเฉเจฐเฉ เจคเจฐเฉเจนเจพเจ RAM เจตเจฟเฉฑเจ เจซเจฟเฉฑเจ เจนเฉเฉฐเจฆเจพ เจนเฉ:
เจเฉเจธเจ เจกเฉเจเจพ เจฒเจ เจเจเจฐเฉเจเจฐ
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)
, เจญเจพเจต, เจเฉเจจเจฒเจพเจ เจฆเฉ เจเจฟเจฃเจคเฉ เจจเฉเฉฐ เจฌเจฆเจฒเจฟเจ เจจเจนเฉเจ เจเจพ เจธเจเจฆเจพ เจนเฉเฅค เจชเจพเจเจฅเจจ เจตเจฟเฉฑเจ เจ
เจเจฟเจนเฉ เจเฉเจ เจธเฉเจฎเจพ เจจเจนเฉเจ เจนเฉ, เจเจธเจฒเจ เจ
เจธเฉเจ เจเจพเจนเจฒเฉ เจเฉเจคเฉ เจ
เจคเฉ เจเจธ เจเจฐเจเฉเจเฉเจเจเจฐ เจฆเฉ เจเจชเจฃเฉ เจเฉเจฆ เจฆเฉ เจฒเจพเจเฉเจเจฐเจจ เจจเฉเฉฐ เจฎเฉเจฒ เจฒเฉเจ (เจเฉเจฐเจธ เจธเฉฐเจธเจเจฐเจฃ เจตเจฟเฉฑเจ เจเฉฑเจกเจฃ เจคเฉเจ เจฌเจฟเจจเจพเจ) เจฆเฉ เจชเจพเจฒเจฃเจพ เจเจฐเจฆเฉ เจนเฉเจ เจฒเจฟเจเจฟเจ:
เจฎเฉเจฌเจพเจเจฒเจจเฉเฉฑเจ 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)
เจนเฉเจฃ เจธเจชเจฒเจพเจ เจเฉเจคเฉ เจเจฟเจธเฉ เจตเฉ เจจเฉเฉฐ เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจฒเจ เจเฉฑเจ เจฏเฉเจจเฉเจตเจฐเจธเจฒ เจซเฉฐเจเจธเจผเจจ เจฒเจฟเจเจฃเจพ เจฎเฉเจธเจผเจเจฒ เจจเจนเฉเจ เจนเฉ เจเฉเจฐเจธ เจเจฎเฉเจเจจเฉเฉฑเจ 'เจคเฉ เจธเจฟเจเจฒเจพเจ เจชเฉเจฐเจพเจชเจค เจตเจเจผเจจ เจฆเฉ เจจเจพเจฒ เจเจพเจ เจฌเจฟเจจเจพเจ เจฎเจพเจกเจฒ:
เจฐเฉเจกเฉเจฎเฉเจก เจเจฐเจเฉเจเฉเจเจเจฐ เจฒเฉเจก เจเจฐเจจ เจฒเจ เจซเฉฐเจเจธเจผเจจ
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)
เจชเฉเจเฉเจ docopt เจฒเจพเจเฉ เจเจฐเจจ เจจเฉเฉฐ เจฆเจฐเจธเจพเจเจเจฆเจพ เจนเฉ 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
เจฎเฉเจเฉเจฆเจพ เจธเฉฐเจธเจเจฐเจฃ เจคเฉเจ เจเฉเจฐเจธ เจเจฐ เจฆเฉ เจตเจฐเจคเฉเจ เจตเจฟเฉฑเจ
เจเจธ เจชเจนเฉเฉฐเจ เจจเฉ RStudio เจตเจฟเฉฑเจ เจธเจเฉเจฐเจฟเจชเจเจพเจ เจฆเฉ เจตเจงเฉเจฐเฉ เจฐเจตเจพเจเจคเฉ เจฒเจพเจเจ เจฆเฉ เจฎเฉเจเจพเจฌเจฒเฉ เจตเฉฑเจ-เจตเฉฑเจ เจฎเจพเจกเจฒเจพเจ เจฆเฉ เจจเจพเจฒ เจชเฉเจฐเจฏเฉเจเจพเจ เจจเฉเฉฐ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจคเฉเจฐ 'เจคเฉ เจคเฉเจเจผ เจเจฐเจจเจพ เจธเฉฐเจญเจต เจฌเจฃเจพเจเจ (เจ
เจธเฉเจ เจชเฉเจเฉเจ เจจเฉเฉฐ เจเฉฑเจ เจธเฉฐเจญเจพเจตเฉ เจตเจฟเจเจฒเจช เจตเจเฉเจ เจจเฉเจ เจเจฐเจฆเฉ เจนเจพเจเฅค
6. เจธเจเฉเจฐเจฟเจชเจเจพเจ เจฆเจพ เจกเฉเจเจฐเจพเจเจเจผเฉเจธเจผเจจ
เจ
เจธเฉเจ เจเฉเจฎ เจฆเฉ เจฎเฉเจเจฌเจฐเจพเจ เจตเจฟเจเจเจพเจฐ เจธเจฟเจเจฒเจพเจ เจฎเจพเจกเจฒเจพเจ เจ
เจคเฉ เจเจฒเจพเจเจก เจตเจฟเฉฑเจ เจคเฉเจเจผเฉ เจจเจพเจฒ เจคเจพเจเจจเจพเจคเฉ เจฒเจ เจตเจพเจคเจพเจตเจฐเจฃ เจฆเฉ เจชเฉเจฐเจเฉเจฌเจฟเจฒเจเฉ เจจเฉเฉฐ เจฏเจเฉเจจเฉ เจฌเจฃเจพเจเจฃ เจฒเจ เจกเฉเจเจฐ เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจคเฉเฅค เจคเฉเจธเฉเจ เจเจธ เจเฉเจฒ เจจเจพเจฒ เจเจพเจฃเฉ เจนเฉเจฃเจพ เจธเจผเฉเจฐเฉ เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจเฉ เจเจฟ เจเฉฑเจ เจเจฐ เจชเฉเจฐเฉเจเจฐเจพเจฎเจฐ เจฒเจ เจฎเฉเจเจพเจฌเจฒเจคเจจ เจ
เจธเจพเจงเจพเจฐเจจ เจนเฉ, เจจเจพเจฒ
เจกเฉเจเจฐ เจคเฉเจนเจพเจจเฉเฉฐ เจธเจเฉเจฐเฉเจ เจคเฉเจ เจเจชเจฃเฉเจเจ เจเฉเจฆ เจฆเฉเจเจ เจคเจธเจตเฉเจฐเจพเจ เจฌเจฃเจพเจเจฃ เจ
เจคเฉ เจคเฉเจนเจพเจกเฉเจเจ เจเฉเจฆ เจฆเฉเจเจ เจคเจธเจตเฉเจฐเจพเจ เจฌเจฃเจพเจเจฃ เจฆเฉ เจ
เจงเจพเจฐ เจตเจเฉเจ เจนเฉเจฐ เจเจฟเฉฑเจคเจฐเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค เจเจชเจฒเจฌเจง เจตเจฟเจเจฒเจชเจพเจ เจฆเจพ เจตเจฟเจธเจผเจฒเฉเจธเจผเจฃ เจเจฐเจฆเฉ เจธเจฎเฉเจ, เจ
เจธเฉเจ เจเจธ เจธเจฟเฉฑเจเฉ 'เจคเฉ เจชเจนเฉเฉฐเจเฉ เจเจฟ NVIDIA, CUDA + cuDNN เจกเจฐเจพเจเจตเจฐเจพเจ เจ
เจคเฉ เจชเจพเจเจฅเจจ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉเจเจ เจจเฉเฉฐ เจธเจฅเจพเจชเจฟเจค เจเจฐเจจเจพ เจเจฟเฉฑเจคเจฐ เจฆเจพ เจเจพเจซเจผเฉ เจตเฉฑเจกเจพ เจนเจฟเฉฑเจธเจพ เจนเฉ, เจ
เจคเฉ เจ
เจธเฉเจ เจ
เจงเจฟเจเจพเจฐเจค เจเจฟเฉฑเจคเจฐ เจจเฉเฉฐ เจ
เจงเจพเจฐ เจตเจเฉเจ เจฒเฉเจฃ เจฆเจพ เจซเฉเจธเจฒเจพ เจเฉเจคเจพ เจนเฉเฅค tensorflow/tensorflow:1.12.0-gpu
, เจเฉฑเจฅเฉ เจฒเฉเฉเฉเจเจฆเฉ R เจชเฉเจเฉเจ เจธเจผเจพเจฎเจฒ เจเจฐเจจเจพเฅค
เจซเจพเจเจจเจฒ เจกเฉเจเจฐ เจซเจพเจเจฒ เจเจธ เจคเจฐเฉเจนเจพเจ เจฆเจฟเจเจพเจ เจฆเจฟเฉฐเจฆเฉ เจธเฉ:
เจกเฉเจเจฐเจซเจพเจเจฒ
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
เจกเจฟเจซเฉเจฒเจ เจฎเฉเฉฑเจฒเจพเจ เจฆเฉ เจจเจพเจฒ; เจเฉเจเจฐ เจชเจนเจฟเจฒเฉ เจธเจฅเจฟเจคเฉ เจธเฉฐเจฌเฉฐเจงเฉ เจเจฐเจเฉเจฎเฉเจเจ "bash" เจนเฉ, เจคเจพเจ เจเฉฐเจเฉเจจเจฐ เจเจฎเจพเจเจก เจธเจผเฉเฉฑเจฒ เจจเจพเจฒ เจเฉฐเจเจฐเจเจเจเจฟเจต เจคเฉเจฐ 'เจคเฉ เจธเจผเฉเจฐเฉ เจนเฉเจตเฉเจเจพเฅค เจนเฉเจฐ เจธเจพเจฐเฉ เจฎเจพเจฎเจฒเจฟเจเจ เจตเจฟเฉฑเจ, เจธเจฅเจฟเจคเฉ เจธเฉฐเจฌเฉฐเจงเฉ เจเจฐเจเฉเจฎเฉเจเจเจพเจ เจฆเฉ เจฎเฉเฉฑเจฒ เจฌเจฆเจฒเฉ เจเจพเจเจฆเฉ เจนเจจ: CMD="Rscript /app/train_nn.R $@"
.
เจเจน เจงเจฟเจเจจ เจฆเฉเจฃ เจฏเฉเจ เจนเฉ เจเจฟ เจธเจฐเฉเจค เจกเฉเจเจพ เจ เจคเฉ เจกเฉเจเจพเจฌเฉเจธ เจตเจพเจฒเฉเจเจ เจกเจพเจเจฐเฉเจเจเจฐเฉเจเจ, เจ เจคเฉ เจจเจพเจฒ เจนเฉ เจธเจฟเจเจฒเจพเจ เจชเฉเจฐเจพเจชเจค เจฎเจพเจกเจฒเจพเจ เจจเฉเฉฐ เจธเฉเจฐเฉฑเจเจฟเจ เจค เจเจฐเจจ เจฒเจ เจกเจพเจเจฐเฉเจเจเจฐเฉ, เจนเฉเจธเจ เจธเจฟเจธเจเจฎ เจคเฉเจ เจเฉฐเจเฉเจจเจฐ เจฆเฉ เจ เฉฐเจฆเจฐ เจฎเจพเจเจเจ เจเฉเจคเฉเจเจ เจเจเจเจ เจนเจจ, เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจธเจเฉเจฐเจฟเจชเจเจพเจ เจฆเฉ เจจเจคเฉเจเจฟเจเจ เจจเฉเฉฐ เจฌเฉเจฒเฉเฉเฉ เจนเฉเจฐเจพเจซเฉเจฐเฉ เจคเฉเจ เจฌเจฟเจจเจพเจ เจเจเจธเฉเจธ เจเจฐเจจ เจฆเฉ เจเจเจฟเจ เจฆเจฟเฉฐเจฆเฉเจเจ เจนเจจ.
7. เจเฉเจเจฒ เจเจฒเจพเจเจก 'เจคเฉ เจเจ GPUs เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจเจพ
เจฎเฉเจเจพเจฌเจฒเฉ เจฆเฉเจเจ เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจฌเจนเฉเจค เจฐเฉเจฒเจพ-เจฐเฉฑเจชเจพ เจตเจพเจฒเจพ เจกเฉเจเจพ เจธเฉ (เจธเจฟเจฐเจฒเฉเจ เจคเจธเจตเฉเจฐ เจฆเฉเจเฉ, ODS เจธเจฒเฉเจ เจคเฉเจ @Leigh.plt เจคเฉเจ เจเจงเจพเจฐ เจฒเจฟเจ เจเจฟเจ)เฅค เจตเฉฑเจกเฉ เจฌเฉเจ เจเจธ เจจเจพเจฒ เจฒเฉเจจ เจตเจฟเฉฑเจ เจฎเจฆเจฆ เจเจฐเจฆเฉ เจนเจจ, เจ
เจคเฉ 1 GPU เจตเจพเจฒเฉ เจเฉฑเจ PC 'เจคเฉ เจชเฉเจฐเจฏเฉเจเจพเจ เจคเฉเจ เจฌเจพเจ
เจฆ, เจ
เจธเฉเจ เจเจฒเจพเจเจก เจตเจฟเฉฑเจ เจเจ GPUs 'เจคเฉ เจธเจฟเจเจฒเจพเจ เจฎเจพเจกเจฒเจพเจ เจตเจฟเฉฑเจ เจฎเฉเจนเจพเจฐเจค เจนเจพเจธเจฒ เจเจฐเจจ เจฆเจพ เจซเฉเจธเจฒเจพ เจเฉเจคเจพ เจนเฉเฅค เจตเจฐเจคเจฟเจ GoogleCloud (dev/shm
.
เจธเจญ เจคเฉเจ เจตเฉฑเจง เจฆเจฟเจฒเจเจธเจชเฉ เจฆเจพ เจเฉเจก เจซเจฐเฉเจเจฎเฉเจเจ เจนเฉ เจเฉ เจฎเจฒเจเฉเจชเจฒ GPUs เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฒเจ เจเจผเจฟเฉฐเจฎเฉเจตเจพเจฐ เจนเฉเฅค เจชเจนเจฟเจฒเจพเจ, เจฎเจพเจกเจฒ เจจเฉเฉฐ 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
)
})
เจซเจฟเจฐ เจ เจฃเจเฉฐเจชเจพเจเจฒเจก (เจเจน เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจนเฉ) เจฎเจพเจกเจฒ เจจเฉเฉฐ เจเจชเจฒเจฌเจง GPUs เจฆเฉ เจเฉฑเจ เจฆเจฟเฉฑเจคเฉ เจเจ เจธเฉฐเจเจฟเจ เจตเจฟเฉฑเจ เจเจพเจชเฉ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ, เจ เจคเฉ เจเจธเจฆเฉ เจฌเจพเจ เจฆ เจนเฉ เจเจธเจจเฉเฉฐ เจเฉฐเจชเจพเจเจฒ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ:
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)
)
เจเจเจฐเฉ เจจเฉเฉฐ เจเฉฑเจก เจเฉ เจธเจพเจฐเฉเจเจ เจฒเฉเจ เจฐเจพเจ เจจเฉเฉฐ เจซเฉเจฐเฉเจเจผ เจเจฐเจจ, เจเจเจฐเฉ เจฒเฉเจ เจฐ เจจเฉเฉฐ เจเจฐเฉเจจเจฟเฉฐเจ เจฆเฉเจฃ, เจเจ GPUs เจฒเจ เจชเฉเจฐเฉ เจฎเจพเจกเจฒ เจจเฉเฉฐ เจ เจจเจซเฉเจฐเฉเจเจผ เจเจฐเจจ เจ เจคเฉ เจฆเฉเจฌเจพเจฐเจพ เจธเจฟเจเจฒเจพเจ เจฆเฉเจฃ เจฆเฉ เจเจฒเจพเจธเจฟเจ เจคเจเจจเฉเจ เจฒเจพเจเฉ เจจเจนเฉเจ เจเฉเจคเฉ เจเจพ เจธเจเฉเฅค
เจธเจฟเจเจฒเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจคเฉเจ เจฌเจฟเจจเจพเจ เจจเจฟเจเจฐเจพเจจเฉ เจเฉเจคเฉ เจเจ เจธเฉ. เจเฉเจเจธเจฐเจฌเฉเจฐเจก, เจเจชเจฃเฉ เจเจช เจจเฉเฉฐ เจฒเฉเจ เจฐเจฟเจเจพเจฐเจก เจเจฐเจจ เจ เจคเฉ เจนเจฐเฉเจ เจฏเฉเฉฑเจ เจคเฉเจ เจฌเจพเจ เจฆ เจเจพเจฃเจเจพเจฐเฉ เจตเจพเจฒเฉ เจจเจพเจตเจพเจ เจฆเฉ เจจเจพเจฒ เจฎเจพเจกเจฒเจพเจ เจจเฉเฉฐ เจธเฉเจฐเฉฑเจเจฟเจ เจค เจเจฐเจจ เจคเฉฑเจ เจธเฉเจฎเจค เจเจฐเจจเจพ:
เจเจพเจฒเจฌเฉเจเจธ
# ะจะฐะฑะปะพะฝ ะธะผะตะฝะธ ัะฐะนะปะฐ ะปะพะณะฐ
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. เจธเจฟเฉฑเจเฉ เจฆเฉ เจฌเจเจพเจ
เจฌเจนเฉเจค เจธเจพเจฐเฉเจเจ เจธเจฎเฉฑเจธเจฟเจเจตเจพเจ เจเจฟเจจเฉเจนเจพเจ เจฆเจพ เจ เจธเฉเจ เจธเจพเจนเจฎเจฃเจพ เจเฉเจคเจพ เจนเฉ เจ เจเฉ เจคเฉฑเจ เจฆเฉเจฐ เจจเจนเฉเจ เจนเฉเจ เจนเจจ:
- ะฒ เจเฉเจฐเจธ เจธเจฐเจตเฉเจคเจฎ เจธเจฟเฉฑเจเจฃ เจฆเฉ เจฆเจฐ (เจเจจเจพเจฒเจพเจ
lr_finder
เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉ เจตเจฟเจ เจคเฉเจเจผ.เจ.เจเจ); เจเฉเจ เจเฉเจธเจผเจฟเจธเจผเจพเจ เจจเจพเจฒ, เจคเฉเจเฉ-เจงเจฟเจฐ เจฆเฉ เจฒเจพเจเฉเจเจฐเจจ เจจเฉเฉฐ R เจจเฉเฉฐ เจชเฉเจฐเจ เจเจฐเจจเจพ เจธเฉฐเจญเจต เจนเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ,เจเจน ; - เจชเจฟเจเจฒเฉ เจฌเจฟเฉฐเจฆเฉ เจฆเฉ เจจเจคเฉเจเฉ เจตเจเฉเจ, เจเจ GPUs เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจธเจฎเฉเจ เจธเจนเฉ เจธเจฟเจเจฒเจพเจ เจฆเฉ เจเจคเฉ เจฆเฉ เจเฉเจฃ เจเจฐเจจเจพ เจธเฉฐเจญเจต เจจเจนเฉเจ เจธเฉ;
- เจเจงเฉเจจเจฟเจ เจจเจฟเจเจฐเจฒ เจจเฉเฉฑเจเจตเจฐเจ เจเจฐเจเฉเจเฉเจเจเจฐ เจฆเฉ เจเจพเจ เจนเฉ, เจเจพเจธ เจคเฉเจฐ 'เจคเฉ เจเจน เจเฉ เจเจฎเฉเจเจจเฉเฉฑเจ 'เจคเฉ เจชเจนเจฟเจฒเจพเจ เจคเฉเจ เจธเจฟเจเจฒเจพเจ เจชเฉเจฐเจพเจชเจค เจนเจจ;
- เจเฉเจ เจเฉฑเจ เจเฉฑเจเจฐ เจจเฉเจคเฉ เจ
เจคเฉ เจชเฉฑเจเจชเจพเจคเฉ เจธเจฟเฉฑเจเจฃ เจฆเฉเจเจ เจฆเจฐเจพเจ เจจเจนเฉเจ (เจเฉเจธเจพเจเจจ เจเจจเฉเจฒเจฟเฉฐเจ เจธเจพเจกเฉ เจฌเฉเจจเจคเฉ 'เจคเฉ เจธเฉ
เจฒเจพเจเฉ เจเฉเจคเจพ , เจคเฉเจนเจพเจกเจพ เจงเฉฐเจจเจตเจพเจฆเจธเจเจพเจเจกเจจ ).
เจเจธ เจฎเฉเจเจพเจฌเจฒเฉ เจคเฉเจ เจเจฟเจนเฉเฉเจเจ เจฒเจพเจญเจฆเจพเจเจ เจเฉฑเจฒเจพเจ เจธเจฟเฉฑเจเฉเจเจ เจเจเจเจ:
- เจฎเฉเจเจพเจฌเจฒเจคเจจ เจเฉฑเจ-เจชเจพเจตเจฐ เจนเจพเจฐเจกเจตเฉเจ เจฐ 'เจคเฉ, เจคเฉเจธเฉเจ เจฌเจฟเจจเจพเจ เจฆเจฐเจฆ เจฆเฉ เจกเจพเจเจพ เจฆเฉ เจตเจฟเจจเฉเจค (เจเจ เจตเจพเจฐ RAM เจฆเฉ เจเจเจพเจฐ) เจตเจพเจฒเฉเจ เจฎ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐ เจธเจเจฆเฉ เจนเฉเฅค เจชเจฒเจพเจธเจเจฟเจ เจฌเฉเจ เจกเฉเจเจพ.เจเฉเจฌเจฒ เจเฉเจฌเจฒเจพเจ เจฆเฉ เจฅเจพเจ-เจฅเจพเจ เจธเฉฐเจธเจผเฉเจงเจจ เจเจฐเจเฉ เจฎเฉเจฎเฉเจฐเฉ เจจเฉเฉฐ เจฌเจเจพเจเจเจฆเจพ เจนเฉ, เจเฉ เจเจนเจจเจพเจ เจฆเฉ เจจเจเจฒ เจเจฐเจจ เจคเฉเจ เจฌเจเจฆเจพ เจนเฉ, เจ เจคเฉ เจเจฆเฉเจ เจธเจนเฉ เจขเฉฐเจ เจจเจพเจฒ เจตเจฐเจคเจฟเจ เจเจพเจเจฆเจพ เจนเฉ, เจคเจพเจ เจเจธเจฆเฉเจเจ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ เจฒเจเจญเจ เจนเจฎเฉเจธเจผเจพเจ เจธเจญ เจคเฉเจ เจเฉฑเจเฉ เจเจคเฉ เจฆเจฐเจธเจพเจเจเจฆเฉเจเจ เจนเจจ เจเฉ เจธเจพเจจเฉเฉฐ เจธเจเฉเจฐเจฟเจชเจเจฟเฉฐเจ เจญเจพเจธเจผเจพเจตเจพเจ เจฒเจ เจเจพเจฃเฉเจเจ เจเจพเจเจฆเฉเจเจ เจนเจจเฅค เจกเฉเจเจพเจฌเฉเจธ เจตเจฟเฉฑเจ เจกเฉเจเจพ เจจเฉเฉฐ เจธเฉเจฐเฉฑเจเจฟเจ เจค เจเจฐเจจเจพ เจคเฉเจนเจพเจจเฉเฉฐ, เจฌเจนเฉเจค เจธเจพเจฐเฉ เจฎเจพเจฎเจฒเจฟเจเจ เจตเจฟเฉฑเจ, เจชเฉเจฐเฉ เจกเฉเจเจพเจธเฉเจ เจจเฉเฉฐ RAM เจตเจฟเฉฑเจ เจจเจฟเจเฉเฉเจจ เจฆเฉ เจเจผเจฐเฉเจฐเจค เจฌเจพเจฐเฉ เจฌเจฟเจฒเจเฉเจฒ เจตเฉ เจจเจนเฉเจ เจธเฉเจเจฃ เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค
- R เจตเจฟเฉฑเจ เจนเฉเจฒเฉ เจซเฉฐเจเจธเจผเจจเจพเจ เจจเฉเฉฐ เจชเฉเจเฉเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ C++ เจตเจฟเฉฑเจ เจคเฉเจเจผ เจซเฉฐเจเจธเจผเจจเจพเจ เจจเจพเจฒ เจฌเจฆเจฒเจฟเจ เจเจพ เจธเจเจฆเจพ เจนเฉ เจเจฐ.เจธเฉ.เจชเฉ.เจชเฉ. เจเฉเจเจฐ เจเจธ เจคเฉเจ เจเจฒเจพเจตเจพ เจตเจฐเจคเฉเจ เจเฉเจคเฉ เจเจพเจตเฉ RcppThread เจ เจเจฐเจธเฉเจชเฉเจชเฉเจชเฉเจฐเจฒเจฒ, เจธเจพเจจเฉเฉฐ เจเฉเจฐเจพเจธ-เจชเจฒเฉเจเจซเจพเจฐเจฎ เจฎเจฒเจเฉ-เจฅเฉเจฐเฉเจกเจก เจฒเจพเจเฉเจเจฐเจจ เจฎเจฟเจฒเจฆเจพ เจนเฉ, เจเจธเจฒเจ R เจชเฉฑเจงเจฐ 'เจคเฉ เจเฉเจก เจจเฉเฉฐ เจธเจฎเจพเจจเจพเจเจคเจฐ เจฌเจฃเจพเจเจฃ เจฆเฉ เจเฉเจ เจฒเฉเฉ เจจเจนเฉเจ เจนเฉเฅค
- เจชเฉเจเฉเจ เจเจฐ.เจธเฉ.เจชเฉ.เจชเฉ C++ เจฆเฉ เจเฉฐเจญเฉเจฐ เจเจฟเจเจจ เจคเฉเจ เจฌเจฟเจจเจพเจ เจตเจฐเจคเจฟเจ เจเจพ เจธเจเจฆเจพ เจนเฉ, เจฒเฉเฉเฉเจเจฆเฉ เจเฉฑเจเฉ-เจเฉฑเจ เจฐเฉเจชเจฐเฉเจเจพ เจฆเจฟเฉฑเจคเฉ เจเจ เจนเฉ
เจเฉฑเจฅเฉ . เจเจฟเจตเฉเจ เจเจฟ เจฌเจนเฉเจค เจธเจพเจฐเฉเจเจ เจ เฉฐเจกเฉเจเจ เจธเฉ-เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉเจเจ เจฒเจ เจนเฉเจกเจฐ เจซเจพเจเจฒเจพเจ xtensor CRAN 'เจคเฉ เจเจชเจฒเจฌเจง เจนเฉ, เจฏเจพเจจเฉ เจเจฟ, เจชเฉเจฐเฉเจเฉเจเจเจพเจ เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐเจจ เจฒเจ เจเฉฑเจ เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเจพ เจฌเจฃเจพเจเจ เจเจพ เจฐเจฟเจนเจพ เจนเฉ เจเฉ เจคเจฟเจเจฐ เจเฉเจคเฉ เจเฉฑเจ-เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจตเจพเจฒเฉ C++ เจเฉเจก เจจเฉเฉฐ R เจตเจฟเฉฑเจ เจเฉเฉเจฆเฉ เจนเจจเฅค เจตเจพเจงเฉ เจธเจนเฉเจฒเจค RStudio เจตเจฟเฉฑเจ เจธเจฟเฉฐเจเฉเจเจธ เจนเจพเจเจฒเจพเจเจเจฟเฉฐเจ เจ เจคเฉ เจเฉฑเจ เจธเจฅเจฟเจฐ C++ เจเฉเจก เจเจจเจพเจฒเจพเจเจเจผเจฐ เจนเฉเฅค - docopt เจคเฉเจนเจพเจจเฉเฉฐ เจชเฉเจฐเจพเจฎเฉเจเจฐเจพเจ เจจเจพเจฒ เจธเจตเฉ-เจจเจฟเจฐเจญเจฐ เจธเจเฉเจฐเจฟเจชเจเจพเจ เจเจฒเจพเจเจฃ เจฆเฉ เจเจเจฟเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค เจเจน เจฐเจฟเจฎเฉเจ เจธเจฐเจตเจฐ 'เจคเฉ เจตเจฐเจคเจฃ เจฒเจ เจธเฉเจตเจฟเจงเจพเจเจจเจ เจนเฉ, เจธเจฎเฉเจคเฅค เจกเฉเจเจฐ เจฆเฉ เจ เจงเฉเจจ. RStudio เจตเจฟเฉฑเจ, เจธเจฟเจเจฒเจพเจ เจจเจฟเจเจฐเจฒ เจจเฉเฉฑเจเจตเจฐเจเจพเจ เจฆเฉ เจจเจพเจฒ เจเจ เจเฉฐเจเฉ เจชเฉเจฐเจฏเฉเจ เจเจฐเจจเจพ เจ เจธเฉเจตเจฟเจงเจพเจเจจเจ เจนเฉ, เจ เจคเฉ เจธเจฐเจตเจฐ 'เจคเฉ IDE เจจเฉเฉฐ เจธเจฅเจพเจชเจฟเจค เจเจฐเจจเจพ เจนเจฎเฉเจธเจผเจพ เจเจพเจเจเจผ เจจเจนเฉเจ เจนเฉเฉฐเจฆเจพ เจนเฉเฅค
- เจกเฉเจเจฐ เจเฉเจก เจชเฉเจฐเจเฉเจฌเจฟเจฒเจเฉ เจ เจคเฉ OS เจ เจคเฉ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉเจเจ เจฆเฉ เจตเฉฑเจ-เจตเฉฑเจ เจธเฉฐเจธเจเจฐเจฃเจพเจ เจตเจพเจฒเฉ เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจตเจฟเจเจเจพเจฐ เจจเจคเฉเจเจฟเจเจ เจฆเฉ เจชเฉเจจเจฐ-เจเจคเจชเจพเจฆเจจเจฏเฉเจเจคเจพ เจฆเฉ เจจเจพเจฒ เจจเจพเจฒ เจธเจฐเจตเจฐเจพเจ 'เจคเฉ เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ เจฆเฉ เจธเฉเจ เจจเฉเฉฐ เจฏเจเฉเจจเฉ เจฌเจฃเจพเจเจเจฆเจพ เจนเฉเฅค เจคเฉเจธเฉเจ เจธเจฟเจฐเจซเจผ เจเฉฑเจ เจเจฎเจพเจเจก เจจเจพเจฒ เจชเฉเจฐเฉ เจธเจฟเจเจฒเจพเจ เจชเจพเจเจชเจฒเจพเจเจจ เจฒเจพเจเจ เจเจฐ เจธเจเจฆเฉ เจนเฉเฅค
- เจเฉเจเจฒ เจเจฒเจพเจเจก เจฎเจนเจฟเฉฐเจเฉ เจนเจพเจฐเจกเจตเฉเจ เจฐ 'เจคเฉ เจชเฉเจฐเจฏเฉเจ เจเจฐเจจ เจฆเจพ เจเฉฑเจ เจฌเจเจ-เจ เจจเฉเจเฉเจฒ เจคเจฐเฉเจเจพ เจนเฉ, เจชเจฐ เจคเฉเจนเจพเจจเฉเฉฐ เจธเฉฐเจฐเจเจจเจพเจตเจพเจ เจจเฉเฉฐ เจงเจฟเจเจจ เจจเจพเจฒ เจเฉเจฃเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค
- เจตเจฟเจ เจเจคเฉเจเจค เจเฉเจก เจฆเฉ เจเฉเจเฉเจฟเจเจ เจฆเฉ เจเจคเฉ เจจเฉเฉฐ เจฎเจพเจชเจฃเจพ เจฌเจนเฉเจค เจฒเจพเจญเจฆเจพเจเจ เจนเฉ, เจเจพเจธ เจเจฐเจเฉ เจเจฆเฉเจ R เจ เจคเฉ C++ เจจเฉเฉฐ เจเฉเฉเจฆเฉ เจนเฉเจ, เจ เจคเฉ เจชเฉเจเฉเจ เจฆเฉ เจจเจพเจฒ เจฌเฉเจเจ - เจเจน เจตเฉ เจฌเจนเฉเจค เจเจธเจพเจจ.
เจเฉเฉฑเจฒ เจฎเจฟเจฒเจพ เจเฉ เจเจน เจคเจเจฐเจฌเจพ เจฌเจนเฉเจค เจฒเจพเจญเจฆเจพเจเจ เจธเฉ เจ เจคเฉ เจ เจธเฉเจ เจเจ เจพเจ เจเจ เจเฉเจ เจฎเฉเฉฑเจฆเจฟเจเจ เจจเฉเฉฐ เจนเฉฑเจฒ เจเจฐเจจ เจฒเจ เจเฉฐเจฎ เจเจฐเจจเจพ เจเจพเจฐเฉ เจฐเฉฑเจเจฆเฉ เจนเจพเจเฅค
เจธเจฐเฉเจค: www.habr.com