Keras 2 : examples : Involutional ニューラルネットワーク (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/24/2021 (keras 2.7.0)
* 本ページは、Keras の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
- Code examples : Computer Vision : Involutional neural networks (Author: Aritra Roy Gosthipaty)
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- テレワーク & オンライン授業を支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
- ウェビナー運用には弊社製品「ClassCat® Webinar」を利用しています。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- E-Mail:sales-info@classcat.com ; WebSite: www.classcat.com ; Facebook
Keras 2 : examples : Involutional ニューラルネットワーク
Description: 位置固有 (= location-specific) でチャネル不可知 (= channel-agnostic) な “involution” カーネルの考察。
イントロダクション
畳み込みはコンピュータビジョンのための最も現代的なニューラルネットワークの基礎となっています。畳み込みカーネルは空間不可知でチャネル固有です。そのため、異なる空間的位置に関して異なる視覚パターンに適応できません。位置関連問題とともに、畳み込みの受容野は long-range な空間的相互作用を捉えることに関して課題を残します。
上の問題に対処するために、Li et. al. は Involution: Inverting the Inherence of Convolution for VisualRecognition で畳み込みの特性を再考しています。著者は「involution カーネル」を提案しました、これは位置固有でチャネル不可知です。演算の位置固有の特性ゆえに、著者は自己注意は involution のデザインパラダイムには該当するとしています。
このサンプルでは involution カーネルを説明し、畳み込みを使用するものと他方は involution を使用する 2 つの画像分類モデルを比較し、そしてまた自己注意層との比較も試みます。
セットアップ
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
# Set seed for reproducibility.
tf.random.set_seed(42)
畳み込み
畳み込みはコンピュータビジョン用の深層ニューラルネットワークの中心的存在であり続けています。Involution を理解するには、畳み込み演算について話す必要があります。
次元 H, W と C_in を持つ入力テンソル X を考えます。各々が shape K, K, C_in である、C_out 畳み込みカーネルのコレクションを取ります。入力テンソルとカーネル間の乗算-加算演算により、次元 H, W, C_out を持つ出力テンソル Y を得ます。
上の図では C_out = 3 です。これは shape H, W と 3 の出力テンソルを作成します。畳み込みカーネルは入力テンソルの空間的位置には依存しないことがわかるでしょう、これはそれを位置不可知 (= location-agnostic) にします。その一方で、出力テンソルの各チャネルは特定の畳み込みフィルタに基づいていて、チャネル固有 (= channel-specific) になっています。
Involution
アイデアは位置固有 (= location-specific) でチャネル不可知な (= channel-agnostic) 演算を持つことです。これらの特定の特質を実装しようとすると課題が生じます。(各空間的位置に対して) 固定数の involution カーネルでは可変解像度の入力テンソルを処理できません。
この問題を解くために、著者は特定の空間位置に条件付けられた各カーネルを生成することを考えました。この方法で、可変解像度の入力テンソルを容易に処理することができるはずです。下図はこのカーネル生成方法についての直感を提供します。
class Involution(keras.layers.Layer):
def __init__(
self, channel, group_number, kernel_size, stride, reduction_ratio, name
):
super().__init__(name=name)
# Initialize the parameters.
self.channel = channel
self.group_number = group_number
self.kernel_size = kernel_size
self.stride = stride
self.reduction_ratio = reduction_ratio
def build(self, input_shape):
# Get the shape of the input.
(_, height, width, num_channels) = input_shape
# Scale the height and width with respect to the strides.
height = height // self.stride
width = width // self.stride
# Define a layer that average pools the input tensor
# if stride is more than 1.
self.stride_layer = (
keras.layers.AveragePooling2D(
pool_size=self.stride, strides=self.stride, padding="same"
)
if self.stride > 1
else tf.identity
)
# Define the kernel generation layer.
self.kernel_gen = keras.Sequential(
[
keras.layers.Conv2D(
filters=self.channel // self.reduction_ratio, kernel_size=1
),
keras.layers.BatchNormalization(),
keras.layers.ReLU(),
keras.layers.Conv2D(
filters=self.kernel_size * self.kernel_size * self.group_number,
kernel_size=1,
),
]
)
# Define reshape layers
self.kernel_reshape = keras.layers.Reshape(
target_shape=(
height,
width,
self.kernel_size * self.kernel_size,
1,
self.group_number,
)
)
self.input_patches_reshape = keras.layers.Reshape(
target_shape=(
height,
width,
self.kernel_size * self.kernel_size,
num_channels // self.group_number,
self.group_number,
)
)
self.output_reshape = keras.layers.Reshape(
target_shape=(height, width, num_channels)
)
def call(self, x):
# Generate the kernel with respect to the input tensor.
# B, H, W, K*K*G
kernel_input = self.stride_layer(x)
kernel = self.kernel_gen(kernel_input)
# reshape the kerenl
# B, H, W, K*K, 1, G
kernel = self.kernel_reshape(kernel)
# Extract input patches.
# B, H, W, K*K*C
input_patches = tf.image.extract_patches(
images=x,
sizes=[1, self.kernel_size, self.kernel_size, 1],
strides=[1, self.stride, self.stride, 1],
rates=[1, 1, 1, 1],
padding="SAME",
)
# Reshape the input patches to align with later operations.
# B, H, W, K*K, C//G, G
input_patches = self.input_patches_reshape(input_patches)
# Compute the multiply-add operation of kernels and patches.
# B, H, W, K*K, C//G, G
output = tf.multiply(kernel, input_patches)
# B, H, W, C//G, G
output = tf.reduce_sum(output, axis=3)
# Reshape the output kernel.
# B, H, W, C
output = self.output_reshape(output)
# Return the output tensor and the kernel.
return output, kernel
Involution 層のテスト
# Define the input tensor.
input_tensor = tf.random.normal((32, 256, 256, 3))
# Compute involution with stride 1.
output_tensor, _ = Involution(
channel=3, group_number=1, kernel_size=5, stride=1, reduction_ratio=1, name="inv_1"
)(input_tensor)
print(f"with stride 1 ouput shape: {output_tensor.shape}")
# Compute involution with stride 2.
output_tensor, _ = Involution(
channel=3, group_number=1, kernel_size=5, stride=2, reduction_ratio=1, name="inv_2"
)(input_tensor)
print(f"with stride 2 ouput shape: {output_tensor.shape}")
# Compute involution with stride 1, channel 16 and reduction ratio 2.
output_tensor, _ = Involution(
channel=16, group_number=1, kernel_size=5, stride=1, reduction_ratio=2, name="inv_3"
)(input_tensor)
print(
"with channel 16 and reduction ratio 2 ouput shape: {}".format(output_tensor.shape)
)
with stride 1 ouput shape: (32, 256, 256, 3) with stride 2 ouput shape: (32, 128, 128, 3) with channel 16 and reduction ratio 2 ouput shape: (32, 256, 256, 3)
画像分類
このセクションでは、画像分類器モデルを構築します。2 つのモデルがあります、一つは畳み込みを使用して他方は involution を使用します。
画像分類モデルは Google からのこの Convolutional Neural Network (CNN) チュートリアルに大きくインスパイアされています。
CIFAR10 データセットの取得
# Load the CIFAR10 dataset.
print("loading the CIFAR10 dataset...")
(train_images, train_labels), (
test_images,
test_labels,
) = keras.datasets.cifar10.load_data()
# Normalize pixel values to be between 0 and 1.
(train_images, test_images) = (train_images / 255.0, test_images / 255.0)
# Shuffle and batch the dataset.
train_ds = (
tf.data.Dataset.from_tensor_slices((train_images, train_labels))
.shuffle(256)
.batch(256)
)
test_ds = tf.data.Dataset.from_tensor_slices((test_images, test_labels)).batch(256)
loading the CIFAR10 dataset... Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz 170500096/170498071 [==============================] - 3s 0us/step
データの可視化
class_names = [
"airplane",
"automobile",
"bird",
"cat",
"deer",
"dog",
"frog",
"horse",
"ship",
"truck",
]
plt.figure(figsize=(10, 10))
for i in range(25):
plt.subplot(5, 5, i + 1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_images[i])
plt.xlabel(class_names[train_labels[i][0]])
plt.show()
畳み込みニューラルネットワーク
# Build the conv model.
print("building the convolution model...")
conv_model = keras.Sequential(
[
keras.layers.Conv2D(32, (3, 3), input_shape=(32, 32, 3), padding="same"),
keras.layers.ReLU(name="relu1"),
keras.layers.MaxPooling2D((2, 2)),
keras.layers.Conv2D(64, (3, 3), padding="same"),
keras.layers.ReLU(name="relu2"),
keras.layers.MaxPooling2D((2, 2)),
keras.layers.Conv2D(64, (3, 3), padding="same"),
keras.layers.ReLU(name="relu3"),
keras.layers.Flatten(),
keras.layers.Dense(64, activation="relu"),
keras.layers.Dense(10),
]
)
# Compile the mode with the necessary loss function and optimizer.
print("compiling the convolution model...")
conv_model.compile(
optimizer="adam",
loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=["accuracy"],
)
# Train the model.
print("conv model training...")
conv_hist = conv_model.fit(train_ds, epochs=20, validation_data=test_ds)
building the convolution model... compiling the convolution model... conv model training... Epoch 1/20 196/196 [==============================] - 16s 16ms/step - loss: 1.6367 - accuracy: 0.4041 - val_loss: 1.3283 - val_accuracy: 0.5275 Epoch 2/20 196/196 [==============================] - 3s 16ms/step - loss: 1.2207 - accuracy: 0.5675 - val_loss: 1.1365 - val_accuracy: 0.5965 Epoch 3/20 196/196 [==============================] - 3s 16ms/step - loss: 1.0649 - accuracy: 0.6267 - val_loss: 1.0219 - val_accuracy: 0.6378 Epoch 4/20 196/196 [==============================] - 3s 16ms/step - loss: 0.9642 - accuracy: 0.6613 - val_loss: 0.9741 - val_accuracy: 0.6601 Epoch 5/20 196/196 [==============================] - 3s 16ms/step - loss: 0.8779 - accuracy: 0.6939 - val_loss: 0.9145 - val_accuracy: 0.6826 Epoch 6/20 196/196 [==============================] - 3s 16ms/step - loss: 0.8126 - accuracy: 0.7180 - val_loss: 0.8841 - val_accuracy: 0.6913 Epoch 7/20 196/196 [==============================] - 3s 16ms/step - loss: 0.7641 - accuracy: 0.7334 - val_loss: 0.8667 - val_accuracy: 0.7049 Epoch 8/20 196/196 [==============================] - 3s 16ms/step - loss: 0.7210 - accuracy: 0.7503 - val_loss: 0.8363 - val_accuracy: 0.7089 Epoch 9/20 196/196 [==============================] - 3s 16ms/step - loss: 0.6796 - accuracy: 0.7630 - val_loss: 0.8150 - val_accuracy: 0.7203 Epoch 10/20 196/196 [==============================] - 3s 15ms/step - loss: 0.6370 - accuracy: 0.7793 - val_loss: 0.9021 - val_accuracy: 0.6964 Epoch 11/20 196/196 [==============================] - 3s 15ms/step - loss: 0.6089 - accuracy: 0.7886 - val_loss: 0.8336 - val_accuracy: 0.7207 Epoch 12/20 196/196 [==============================] - 3s 15ms/step - loss: 0.5723 - accuracy: 0.8022 - val_loss: 0.8326 - val_accuracy: 0.7246 Epoch 13/20 196/196 [==============================] - 3s 15ms/step - loss: 0.5375 - accuracy: 0.8144 - val_loss: 0.8482 - val_accuracy: 0.7223 Epoch 14/20 196/196 [==============================] - 3s 15ms/step - loss: 0.5121 - accuracy: 0.8230 - val_loss: 0.8244 - val_accuracy: 0.7306 Epoch 15/20 196/196 [==============================] - 3s 15ms/step - loss: 0.4786 - accuracy: 0.8363 - val_loss: 0.8313 - val_accuracy: 0.7363 Epoch 16/20 196/196 [==============================] - 3s 15ms/step - loss: 0.4518 - accuracy: 0.8458 - val_loss: 0.8634 - val_accuracy: 0.7293 Epoch 17/20 196/196 [==============================] - 3s 16ms/step - loss: 0.4403 - accuracy: 0.8489 - val_loss: 0.8683 - val_accuracy: 0.7290 Epoch 18/20 196/196 [==============================] - 3s 16ms/step - loss: 0.4094 - accuracy: 0.8576 - val_loss: 0.8982 - val_accuracy: 0.7272 Epoch 19/20 196/196 [==============================] - 3s 16ms/step - loss: 0.3941 - accuracy: 0.8630 - val_loss: 0.9537 - val_accuracy: 0.7200 Epoch 20/20 196/196 [==============================] - 3s 15ms/step - loss: 0.3778 - accuracy: 0.8691 - val_loss: 0.9780 - val_accuracy: 0.7184
(訳者注: 実験結果)
building the convolution model... compiling the convolution model... conv model training... Epoch 1/20 196/196 [==============================] - 9s 12ms/step - loss: 1.6219 - accuracy: 0.4134 - val_loss: 1.3170 - val_accuracy: 0.5361 Epoch 2/20 196/196 [==============================] - 2s 11ms/step - loss: 1.2299 - accuracy: 0.5659 - val_loss: 1.1324 - val_accuracy: 0.6057 Epoch 3/20 196/196 [==============================] - 2s 11ms/step - loss: 1.0730 - accuracy: 0.6240 - val_loss: 1.0566 - val_accuracy: 0.6258 Epoch 4/20 196/196 [==============================] - 2s 10ms/step - loss: 0.9593 - accuracy: 0.6676 - val_loss: 0.9721 - val_accuracy: 0.6584 Epoch 5/20 196/196 [==============================] - 2s 10ms/step - loss: 0.8794 - accuracy: 0.6960 - val_loss: 0.9271 - val_accuracy: 0.6794 Epoch 6/20 196/196 [==============================] - 2s 10ms/step - loss: 0.8148 - accuracy: 0.7176 - val_loss: 0.9062 - val_accuracy: 0.6810 Epoch 7/20 196/196 [==============================] - 2s 10ms/step - loss: 0.7652 - accuracy: 0.7359 - val_loss: 0.8682 - val_accuracy: 0.6990 Epoch 8/20 196/196 [==============================] - 2s 10ms/step - loss: 0.7169 - accuracy: 0.7526 - val_loss: 0.8479 - val_accuracy: 0.7084 Epoch 9/20 196/196 [==============================] - 2s 10ms/step - loss: 0.6712 - accuracy: 0.7685 - val_loss: 0.8626 - val_accuracy: 0.7068 Epoch 10/20 196/196 [==============================] - 2s 11ms/step - loss: 0.6401 - accuracy: 0.7791 - val_loss: 0.8523 - val_accuracy: 0.7147 Epoch 11/20 196/196 [==============================] - 2s 10ms/step - loss: 0.5960 - accuracy: 0.7953 - val_loss: 0.8417 - val_accuracy: 0.7189 Epoch 12/20 196/196 [==============================] - 2s 11ms/step - loss: 0.5614 - accuracy: 0.8058 - val_loss: 0.8639 - val_accuracy: 0.7193 Epoch 13/20 196/196 [==============================] - 2s 10ms/step - loss: 0.5282 - accuracy: 0.8192 - val_loss: 0.9017 - val_accuracy: 0.7144 Epoch 14/20 196/196 [==============================] - 2s 10ms/step - loss: 0.4888 - accuracy: 0.8326 - val_loss: 0.8822 - val_accuracy: 0.7241 Epoch 15/20 196/196 [==============================] - 2s 10ms/step - loss: 0.4693 - accuracy: 0.8399 - val_loss: 0.9730 - val_accuracy: 0.7036 Epoch 16/20 196/196 [==============================] - 2s 10ms/step - loss: 0.4458 - accuracy: 0.8470 - val_loss: 0.9329 - val_accuracy: 0.7152 Epoch 17/20 196/196 [==============================] - 2s 10ms/step - loss: 0.4088 - accuracy: 0.8604 - val_loss: 0.9590 - val_accuracy: 0.7180 Epoch 18/20 196/196 [==============================] - 2s 10ms/step - loss: 0.3978 - accuracy: 0.8639 - val_loss: 0.9674 - val_accuracy: 0.7164 Epoch 19/20 196/196 [==============================] - 2s 10ms/step - loss: 0.3741 - accuracy: 0.8721 - val_loss: 0.9584 - val_accuracy: 0.7178 Epoch 20/20 196/196 [==============================] - 2s 10ms/step - loss: 0.3445 - accuracy: 0.8823 - val_loss: 0.9994 - val_accuracy: 0.7097 CPU times: user 56.4 s, sys: 3.55 s, total: 59.9 s Wall time: 57.9 s
Involutional ニューラルネットワーク
# Build the involution model.
print("building the involution model...")
inputs = keras.Input(shape=(32, 32, 3))
x, _ = Involution(
channel=3, group_number=1, kernel_size=3, stride=1, reduction_ratio=2, name="inv_1"
)(inputs)
x = keras.layers.ReLU()(x)
x = keras.layers.MaxPooling2D((2, 2))(x)
x, _ = Involution(
channel=3, group_number=1, kernel_size=3, stride=1, reduction_ratio=2, name="inv_2"
)(x)
x = keras.layers.ReLU()(x)
x = keras.layers.MaxPooling2D((2, 2))(x)
x, _ = Involution(
channel=3, group_number=1, kernel_size=3, stride=1, reduction_ratio=2, name="inv_3"
)(x)
x = keras.layers.ReLU()(x)
x = keras.layers.Flatten()(x)
x = keras.layers.Dense(64, activation="relu")(x)
outputs = keras.layers.Dense(10)(x)
inv_model = keras.Model(inputs=[inputs], outputs=[outputs], name="inv_model")
# Compile the mode with the necessary loss function and optimizer.
print("compiling the involution model...")
inv_model.compile(
optimizer="adam",
loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=["accuracy"],
)
# train the model
print("inv model training...")
inv_hist = inv_model.fit(train_ds, epochs=20, validation_data=test_ds)
building the involution model... compiling the involution model... inv model training... Epoch 1/20 196/196 [==============================] - 5s 21ms/step - loss: 2.1570 - accuracy: 0.2266 - val_loss: 2.2712 - val_accuracy: 0.1557 Epoch 2/20 196/196 [==============================] - 4s 20ms/step - loss: 1.9445 - accuracy: 0.3054 - val_loss: 1.9762 - val_accuracy: 0.2963 Epoch 3/20 196/196 [==============================] - 4s 20ms/step - loss: 1.8469 - accuracy: 0.3433 - val_loss: 1.8044 - val_accuracy: 0.3669 Epoch 4/20 196/196 [==============================] - 4s 20ms/step - loss: 1.7837 - accuracy: 0.3646 - val_loss: 1.7640 - val_accuracy: 0.3761 Epoch 5/20 196/196 [==============================] - 4s 20ms/step - loss: 1.7369 - accuracy: 0.3784 - val_loss: 1.7180 - val_accuracy: 0.3907 Epoch 6/20 196/196 [==============================] - 4s 19ms/step - loss: 1.7031 - accuracy: 0.3917 - val_loss: 1.6839 - val_accuracy: 0.4004 Epoch 7/20 196/196 [==============================] - 4s 19ms/step - loss: 1.6748 - accuracy: 0.3988 - val_loss: 1.6786 - val_accuracy: 0.4037 Epoch 8/20 196/196 [==============================] - 4s 19ms/step - loss: 1.6592 - accuracy: 0.4052 - val_loss: 1.6550 - val_accuracy: 0.4103 Epoch 9/20 196/196 [==============================] - 4s 19ms/step - loss: 1.6412 - accuracy: 0.4106 - val_loss: 1.6346 - val_accuracy: 0.4158 Epoch 10/20 196/196 [==============================] - 4s 19ms/step - loss: 1.6251 - accuracy: 0.4178 - val_loss: 1.6330 - val_accuracy: 0.4145 Epoch 11/20 196/196 [==============================] - 4s 19ms/step - loss: 1.6124 - accuracy: 0.4206 - val_loss: 1.6214 - val_accuracy: 0.4218 Epoch 12/20 196/196 [==============================] - 4s 19ms/step - loss: 1.5978 - accuracy: 0.4252 - val_loss: 1.6121 - val_accuracy: 0.4239 Epoch 13/20 196/196 [==============================] - 4s 19ms/step - loss: 1.5868 - accuracy: 0.4301 - val_loss: 1.5974 - val_accuracy: 0.4284 Epoch 14/20 196/196 [==============================] - 4s 19ms/step - loss: 1.5759 - accuracy: 0.4353 - val_loss: 1.5939 - val_accuracy: 0.4325 Epoch 15/20 196/196 [==============================] - 4s 19ms/step - loss: 1.5677 - accuracy: 0.4369 - val_loss: 1.5889 - val_accuracy: 0.4372 Epoch 16/20 196/196 [==============================] - 4s 20ms/step - loss: 1.5586 - accuracy: 0.4413 - val_loss: 1.5817 - val_accuracy: 0.4376 Epoch 17/20 196/196 [==============================] - 4s 20ms/step - loss: 1.5507 - accuracy: 0.4447 - val_loss: 1.5776 - val_accuracy: 0.4381 Epoch 18/20 196/196 [==============================] - 4s 20ms/step - loss: 1.5420 - accuracy: 0.4477 - val_loss: 1.5785 - val_accuracy: 0.4378 Epoch 19/20 196/196 [==============================] - 4s 20ms/step - loss: 1.5357 - accuracy: 0.4484 - val_loss: 1.5639 - val_accuracy: 0.4431 Epoch 20/20 196/196 [==============================] - 4s 20ms/step - loss: 1.5305 - accuracy: 0.4530 - val_loss: 1.5661 - val_accuracy: 0.4418
building the involution model... compiling the involution model... inv model training... Epoch 1/20 196/196 [==============================] - 5s 18ms/step - loss: 2.3027 - accuracy: 0.0979 - val_loss: 2.3026 - val_accuracy: 0.1000 Epoch 2/20 196/196 [==============================] - 3s 17ms/step - loss: 2.3027 - accuracy: 0.0974 - val_loss: 2.3026 - val_accuracy: 0.1000 Epoch 3/20 196/196 [==============================] - 3s 17ms/step - loss: 2.3027 - accuracy: 0.0968 - val_loss: 2.3026 - val_accuracy: 0.1000 Epoch 4/20 196/196 [==============================] - 3s 17ms/step - loss: 2.3027 - accuracy: 0.0970 - val_loss: 2.3026 - val_accuracy: 0.1000 Epoch 5/20 196/196 [==============================] - 3s 17ms/step - loss: 2.1119 - accuracy: 0.2201 - val_loss: 2.0064 - val_accuracy: 0.2656 Epoch 6/20 196/196 [==============================] - 3s 16ms/step - loss: 1.8503 - accuracy: 0.3308 - val_loss: 1.8354 - val_accuracy: 0.3393 Epoch 7/20 196/196 [==============================] - 3s 17ms/step - loss: 1.7592 - accuracy: 0.3687 - val_loss: 1.7367 - val_accuracy: 0.3725 Epoch 8/20 196/196 [==============================] - 3s 16ms/step - loss: 1.7195 - accuracy: 0.3841 - val_loss: 1.7025 - val_accuracy: 0.3864 Epoch 9/20 196/196 [==============================] - 3s 16ms/step - loss: 1.6928 - accuracy: 0.3948 - val_loss: 1.6811 - val_accuracy: 0.3977 Epoch 10/20 196/196 [==============================] - 3s 16ms/step - loss: 1.6691 - accuracy: 0.4043 - val_loss: 1.6605 - val_accuracy: 0.4068 Epoch 11/20 196/196 [==============================] - 3s 15ms/step - loss: 1.6497 - accuracy: 0.4114 - val_loss: 1.6300 - val_accuracy: 0.4137 Epoch 12/20 196/196 [==============================] - 3s 15ms/step - loss: 1.6339 - accuracy: 0.4167 - val_loss: 1.6227 - val_accuracy: 0.4149 Epoch 13/20 196/196 [==============================] - 3s 16ms/step - loss: 1.6189 - accuracy: 0.4229 - val_loss: 1.6095 - val_accuracy: 0.4190 Epoch 14/20 196/196 [==============================] - 3s 15ms/step - loss: 1.6071 - accuracy: 0.4269 - val_loss: 1.5958 - val_accuracy: 0.4237 Epoch 15/20 196/196 [==============================] - 3s 16ms/step - loss: 1.5958 - accuracy: 0.4324 - val_loss: 1.5909 - val_accuracy: 0.4286 Epoch 16/20 196/196 [==============================] - 3s 16ms/step - loss: 1.5885 - accuracy: 0.4353 - val_loss: 1.5783 - val_accuracy: 0.4326 Epoch 17/20 196/196 [==============================] - 3s 16ms/step - loss: 1.5770 - accuracy: 0.4403 - val_loss: 1.5746 - val_accuracy: 0.4355 Epoch 18/20 196/196 [==============================] - 3s 15ms/step - loss: 1.5710 - accuracy: 0.4423 - val_loss: 1.5655 - val_accuracy: 0.4376 Epoch 19/20 196/196 [==============================] - 3s 15ms/step - loss: 1.5640 - accuracy: 0.4461 - val_loss: 1.5633 - val_accuracy: 0.4408 Epoch 20/20 196/196 [==============================] - 3s 15ms/step - loss: 1.5553 - accuracy: 0.4495 - val_loss: 1.5599 - val_accuracy: 0.4428 CPU times: user 1min 31s, sys: 5.88 s, total: 1min 36s Wall time: 1min 27s
比較
このセクションでは、両方のモデルを見て幾つかのポイントを比較します。
パラメータ
類似のアーキテクチャでは、CNN のパラメータは INN (Involutional Neural Network) のそれよりも遥かに大きいことがわかります。
conv_model.summary()
inv_model.summary()
Model: "sequential_3" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_6 (Conv2D) (None, 32, 32, 32) 896 _________________________________________________________________ relu1 (ReLU) (None, 32, 32, 32) 0 _________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 16, 16, 32) 0 _________________________________________________________________ conv2d_7 (Conv2D) (None, 16, 16, 64) 18496 _________________________________________________________________ relu2 (ReLU) (None, 16, 16, 64) 0 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 8, 8, 64) 0 _________________________________________________________________ conv2d_8 (Conv2D) (None, 8, 8, 64) 36928 _________________________________________________________________ relu3 (ReLU) (None, 8, 8, 64) 0 _________________________________________________________________ flatten (Flatten) (None, 4096) 0 _________________________________________________________________ dense (Dense) (None, 64) 262208 _________________________________________________________________ dense_1 (Dense) (None, 10) 650 ================================================================= Total params: 319,178 Trainable params: 319,178 Non-trainable params: 0 _________________________________________________________________ Model: "inv_model" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) [(None, 32, 32, 3)] 0 _________________________________________________________________ inv_1 (Involution) ((None, 32, 32, 3), (None 26 _________________________________________________________________ re_lu_3 (ReLU) (None, 32, 32, 3) 0 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (None, 16, 16, 3) 0 _________________________________________________________________ inv_2 (Involution) ((None, 16, 16, 3), (None 26 _________________________________________________________________ re_lu_4 (ReLU) (None, 16, 16, 3) 0 _________________________________________________________________ max_pooling2d_3 (MaxPooling2 (None, 8, 8, 3) 0 _________________________________________________________________ inv_3 (Involution) ((None, 8, 8, 3), (None, 26 _________________________________________________________________ re_lu_5 (ReLU) (None, 8, 8, 3) 0 _________________________________________________________________ flatten_1 (Flatten) (None, 192) 0 _________________________________________________________________ dense_2 (Dense) (None, 64) 12352 _________________________________________________________________ dense_3 (Dense) (None, 10) 650 ================================================================= Total params: 13,080 Trainable params: 13,074 Non-trainable params: 6 _________________________________________________________________
損失と精度のプロット
ここで、損失と精度のプロットは INN が (少ないパラメータを使用する) スローな学習者であることを示しています。
plt.figure(figsize=(20, 5))
plt.subplot(1, 2, 1)
plt.title("Convolution Loss")
plt.plot(conv_hist.history["loss"], label="loss")
plt.plot(conv_hist.history["val_loss"], label="val_loss")
plt.legend()
plt.subplot(1, 2, 2)
plt.title("Involution Loss")
plt.plot(inv_hist.history["loss"], label="loss")
plt.plot(inv_hist.history["val_loss"], label="val_loss")
plt.legend()
plt.show()
plt.figure(figsize=(20, 5))
plt.subplot(1, 2, 1)
plt.title("Convolution Accuracy")
plt.plot(conv_hist.history["accuracy"], label="accuracy")
plt.plot(conv_hist.history["val_accuracy"], label="val_accuracy")
plt.legend()
plt.subplot(1, 2, 2)
plt.title("Involution Accuracy")
plt.plot(inv_hist.history["accuracy"], label="accuracy")
plt.plot(inv_hist.history["val_accuracy"], label="val_accuracy")
plt.legend()
plt.show()
(訳者注: 実験結果)
Involution カーネルの可視化
カーネルを可視化するため、各 involution カーネルから KxK 値の合計を取ります。異なる空間位置にある総ての標本値 (= representatives) が対応するヒートマップを構成します。
著者は以下のように述べています :
「私達の提案した involution は自己注意を連想させて本質的にはその汎用化バージョンになれるでしょう」
カーネルの可視化により画像の注意マップを実際に取得できます。学習された involution カーネルは入力テンソルの個々の空間的位置への注意を提供します。位置固有の (= location-specific) 特性は involution を自己注意が属するモデルの一般的な空間にします。
layer_names = ["inv_1", "inv_2", "inv_3"]
outputs = [inv_model.get_layer(name).output for name in layer_names]
vis_model = keras.Model(inv_model.input, outputs)
fig, axes = plt.subplots(nrows=10, ncols=4, figsize=(10, 30))
for ax, test_image in zip(axes, test_images[:10]):
(inv1_out, inv2_out, inv3_out) = vis_model.predict(test_image[None, ...])
_, inv1_kernel = inv1_out
_, inv2_kernel = inv2_out
_, inv3_kernel = inv3_out
inv1_kernel = tf.reduce_sum(inv1_kernel, axis=[-1, -2, -3])
inv2_kernel = tf.reduce_sum(inv2_kernel, axis=[-1, -2, -3])
inv3_kernel = tf.reduce_sum(inv3_kernel, axis=[-1, -2, -3])
ax[0].imshow(keras.preprocessing.image.array_to_img(test_image))
ax[0].set_title("Input Image")
ax[1].imshow(keras.preprocessing.image.array_to_img(inv1_kernel[0, ..., None]))
ax[1].set_title("Involution Kernel 1")
ax[2].imshow(keras.preprocessing.image.array_to_img(inv2_kernel[0, ..., None]))
ax[2].set_title("Involution Kernel 2")
ax[3].imshow(keras.preprocessing.image.array_to_img(inv3_kernel[0, ..., None]))
ax[3].set_title("Involution Kernel 3")
(訳者注: 実験結果)
結論
このサンプルでは、主要なフォーカスは簡単に再利用できる Involution 層を構築することでした。私達の比較は特定のタスクに基づいていましたが、異なるタスクのためにこの層を自由に使用して結果を報告してください。
個人的意見では、 involution の重要なポイントは自己注意との関係性です。位置固有でチャネル固有な処理の背後にある直感は多くのタスクで意味があります。
更に進むためには以下を行なうことができます :
- より良い理解のために involution の Yannick のビデオ を見てください。
- involution 層の様々なハイパーパラメータで実験してください。
- involution 層で様々なモデルを構築してください。
- 全く異なるカーネル生成方法を構築してみてください。
APPENDIX
* 訳者注: INN を 100 エポックで実験
building the involution model... compiling the involution model... inv model training... Epoch 1/100 196/196 [==============================] - 5s 17ms/step - loss: 2.2242 - accuracy: 0.1848 - val_loss: 2.2879 - val_accuracy: 0.1140 Epoch 2/100 196/196 [==============================] - 3s 15ms/step - loss: 1.9661 - accuracy: 0.3087 - val_loss: 1.9162 - val_accuracy: 0.3045 Epoch 3/100 196/196 [==============================] - 3s 16ms/step - loss: 1.8010 - accuracy: 0.3641 - val_loss: 1.7586 - val_accuracy: 0.3789 Epoch 4/100 196/196 [==============================] - 3s 15ms/step - loss: 1.7147 - accuracy: 0.3964 - val_loss: 1.6851 - val_accuracy: 0.4068 Epoch 5/100 196/196 [==============================] - 3s 15ms/step - loss: 1.6682 - accuracy: 0.4143 - val_loss: 1.6538 - val_accuracy: 0.4213 Epoch 6/100 196/196 [==============================] - 3s 16ms/step - loss: 1.6364 - accuracy: 0.4255 - val_loss: 1.6282 - val_accuracy: 0.4344 Epoch 7/100 196/196 [==============================] - 3s 15ms/step - loss: 1.6132 - accuracy: 0.4335 - val_loss: 1.6257 - val_accuracy: 0.4332 Epoch 8/100 196/196 [==============================] - 3s 15ms/step - loss: 1.5979 - accuracy: 0.4406 - val_loss: 1.5947 - val_accuracy: 0.4470 Epoch 9/100 196/196 [==============================] - 3s 15ms/step - loss: 1.5823 - accuracy: 0.4455 - val_loss: 1.5842 - val_accuracy: 0.4471 Epoch 10/100 196/196 [==============================] - 3s 15ms/step - loss: 1.5645 - accuracy: 0.4512 - val_loss: 1.5652 - val_accuracy: 0.4561 Epoch 11/100 196/196 [==============================] - 3s 16ms/step - loss: 1.5526 - accuracy: 0.4565 - val_loss: 1.5597 - val_accuracy: 0.4611 Epoch 12/100 196/196 [==============================] - 3s 16ms/step - loss: 1.5435 - accuracy: 0.4590 - val_loss: 1.5507 - val_accuracy: 0.4619 Epoch 13/100 196/196 [==============================] - 3s 15ms/step - loss: 1.5343 - accuracy: 0.4629 - val_loss: 1.5561 - val_accuracy: 0.4582 Epoch 14/100 196/196 [==============================] - 3s 15ms/step - loss: 1.5208 - accuracy: 0.4669 - val_loss: 1.5471 - val_accuracy: 0.4622 Epoch 15/100 196/196 [==============================] - 3s 15ms/step - loss: 1.5159 - accuracy: 0.4706 - val_loss: 1.5343 - val_accuracy: 0.4658 Epoch 16/100 196/196 [==============================] - 3s 15ms/step - loss: 1.5064 - accuracy: 0.4749 - val_loss: 1.5254 - val_accuracy: 0.4705 Epoch 17/100 196/196 [==============================] - 3s 15ms/step - loss: 1.4985 - accuracy: 0.4756 - val_loss: 1.5226 - val_accuracy: 0.4739 Epoch 18/100 196/196 [==============================] - 3s 14ms/step - loss: 1.4875 - accuracy: 0.4813 - val_loss: 1.5187 - val_accuracy: 0.4748 Epoch 19/100 196/196 [==============================] - 3s 15ms/step - loss: 1.4835 - accuracy: 0.4817 - val_loss: 1.5209 - val_accuracy: 0.4685 Epoch 20/100 196/196 [==============================] - 3s 15ms/step - loss: 1.4759 - accuracy: 0.4849 - val_loss: 1.5156 - val_accuracy: 0.4715 Epoch 21/100 196/196 [==============================] - 3s 16ms/step - loss: 1.4711 - accuracy: 0.4878 - val_loss: 1.5092 - val_accuracy: 0.4722 Epoch 22/100 196/196 [==============================] - 3s 15ms/step - loss: 1.4642 - accuracy: 0.4895 - val_loss: 1.4991 - val_accuracy: 0.4785 Epoch 23/100 196/196 [==============================] - 3s 15ms/step - loss: 1.4578 - accuracy: 0.4906 - val_loss: 1.4995 - val_accuracy: 0.4799 Epoch 24/100 196/196 [==============================] - 3s 15ms/step - loss: 1.4513 - accuracy: 0.4922 - val_loss: 1.4968 - val_accuracy: 0.4802 Epoch 25/100 196/196 [==============================] - 3s 16ms/step - loss: 1.4468 - accuracy: 0.4932 - val_loss: 1.4992 - val_accuracy: 0.4810 Epoch 26/100 196/196 [==============================] - 3s 15ms/step - loss: 1.4439 - accuracy: 0.4956 - val_loss: 1.4906 - val_accuracy: 0.4827 Epoch 27/100 196/196 [==============================] - 3s 15ms/step - loss: 1.4352 - accuracy: 0.4984 - val_loss: 1.4975 - val_accuracy: 0.4802 Epoch 28/100 196/196 [==============================] - 3s 15ms/step - loss: 1.4329 - accuracy: 0.4990 - val_loss: 1.4823 - val_accuracy: 0.4854 Epoch 29/100 196/196 [==============================] - 3s 15ms/step - loss: 1.4258 - accuracy: 0.5016 - val_loss: 1.4811 - val_accuracy: 0.4858 Epoch 30/100 196/196 [==============================] - 3s 16ms/step - loss: 1.4200 - accuracy: 0.5032 - val_loss: 1.4764 - val_accuracy: 0.4903 Epoch 31/100 196/196 [==============================] - 3s 16ms/step - loss: 1.4175 - accuracy: 0.5041 - val_loss: 1.4805 - val_accuracy: 0.4890 Epoch 32/100 196/196 [==============================] - 3s 16ms/step - loss: 1.4122 - accuracy: 0.5057 - val_loss: 1.4764 - val_accuracy: 0.4892 Epoch 33/100 196/196 [==============================] - 3s 16ms/step - loss: 1.4097 - accuracy: 0.5064 - val_loss: 1.4693 - val_accuracy: 0.4900 Epoch 34/100 196/196 [==============================] - 3s 15ms/step - loss: 1.4032 - accuracy: 0.5092 - val_loss: 1.4715 - val_accuracy: 0.4911 Epoch 35/100 196/196 [==============================] - 3s 15ms/step - loss: 1.3991 - accuracy: 0.5112 - val_loss: 1.4799 - val_accuracy: 0.4895 Epoch 36/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3970 - accuracy: 0.5123 - val_loss: 1.4780 - val_accuracy: 0.4884 Epoch 37/100 196/196 [==============================] - 3s 15ms/step - loss: 1.3909 - accuracy: 0.5130 - val_loss: 1.4647 - val_accuracy: 0.4932 Epoch 38/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3864 - accuracy: 0.5150 - val_loss: 1.4624 - val_accuracy: 0.4936 Epoch 39/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3840 - accuracy: 0.5160 - val_loss: 1.4643 - val_accuracy: 0.4917 Epoch 40/100 196/196 [==============================] - 3s 15ms/step - loss: 1.3817 - accuracy: 0.5165 - val_loss: 1.4647 - val_accuracy: 0.4931 Epoch 41/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3775 - accuracy: 0.5177 - val_loss: 1.4648 - val_accuracy: 0.4920 Epoch 42/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3741 - accuracy: 0.5194 - val_loss: 1.4643 - val_accuracy: 0.4941 Epoch 43/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3694 - accuracy: 0.5224 - val_loss: 1.4579 - val_accuracy: 0.4966 Epoch 44/100 196/196 [==============================] - 3s 15ms/step - loss: 1.3679 - accuracy: 0.5216 - val_loss: 1.4576 - val_accuracy: 0.4967 Epoch 45/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3626 - accuracy: 0.5240 - val_loss: 1.4552 - val_accuracy: 0.4970 Epoch 46/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3589 - accuracy: 0.5241 - val_loss: 1.4568 - val_accuracy: 0.4985 Epoch 47/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3592 - accuracy: 0.5227 - val_loss: 1.4571 - val_accuracy: 0.4983 Epoch 48/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3561 - accuracy: 0.5260 - val_loss: 1.4570 - val_accuracy: 0.4953 Epoch 49/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3528 - accuracy: 0.5264 - val_loss: 1.4567 - val_accuracy: 0.4974 Epoch 50/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3487 - accuracy: 0.5267 - val_loss: 1.4595 - val_accuracy: 0.4951 Epoch 51/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3470 - accuracy: 0.5280 - val_loss: 1.4539 - val_accuracy: 0.4994 Epoch 52/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3448 - accuracy: 0.5296 - val_loss: 1.4537 - val_accuracy: 0.4984 Epoch 53/100 196/196 [==============================] - 3s 15ms/step - loss: 1.3410 - accuracy: 0.5321 - val_loss: 1.4592 - val_accuracy: 0.4953 Epoch 54/100 196/196 [==============================] - 3s 15ms/step - loss: 1.3384 - accuracy: 0.5315 - val_loss: 1.4462 - val_accuracy: 0.4995 Epoch 55/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3390 - accuracy: 0.5320 - val_loss: 1.4493 - val_accuracy: 0.5008 Epoch 56/100 196/196 [==============================] - 3s 15ms/step - loss: 1.3346 - accuracy: 0.5325 - val_loss: 1.4503 - val_accuracy: 0.4977 Epoch 57/100 196/196 [==============================] - 3s 15ms/step - loss: 1.3321 - accuracy: 0.5333 - val_loss: 1.4476 - val_accuracy: 0.5004 Epoch 58/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3309 - accuracy: 0.5340 - val_loss: 1.4490 - val_accuracy: 0.4980 Epoch 59/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3295 - accuracy: 0.5355 - val_loss: 1.4587 - val_accuracy: 0.4960 Epoch 60/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3291 - accuracy: 0.5347 - val_loss: 1.4535 - val_accuracy: 0.4990 Epoch 61/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3246 - accuracy: 0.5367 - val_loss: 1.4501 - val_accuracy: 0.4985 Epoch 62/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3226 - accuracy: 0.5373 - val_loss: 1.4597 - val_accuracy: 0.4974 Epoch 63/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3192 - accuracy: 0.5384 - val_loss: 1.4473 - val_accuracy: 0.5000 Epoch 64/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3181 - accuracy: 0.5386 - val_loss: 1.4532 - val_accuracy: 0.5002 Epoch 65/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3152 - accuracy: 0.5397 - val_loss: 1.4528 - val_accuracy: 0.5006 Epoch 66/100 196/196 [==============================] - 3s 15ms/step - loss: 1.3138 - accuracy: 0.5405 - val_loss: 1.4455 - val_accuracy: 0.5025 Epoch 67/100 196/196 [==============================] - 3s 15ms/step - loss: 1.3147 - accuracy: 0.5393 - val_loss: 1.4535 - val_accuracy: 0.5014 Epoch 68/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3118 - accuracy: 0.5403 - val_loss: 1.4529 - val_accuracy: 0.5012 Epoch 69/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3075 - accuracy: 0.5432 - val_loss: 1.4508 - val_accuracy: 0.5009 Epoch 70/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3070 - accuracy: 0.5433 - val_loss: 1.4551 - val_accuracy: 0.5004 Epoch 71/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3078 - accuracy: 0.5421 - val_loss: 1.4562 - val_accuracy: 0.5001 Epoch 72/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3033 - accuracy: 0.5450 - val_loss: 1.4516 - val_accuracy: 0.5003 Epoch 73/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3037 - accuracy: 0.5446 - val_loss: 1.4444 - val_accuracy: 0.5012 Epoch 74/100 196/196 [==============================] - 3s 16ms/step - loss: 1.3019 - accuracy: 0.5443 - val_loss: 1.4541 - val_accuracy: 0.5015 Epoch 75/100 196/196 [==============================] - 3s 15ms/step - loss: 1.3009 - accuracy: 0.5451 - val_loss: 1.4472 - val_accuracy: 0.5003 Epoch 76/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2965 - accuracy: 0.5460 - val_loss: 1.4530 - val_accuracy: 0.5008 Epoch 77/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2967 - accuracy: 0.5448 - val_loss: 1.4499 - val_accuracy: 0.5015 Epoch 78/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2932 - accuracy: 0.5475 - val_loss: 1.4649 - val_accuracy: 0.4993 Epoch 79/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2961 - accuracy: 0.5468 - val_loss: 1.4531 - val_accuracy: 0.4997 Epoch 80/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2924 - accuracy: 0.5479 - val_loss: 1.4581 - val_accuracy: 0.5006 Epoch 81/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2937 - accuracy: 0.5482 - val_loss: 1.4567 - val_accuracy: 0.5006 Epoch 82/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2909 - accuracy: 0.5485 - val_loss: 1.4530 - val_accuracy: 0.5001 Epoch 83/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2882 - accuracy: 0.5502 - val_loss: 1.4573 - val_accuracy: 0.5010 Epoch 84/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2902 - accuracy: 0.5492 - val_loss: 1.4516 - val_accuracy: 0.5008 Epoch 85/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2847 - accuracy: 0.5518 - val_loss: 1.4478 - val_accuracy: 0.5011 Epoch 86/100 196/196 [==============================] - 3s 15ms/step - loss: 1.2859 - accuracy: 0.5500 - val_loss: 1.4567 - val_accuracy: 0.5001 Epoch 87/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2845 - accuracy: 0.5516 - val_loss: 1.4565 - val_accuracy: 0.5007 Epoch 88/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2828 - accuracy: 0.5523 - val_loss: 1.4477 - val_accuracy: 0.5007 Epoch 89/100 196/196 [==============================] - 3s 15ms/step - loss: 1.2827 - accuracy: 0.5510 - val_loss: 1.4479 - val_accuracy: 0.5018 Epoch 90/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2788 - accuracy: 0.5535 - val_loss: 1.4553 - val_accuracy: 0.5016 Epoch 91/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2804 - accuracy: 0.5526 - val_loss: 1.4553 - val_accuracy: 0.5024 Epoch 92/100 196/196 [==============================] - 3s 15ms/step - loss: 1.2782 - accuracy: 0.5538 - val_loss: 1.4534 - val_accuracy: 0.5018 Epoch 93/100 196/196 [==============================] - 3s 15ms/step - loss: 1.2794 - accuracy: 0.5539 - val_loss: 1.4530 - val_accuracy: 0.5017 Epoch 94/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2767 - accuracy: 0.5537 - val_loss: 1.4542 - val_accuracy: 0.5018 Epoch 95/100 196/196 [==============================] - 3s 15ms/step - loss: 1.2761 - accuracy: 0.5552 - val_loss: 1.4500 - val_accuracy: 0.5025 Epoch 96/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2740 - accuracy: 0.5539 - val_loss: 1.4515 - val_accuracy: 0.5024 Epoch 97/100 196/196 [==============================] - 3s 15ms/step - loss: 1.2726 - accuracy: 0.5561 - val_loss: 1.4515 - val_accuracy: 0.5017 Epoch 98/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2725 - accuracy: 0.5540 - val_loss: 1.4488 - val_accuracy: 0.5027 Epoch 99/100 196/196 [==============================] - 3s 16ms/step - loss: 1.2705 - accuracy: 0.5570 - val_loss: 1.4541 - val_accuracy: 0.5042 Epoch 100/100 196/196 [==============================] - 3s 15ms/step - loss: 1.2692 - accuracy: 0.5566 - val_loss: 1.4463 - val_accuracy: 0.5048 CPU times: user 7min 13s, sys: 28.9 s, total: 7min 42s Wall time: 7min 9s
以上