Rで解析:tidymodelsの枠組みでKerasモデルを構築できる「kerasnip」パッケージの紹介
「kerasnip」パッケージは、Kerasで組んだニューラルネットワークを、tidymodelsの枠組みに載せて扱えるようにする橋渡し役です。層のまとまりを表すブロックをいくつか定義して登録すると、ブロックの数やユニット数などを調整できるparsnipのモデル仕様が作られ、workflowsやtuneのパイプラインにそのまま組み込めます。渡すのは説明変数のデータフレームや行列と、回帰なら数値、分類なら因子の目的変数です。動作にはkeras3と、その背後で動くPython・TensorFlowの実行環境が必要です。ニューラルネットのハイパーパラメータ探索をtidymodelsの作法で回したい人に向いているのではないかと考えます。
パッケージバージョンは0.2.0。Windows 11 x64 (build 26200)のR version 4.6.1で確認しています。
<おすすめのRに関する書籍です>
パッケージのインストール
下記コマンドを実行してください。
# パッケージのインストール
install.packages("kerasnip")
# パッケージの読み込み
library("kerasnip")kerasnipはkeras3を通じてKerasを呼び出します。keras3は初回のみ、keras3::install_keras()でPythonとTensorFlowの実行環境を用意しておく必要があります。
コマンド例
詳細はコメント、パッケージのヘルプを確認してください。
tidymodelsは、前処理・モデル・評価を共通の作法でつなぐパッケージ群です。その中でparsnipは、線形回帰やランダムフォレストといった手法ごとの書き方の違いを吸収し、同じ形でモデルを指定できるようにします。kerasnipは、このparsnipの仕組みにKerasのニューラルネットワークを加えるものです。
kerasnipではモデルの構造をレイヤーブロックという単位で組み立てます。各ブロックはKerasの層を1つ以上まとめたコマンドで、その中で既定値を付けたオプションが、あとで調整できるハイパーパラメータになります。ブロックを登録すると、指定した名前のモデル仕様コマンドが新しく作られ、parsnipのモデルと同じようにエンジンの指定や学習へ渡せます。
組み立て方は2通りあります。層を上から順に積むだけならSequential API、分岐や合流を含むグラフならFunctional APIを使います。前者はブロックがKerasモデルを受け取って返す形、後者はブロックがテンソルを受け取って返す形で書きます。以降の例では、京都の直売所に持ち込まれた京野菜の計測記録という想定の擬似データを共通して使います。値はすべて説明のために生成した架空のものです。
# コマンド例で共通して使うパッケージの読み込み
library("keras3")
library("parsnip")
Attaching package: 'parsnip'
The following object is masked from 'package:kerasnip':
get_model_env
# 以降の例で共通して使う擬似データを作成
set.seed(20260910)
# 出荷1件あたり6つの計測値(重さ・長さ・直径・糖度・水分・出荷までの日数)
yasai_x <- matrix(rnorm(200 * 6), ncol = 6)
# 等級(秀・優・良)の3クラス。分類の例で使う
yasai_class <- factor(sample(c("秀", "優", "良"), 200, replace = TRUE))
# 1畝あたりの収穫量(kg)。回帰の例で使う
yasai_yield <- 45 + yasai_x[, 4] * 3 + rnorm(200, sd = 5)
<おすすめのRに関する書籍です>
Keras Sequentialモデルの仕様作成:create_keras_sequential_specコマンド
層を上から順に積むモデルの仕様コマンドを新しく登録します。layer_blocksには、Kerasモデルを受け取って層を足して返すブロックを、積む順に名前付きリストで渡します。各ブロックのオプションは調整できるハイパーパラメータになり、ブロック名を頭に付けた名前(例:zenketsugo_units)と、繰り返し数を表すnum_ブロック名が自動で作られます。
| オプション | 意味 | 初期値 |
|---|---|---|
| model_name | 生成するモデル仕様コマンドの名前。Rのコマンド名として有効な文字列にする | なし |
| layer_blocks | Kerasの層のまとまりを定義するコマンドの名前付きリスト。並び順どおりに積み上げられ、各コマンドの最初のオプションはKerasモデル、残りは調整対象のオプションになる | なし |
| mode | “regression”(回帰)または “classification”(分類)のいずれかの文字列 | c(“regression”, “classification”) |
| … | 将来の拡張用。現在は使わない | なし |
| env | 生成するモデル仕様コマンドとそのupdateメソッドを定義する環境。既定は呼び出し元の環境 | parent.frame() |
# 分類用のモデル仕様コマンドを新しく登録する
# 最初のブロック。入力の形 input_shape は自動で渡される
nyuryoku_block <- function(model, input_shape) {
keras_model_sequential(input_shape = input_shape)
}
# 全結合層のブロック。units は調整できるオプションになる
zenketsugo_block <- function(model, units = 32) {
model |> layer_dense(units = units, activation = "relu")
}
# 過学習を抑えるドロップアウトのブロック。rate も調整できる
dropout_block <- function(model, rate = 0.2) {
model |> layer_dropout(rate = rate)
}
# 出力層のブロック。クラス数 num_classes は自動で渡される
shutsuryoku_block <- function(model, num_classes) {
model |> layer_dense(units = num_classes, activation = "softmax")
}
# ブロックを順に並べて仕様コマンド kyoyasai_mlp を作る
create_keras_sequential_spec(
model_name = "kyoyasai_mlp",
layer_blocks = list(
nyuryoku = nyuryoku_block,
zenketsugo = zenketsugo_block,
dropout = dropout_block,
shutsuryoku = shutsuryoku_block
),
mode = "classification")
# 生成された仕様コマンドを呼ぶ
# num_zenketsugo は全結合ブロックの繰り返し数、zenketsugo_units はユニット数
kyoyasai_spec <- kyoyasai_mlp(
num_zenketsugo = 2,
zenketsugo_units = 48,
dropout_rate = 0.3,
fit_epochs = 20
)
# 仕様の内容を表示
print(kyoyasai_spec)
kyoyasai mlp Model Specification (classification)
Main Arguments:
num_nyuryoku = structure(list(), class = "rlang_zap")
num_zenketsugo = 2
num_dropout = structure(list(), class = "rlang_zap")
num_shutsuryoku = structure(list(), class = "rlang_zap")
zenketsugo_units = 48
dropout_rate = 0.3
learn_rate = structure(list(), class = "rlang_zap")
fit_batch_size = structure(list(), class = "rlang_zap")
fit_epochs = 20
fit_callbacks = structure(list(), class = "rlang_zap")
fit_validation_split = structure(list(), class = "rlang_zap")
fit_validation_data = structure(list(), class = "rlang_zap")
fit_shuffle = structure(list(), class = "rlang_zap")
fit_class_weight = structure(list(), class = "rlang_zap")
fit_sample_weight = structure(list(), class = "rlang_zap")
fit_initial_epoch = structure(list(), class = "rlang_zap")
fit_steps_per_epoch = structure(list(), class = "rlang_zap")
fit_validation_steps = structure(list(), class = "rlang_zap")
fit_validation_batch_size = structure(list(), class = "rlang_zap")
fit_validation_freq = structure(list(), class = "rlang_zap")
fit_verbose = structure(list(), class = "rlang_zap")
fit_view_metrics = structure(list(), class = "rlang_zap")
compile_optimizer = structure(list(), class = "rlang_zap")
compile_loss = structure(list(), class = "rlang_zap")
compile_metrics = structure(list(), class = "rlang_zap")
compile_loss_weights = structure(list(), class = "rlang_zap")
compile_weighted_metrics = structure(list(), class = "rlang_zap")
### 出力は省略(残り4行)
# 登録した仕様を削除して後片付け
remove_keras_spec("kyoyasai_mlp")
Removed from parsnip registry objects: kyoyasai_mlp, kyoyasai_mlp_args, kyoyasai_mlp_encoding, kyoyasai_mlp_fit, kyoyasai_mlp_modes, kyoyasai_mlp_pkgs, kyoyasai_mlp_predict
Removed 'kyoyasai_mlp' from parsnip:::get_model_env()$modelsKerasモデル仕様の作成:create_keras_functional_specコマンド
分岐や合流を含むグラフ構造のモデルを、Functional APIで組み立てる仕様コマンドを登録します。layer_blocksのリスト名がグラフのノード名になり、各ブロックのオプション名が「どのノードの出力を受け取るか」を表します。出力にあたるブロックは必ずoutputという名前にします。ブロックの調整用オプションは、Sequentialと同じくブロック名を頭に付けた名前で自動生成されます。
| オプション | 意味 | 初期値 |
|---|---|---|
| model_name | 生成するモデル仕様コマンドの名前。Rのコマンド名として有効な文字列にする | なし |
| layer_blocks | モデルのグラフを組み立てるコマンドの名前付きリスト。リスト名が各ノードの名前になり、各コマンドのオプション名が接続元のノードを指す | なし |
| mode | “regression”(回帰)または “classification”(分類)のいずれかの文字列 | c(“regression”, “classification”) |
| … | 将来の拡張用。現在は使わない | なし |
| env | 生成するモデル仕様コマンドとそのupdateメソッドを定義する環境。既定は呼び出し元の環境 | parent.frame() |
# 回帰用に、2つの経路を合流させる仕様コマンドを作る
# 入力ブロック。入力の形を受け取る
f_input <- function(input_shape) layer_input(shape = input_shape)
# 全結合ブロック
f_dense <- function(tensor, units) {
tensor |> layer_dense(units = units, activation = "relu")
}
# 2つのテンソルを連結するブロック
f_concat <- function(a, b) layer_concatenate(list(a, b))
# 回帰用の出力ブロック(ユニット数1)
f_output <- function(tensor) layer_dense(tensor, units = 1)
# layer_blocks でグラフの形を決める
# リスト名がノード名になり、各コマンドのオプション名が接続元のノードを指す
create_keras_functional_spec(
model_name = "ujicha_net",
layer_blocks = list(
main_input = f_input,
wide_path = function(main_input, units = 16) f_dense(main_input, units),
deep_path = function(main_input, units = 64) f_dense(main_input, units),
merged = function(wide_path, deep_path) f_concat(wide_path, deep_path),
# 出力ブロックは必ず 'output' という名前にする
output = function(merged) f_output(merged)
),
mode = "regression"
)
# 生成された仕様コマンドを使う
# wide_path_units と deep_path_units が自動で作られている
ujicha_spec <- ujicha_net(
wide_path_units = 8,
deep_path_units = 32,
fit_epochs = 30
)
# 仕様の内容を表示
print(ujicha_spec)
ujicha net Model Specification (regression)
Main Arguments:
num_main_input = structure(list(), class = "rlang_zap")
num_wide_path = structure(list(), class = "rlang_zap")
num_deep_path = structure(list(), class = "rlang_zap")
num_merged = structure(list(), class = "rlang_zap")
num_output = structure(list(), class = "rlang_zap")
wide_path_units = 8
deep_path_units = 32
learn_rate = structure(list(), class = "rlang_zap")
fit_batch_size = structure(list(), class = "rlang_zap")
fit_epochs = 30
fit_callbacks = structure(list(), class = "rlang_zap")
fit_validation_split = structure(list(), class = "rlang_zap")
fit_validation_data = structure(list(), class = "rlang_zap")
fit_shuffle = structure(list(), class = "rlang_zap")
fit_class_weight = structure(list(), class = "rlang_zap")
fit_sample_weight = structure(list(), class = "rlang_zap")
fit_initial_epoch = structure(list(), class = "rlang_zap")
fit_steps_per_epoch = structure(list(), class = "rlang_zap")
fit_validation_steps = structure(list(), class = "rlang_zap")
fit_validation_batch_size = structure(list(), class = "rlang_zap")
fit_validation_freq = structure(list(), class = "rlang_zap")
fit_verbose = structure(list(), class = "rlang_zap")
fit_view_metrics = structure(list(), class = "rlang_zap")
compile_optimizer = structure(list(), class = "rlang_zap")
compile_loss = structure(list(), class = "rlang_zap")
compile_metrics = structure(list(), class = "rlang_zap")
compile_loss_weights = structure(list(), class = "rlang_zap")
### 出力は省略(残り5行)
# 登録した仕様を削除
remove_keras_spec("ujicha_net")
Removed from parsnip registry objects: ujicha_net, ujicha_net_args, ujicha_net_encoding, ujicha_net_fit, ujicha_net_modes, ujicha_net_pkgs, ujicha_net_predict
Removed 'ujicha_net' from parsnip:::get_model_env()$models層ブロックのオプション名を付け替える:inp_specコマンド
Functional APIのlayer_blocksを、無名関数を書かずに組み立てるための補助コマンドです。再利用したいブロックをそのまま渡し、input_mapで接続元のノード名を指定します。文字列を1つ渡すとブロックの先頭オプションがそのノード名に付け替わり、名前付きベクトルを渡すとオプション名ごとに接続元のノードを割り当てます。
| オプション | 意味 | 初期値 |
|---|---|---|
| block | Kerasの層または層のまとまりを定義するコマンド。先頭のオプションが入力テンソルにあたる | なし |
| input_map | blockのオプション名をどう付け替えるかを指定する、1つの文字列または名前付き文字ベクトル | なし |
# 無名関数を書かずにブロックをつなぐ
# 再利用するブロックを普通のコマンドとして定義しておく
dense_block <- function(tensor, units = 16) {
tensor |> layer_dense(units = units, activation = "relu")
}
# 2つのテンソルを連結するブロック
concat_block <- function(hidari, migi) {
layer_concatenate(list(hidari, migi))
}
# 1つの入力を受け取る出力ブロック
output_block <- function(tensor) layer_dense(tensor, units = 1)
# inp_spec でブロックのオプション名を接続元のノード名に付け替える
# 文字列1つ: block の先頭オプションをそのノード名にする
# 名前付きベクトル: block のオプション名ごとに接続元のノードを割り当てる
layer_blocks <- list(
main_input = layer_input,
path_a = inp_spec(dense_block, "main_input"),
path_b = inp_spec(dense_block, "main_input"),
merged = inp_spec(concat_block, c(hidari = "path_a", migi = "path_b")),
output = inp_spec(output_block, "merged")
)
# 出来上がったリストは create_keras_functional_spec の layer_blocks に渡せる
str(layer_blocks, max.level = 1)
List of 5
$ main_input:function (shape = NULL, batch_size = NULL, dtype = NULL, sparse = NULL,
ragged = NULL, batch_shape = NULL, name = NULL, tensor = NULL, optional = FALSE)
$ path_a :function (main_input, units = 16)
$ path_b :function (main_input, units = 16)
$ merged :function (path_a, path_b)
$ output :function (merged)ハイパーパラメータ格子に対するモデルのコンパイル:compile_keras_gridコマンド
ハイパーパラメータの組み合わせを表にまとめ、その各行についてモデルを組み立ててコンパイルまで進めるコマンドです。学習は行わず、指定した構成が成り立つかどうかを先に確かめられます。結果は組み合わせごとにコンパイル済みモデルとエラー内容を並べた表で返ります。xとyは入力と出力の形を推定するために使います。
| オプション | 意味 | 初期値 |
|---|---|---|
| spec | create_keras_sequential_spec または create_keras_functional_spec で作ったモデル仕様 | なし |
| grid | 評価するハイパーパラメータの組み合わせを収めたtibbleまたはデータフレーム。1行が1つのモデル構成に対応し、最低1行必要 | なし |
| x | 説明変数のデータフレームまたは行列。入力の形の推定に使う | なし |
| y | 目的変数のベクトルまたは因子。出力の形と既定の損失関数の推定に使う | なし |
# 学習せずに、格子の各行でモデルが組み立てられるか確かめる
# 前の例と同じ形のブロックを用意
g_input <- function(model, input_shape) {
keras_model_sequential(input_shape = input_shape)
}
g_dense <- function(model, units = 32) {
model |> layer_dense(units = units, activation = "relu")
}
g_output <- function(model, num_classes) {
model |> layer_dense(units = num_classes, activation = "softmax")
}
# 仕様コマンド kamo_grid を登録
create_keras_sequential_spec(
model_name = "kamo_grid",
layer_blocks = list(
nyuryoku = g_input,
zenketsugo = g_dense,
shutsuryoku = g_output
),
mode = "classification"
)
# ユニット数を tune() にして、あとで値を差し込めるようにする
kamo_spec <- kamo_grid(
zenketsugo_units = tune(),
compile_loss = "categorical_crossentropy",
compile_optimizer = "adam"
)
# 試したいユニット数の組み合わせ
param_grid <- tibble::tibble(zenketsugo_units = c(16, 32, 64))
# 格子の各行についてモデルを組み立て、成否を表にまとめる
compiled_grid <- compile_keras_grid(
spec = kamo_spec,
grid = param_grid,
x = yasai_x,
y = yasai_class
)
# 結果の表示
print(compiled_grid)
# A tibble: 3 × 3
zenketsugo_units compiled_model error
<dbl> <list> <chr>
1 16 <keras.src.models.sequential.Sequential> <NA>
2 32 <keras.src.models.sequential.Sequential> <NA>
3 64 <keras.src.models.sequential.Sequential> <NA>
# 登録した仕様を削除
remove_keras_spec("kamo_grid")
Removed from parsnip registry objects: kamo_grid, kamo_grid_args, kamo_grid_encoding, kamo_grid_fit, kamo_grid_modes, kamo_grid_pkgs, kamo_grid_predict
Removed 'kamo_grid' from parsnip:::get_model_env()$models
<おすすめのRに関する書籍です>
Functional APIモデルの内部学習エンジン:generic_functional_fitコマンド
Functional APIで作った仕様を学習させるときに、内部で呼ばれる学習エンジンです。利用者が直接呼ぶことはなく、set_engine(“keras”)を指定した仕様をfitに渡すと、parsnipがこのコマンドへ説明変数・目的変数・layer_blocks・各種オプションを引き渡します。fit_で始まるオプションはKerasの学習設定へ、compile_で始まるオプションはコンパイル設定へ回されます。
| オプション | 意味 | 初期値 |
|---|---|---|
| x | parsnipのデータフレーム学習インターフェースから渡される説明変数。目的変数は分離済み | なし |
| y | parsnipから渡される目的変数のベクトルまたはデータフレーム | なし |
| layer_blocks | 層のまとまりを定義するコマンドの名前付きリスト。モデル仕様から内部で渡される | なし |
| … | モデル仕様から渡される追加のオプション。層のオプション(ブロック名を頭に付ける)、繰り返し数のnum_ブロック名、コンパイル用のcompile_、学習用のfit_などを含む | なし |
# functional 仕様を学習させると、内部でこのコマンドが学習を担当する
# 回帰用のブロックを用意
h_input <- function(input_shape) layer_input(shape = input_shape)
h_dense <- function(tensor, units = 16) {
tensor |> layer_dense(units = units, activation = "relu")
}
h_output <- function(tensor) layer_dense(tensor, units = 1)
# 仕様コマンド tanba_fnet を登録
create_keras_functional_spec(
model_name = "tanba_fnet",
layer_blocks = list(
main_input = h_input,
hidden = function(main_input, units = 16) h_dense(main_input, units),
output = function(hidden) h_output(hidden)
),
mode = "regression"
)
# エンジンに "keras" を指定する。学習時に generic_functional_fit が呼ばれる
tanba_spec <- tanba_fnet(hidden_units = 24, fit_epochs = 10) |>
set_engine("keras")
# 収穫量を予測する学習用データフレーム(説明変数は行列のまま列に入れる)
tanba_df <- data.frame(x = I(yasai_x), y = yasai_yield)
# fit() 経由で学習。内部では generic_functional_fit にオプションが渡る
fitted_fnet <- fit(tanba_spec, y ~ x, data = tanba_df)
# 学習済みモデルの表示
print(fitted_fnet)
parsnip model object
$fit
Model: "functional_6"
┌───────────────────────────────────┬──────────────────────────┬───────────────
│ Layer (type) │ Output Shape │ Param #
├───────────────────────────────────┼──────────────────────────┼───────────────
│ input_layer_3 (InputLayer) │ (None, 6) │ 0
├───────────────────────────────────┼──────────────────────────┼───────────────
│ dense_6 (Dense) │ (None, 24) │ 168
├───────────────────────────────────┼──────────────────────────┼───────────────
│ dense_7 (Dense) │ (None, 1) │ 25
└───────────────────────────────────┴──────────────────────────┴───────────────
Total params: 581 (2.27 KB)
Trainable params: 193 (772.00 B)
Non-trainable params: 0 (0.00 B)
Optimizer params: 388 (1.52 KB)
$keras_bytes
[1] 50 4b 03 04 14 00 00 00 00 00 00 00 21 00 7f ac 0c 81 40 00 00 00 40 00
[25] 00 00 0d 00 00 00 6d 65 74 61 64 61 74 61 2e 6a 73 6f 6e 7b 22 6b 65 72
[49] 61 73 5f 76 65 72 73 69 6f 6e 22 3a 20 22 33 2e 31 35 2e 31 22 2c 20 22
[73] 64 61 74 65 5f 73 61 76 65 64 22 3a 20 22 32 30 32 36 2d 30 39 2d 31 32
[97] 40 32 30 3a 35 36 3a 33 31 22 7d 50 4b 03 04 14 00 00 00 00 00 00 00 21
[121] 00 f0 73 86 f8 66 0d 00 00 66 0d 00 00 0b 00 00 00 63 6f 6e 66 69 67 2e
[145] 6a 73 6f 6e 7b 22 6d 6f 64 75 6c 65 22 3a 20 22 6b 65 72 61 73 2e 73 72
[169] 63 2e 6d 6f 64 65 6c 73 2e 66 75 6e 63 74 69 6f 6e 61 6c 22 2c 20 22 63
[193] 6c 61 73 73 5f 6e 61 6d 65 22 3a 20 22 46 75 6e 63 74 69 6f 6e 61 6c 22
[217] 2c 20 22 63 6f 6e 66 69 67 22 3a 20 7b 22 6e 61 6d 65 22 3a 20 22 66 75
[241] 6e 63 74 69 6f 6e 61 6c 5f 36 22 2c 20 22 74 72 61 69 6e 61 62 6c 65 22
### 出力は省略(残り1963行)
# 登録した仕様を削除
remove_keras_spec("tanba_fnet")
Removed from parsnip registry objects: tanba_fnet, tanba_fnet_args, tanba_fnet_encoding, tanba_fnet_fit, tanba_fnet_modes, tanba_fnet_pkgs, tanba_fnet_predict
Removed 'tanba_fnet' from parsnip:::get_model_env()$modelsKerasモデルの評価:keras_evaluateコマンド
学習済みのkerasnipモデルを新しいデータで評価し、損失と評価指標を返すコマンドです。あわせて、extract_keras_modelで中のKerasモデルオブジェクトを、extract_keras_historyで学習中の損失や指標の推移を取り出せます。学習履歴はplotでそのままプロットできます。
| オプション | 意味 | 初期値 |
|---|---|---|
| object | kerasnipの仕様から作った学習済みモデル(model_fitオブジェクト) | なし |
| x | 評価に使う新しい説明変数のデータフレームまたは行列 | なし |
| y | xに対応する新しい目的変数のベクトルまたはデータフレーム | NULL |
| … | keras3::evaluate() に渡す追加のオプション(batch_size など) | なし |
# 学習済みモデルを新しいデータで評価し、中身を取り出す
# 分類用のブロックを用意
e_input <- function(model, input_shape) {
keras_model_sequential(input_shape = input_shape)
}
e_dense <- function(model, units = 32) {
model |> layer_dense(units = units, activation = "relu")
}
e_output <- function(model, num_classes) {
model |> layer_dense(units = num_classes, activation = "softmax")
}
# 仕様コマンド kyoyasai_eval を登録
create_keras_sequential_spec(
model_name = "kyoyasai_eval",
layer_blocks = list(
nyuryoku = e_input,
zenketsugo = e_dense,
shutsuryoku = e_output
),
mode = "classification"
)
# 学習用と評価用にデータを分ける
set.seed(45)
idx <- sample(nrow(yasai_x), 150)
# 学習用データフレーム
train_df <- data.frame(x = I(yasai_x[idx, ]), y = yasai_class[idx])
# 評価用データフレーム
test_df <- data.frame(x = I(yasai_x[-idx, ]), y = yasai_class[-idx])
# エンジンを指定して学習
eval_spec <- kyoyasai_eval(
zenketsugo_units = 32,
compile_metrics = "accuracy",
fit_epochs = 5
) |>
set_engine("keras")
fitted_eval <- fit(eval_spec, y ~ x, data = train_df)
# 評価用データで損失と評価指標を計算
eval_metrics <- keras_evaluate(fitted_eval, test_df$x, test_df$y)
# 評価結果の表示
print(eval_metrics)
$accuracy
[1] 0.42
$loss
[1] 1.228537
# 学習済みモデルから Keras モデルオブジェクトを取り出す
keras_model <- extract_keras_model(fitted_eval)
# モデルの層構成の表示
summary(keras_model)
Model: "sequential_3"
┌───────────────────────────────────┬──────────────────────────┬───────────────
│ Layer (type) │ Output Shape │ Param #
├───────────────────────────────────┼──────────────────────────┼───────────────
│ dense_8 (Dense) │ (None, 32) │ 224
├───────────────────────────────────┼──────────────────────────┼───────────────
│ dense_9 (Dense) │ (None, 3) │ 99
└───────────────────────────────────┴──────────────────────────┴───────────────
Total params: 971 (3.80 KB)
Trainable params: 323 (1.26 KB)
Non-trainable params: 0 (0.00 B)
Optimizer params: 648 (2.54 KB)
# 学習履歴(損失や指標の推移)を取り出す
history <- extract_keras_history(fitted_eval)
# 学習履歴のプロット
plot(history)
# 登録した仕様を削除
remove_keras_spec("kyoyasai_eval")
Removed from parsnip registry objects: kyoyasai_eval, kyoyasai_eval_args, kyoyasai_eval_encoding, kyoyasai_eval_fit, kyoyasai_eval_modes, kyoyasai_eval_pkgs, kyoyasai_eval_predict
Removed 'kyoyasai_eval' from parsnip:::get_model_env()$models学習履歴のプロット

モデル仕様の存在確認:model_existsコマンド
指定した名前のモデル仕様がparsnipに登録済みかどうかを、TRUE / FALSEで返すコマンドです。kerasnipで登録した仕様名だけでなく、parsnipに元からあるモデル名(”mlp”など)についても確認できます。remove_keras_specで削除したあとの後片付けの確認にも使えます。
| オプション | 意味 | 初期値 |
|---|---|---|
| model_name | 存在を確認するモデル仕様コマンドの名前(”my_mlp” など) | なし |
# モデル仕様コマンドが登録済みかを確かめる
# parsnip に元からあるモデルの確認
model_exists("mlp")
[1] TRUE
# 登録していない名前の確認
model_exists("kyoto_yasai_net")
[1] FALSEモデル環境の取得:get_model_envコマンド
parsnipがモデル定義を保持している環境を取り出すコマンドです。kerasnipはこの環境に仕様を登録し、model_existsもここを見ています。lsで中身を一覧すると、parsnipの組み込みモデルと自分で登録した仕様の名前を確認できます。
# parsnip がモデル定義を保持している環境を取り出す
model_env <- get_model_env()
# 登録済みのモデル名のうち先頭をいくつか確認
head(ls(model_env))
[1] "auto_ml" "auto_ml_args" "auto_ml_fit" "auto_ml_modes"
[5] "auto_ml_pkgs" "auto_ml_predict"
この記事が誰かの役に立ちますように。