22 minute read

Hand Gesture Detection - Rev #01





  • RGB Camera만을 이용해서 Online Hand Gesture Detection을 해보려고 합니다.


  • Depth / IR 등의 다양한 Sensor들을 사용할 수는 환경이 되지 않아 우선 RGB Cam.으로 들어오는 손 모양을 이용해서 Gesture Detection Project를 진행하려고 합니다.


0. Idea


  • 손을 Detecting하기 위해서 Google에서 제공하는 Mediapipe라는 Solution을 사용하기로 했습니다.


  • Mediapipe는 손 뿐만 아니라 다양한 목적으로 사용할 수 있으며, CPU만으로도 실시간으로 매우 훌륭한 성능을 보여줍니다.

    더 자세한 사항은 아래 Link를 참고하세요.

    https://google.github.io/mediapipe/


  • Mediapipe는 Image에서 미리 학습된 손 모양이 Detect되면 손가락을 포함한 손 전체의 중요 21개의 Point(Land Mark)에 대한 (x,y,z) 좌표를 Return해 줍니다.


  • 미리 준비한 영상에서 이 63개의 Land Mark(21개 Land Mark X (x,y,z) 3개의 좌표)값들을 뽑아내고, 이 값들의 변화(RNN)를 학습하여 Hand Gesture Detection을 할 예정입니다.






1. Prepare Dataset



1.1. Generating Dataset


  • 총 4가지의 Hand Gesture를 동영상으로 녹화한 Dataset을 준비했습니다.


  • 1 Finger Click / 2 Finger Left / 2 Finger Right / Hand Shake 의 4가지 종류별로 100여개 정도의 동영상을 직접 촬영하였습니다.



1.2. Preprocessing Dataset


  • 만들어진 각각의 동영상은 모두 다른 Frame 길이를 가지고 있습니다.


  • 먼저 OpenCV로 개별 동영상을 Load하여 Frame 단위로 읽어오고, 이 Frame들을 Mediapipe로 Hand Land Mark를 추출합니다.


  • 결과적으로, 개별 동영상에서는 (Frame 수 X 63 )의 Data가 나오게 됩니다.


  • 최종적으로 LSTM에 입력으로 넣어야 하기 때문에 Time Stamp,즉 Frame 수는 모두 같아야 합니다.


  • 그래서 전체 동영상에서 가장 긴 길이의 Frame에 맞춰서 모든 동영상의 Frame을 맞추도록 하겠습니다.


  • 가장 긴 동영상의 Frame 수는 115 Frame이었습니다. 아래 그림과 같이 앞뒤로 Zero Data를 Padding하여 전체 Data의 Frame길이를 115로 맞춥니다.



  • 이렇게 모두 같은 Frame 수로 맞춰진 후에 Hand Land Mark를 Numpy Data File로 저장합니다.


  • 최종적으로 이 File들을 Train Data로 활용하도록 하겠습니다.





2. Load Module & Prepare Train



  • Tensorflow & LSTM 관련 Package를 사용합니다.


import numpy as np
import pandas as pd
import os
import tensorflow as tf

from sklearn.preprocessing import LabelEncoder 
from sklearn.model_selection import train_test_split
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Bidirectional
from tensorflow.keras.callbacks import TensorBoard , ModelCheckpoint


  • Max Frame은 115입니다.
DATA_FRAMES_PER_DATA = 115



  • (115 x 63)으로 미리 만들어진 Data File 정보를 가진 CSV File을 읽어옵니다.


meta_data = pd.read_csv("Meta_Data_220105.csv")
meta_data


file_path action csv_file_path padded_file_name
0 ./Train_Data\1_Finger_Click\Video_Test_10 (2).mp4 1_Finger_Click ./Train_Data\1_Finger_Click\Video_Test_10 (2).csv ./Train_Data\1_Finger_Click\Video_Test_10 (2)_...
1 ./Train_Data\1_Finger_Click\Video_Test_10 (3).mp4 1_Finger_Click ./Train_Data\1_Finger_Click\Video_Test_10 (3).csv ./Train_Data\1_Finger_Click\Video_Test_10 (3)_...
2 ./Train_Data\1_Finger_Click\Video_Test_10 (4).mp4 1_Finger_Click ./Train_Data\1_Finger_Click\Video_Test_10 (4).csv ./Train_Data\1_Finger_Click\Video_Test_10 (4)_...
3 ./Train_Data\1_Finger_Click\Video_Test_10.mp4 1_Finger_Click ./Train_Data\1_Finger_Click\Video_Test_10.csv ./Train_Data\1_Finger_Click\Video_Test_10_padd...
4 ./Train_Data\1_Finger_Click\Video_Test_11 (2).mp4 1_Finger_Click ./Train_Data\1_Finger_Click\Video_Test_11 (2).csv ./Train_Data\1_Finger_Click\Video_Test_11 (2)_...
... ... ... ... ...
384 ./Train_Data\Shake_Hand\Video_Test_8.mp4 Shake_Hand ./Train_Data\Shake_Hand\Video_Test_8.csv ./Train_Data\Shake_Hand\Video_Test_8_padded.csv
385 ./Train_Data\Shake_Hand\Video_Test_9 (2).mp4 Shake_Hand ./Train_Data\Shake_Hand\Video_Test_9 (2).csv ./Train_Data\Shake_Hand\Video_Test_9 (2)_padde...
386 ./Train_Data\Shake_Hand\Video_Test_9 (3).mp4 Shake_Hand ./Train_Data\Shake_Hand\Video_Test_9 (3).csv ./Train_Data\Shake_Hand\Video_Test_9 (3)_padde...
387 ./Train_Data\Shake_Hand\Video_Test_9 (4).mp4 Shake_Hand ./Train_Data\Shake_Hand\Video_Test_9 (4).csv ./Train_Data\Shake_Hand\Video_Test_9 (4)_padde...
388 ./Train_Data\Shake_Hand\Video_Test_9.mp4 Shake_Hand ./Train_Data\Shake_Hand\Video_Test_9.csv ./Train_Data\Shake_Hand\Video_Test_9_padded.csv

389 rows × 4 columns


file_list = meta_data['padded_file_name'].tolist()
action = meta_data['action'].tolist()


print(len(file_list) , len(action))
389 389
  • 4개의 Gesture Set의 총 개수는 389개입니다.


  • 389개 Hand Land Mark Feature 정보를 모두 읽어서 하나로 만듭니다.


train_data = []
target_action = []

for idx,file in enumerate( file_list ):
    d = pd.read_csv(file)
    d = np.array(d)
    train_data.append(d)
    target_action.append(action[idx])


train_data = np.array(train_data)


  • ( 전체 Train File 수 X Frame 수 X Feature 수 ) = (389, 115, 63)
train_data.shape


(389, 115, 63)


  • Target 값을 One-Hot으로 Encoding합니다.
np.unique(target_action)
array(['1_Finger_Click', '2_Fingers_Left', '2_Fingers_Right',
       'Shake_Hand'], dtype='<U15')
le = LabelEncoder()
le_action = le.fit(target_action)
le_action = le.transform(target_action)
y = tf.keras.utils.to_categorical(le_action, num_classes=4)
y
array([[1., 0., 0., 0.],
       [1., 0., 0., 0.],
       [1., 0., 0., 0.],
       ...,
       [0., 0., 0., 1.],
       [0., 0., 0., 1.],
       [0., 0., 0., 1.]], dtype=float32)


  • One-Hot으로 Encoding후에 어떻게 Mapping되었는지 확인하는 방법은 아래와 같습니다.
le.classes_


array(['1_Finger_Click', '2_Fingers_Left', '2_Fingers_Right',
       'Shake_Hand'], dtype='<U15')


  • Train / Test로 나눕니다.


  • stratify Parameter는 설정한 값을 Train / Test Set에 동일한 비율로 나눠지도록 해줍니다.
X_train, X_test, y_train, y_test = train_test_split(train_data, y, test_size=0.25 , stratify = y)


print( X_train.shape )
print( X_test.shape)
(291, 115, 63)
(98, 115, 63)
print( y_train.shape )
print( y_test.shape)
(291, 4)
(98, 4)




3. Define Model


  • Model은 구조는 LSTM을 Base로 하는 구조로 만듭니다.


  • 앞에서 하나의 Video File을 ( 115 , 63 ) 크기로 Input Data를 만들어두었고, 이를 그대로 LSTM Input으로 넣습니다.


  • Model은 전체 Frame의 전후 관계를 학습하며, Dense Layer를 거쳐 최종적으로 각 동작으로 Mapping되도록 학습하는 과정을 거칩니다.



def Define_Model_Rev_02():
    model = Sequential()
    model.add(Bidirectional(LSTM(128, return_sequences=True, activation='tanh', input_shape=(DATA_FRAMES_PER_DATA,63))))
    model.add(Bidirectional(LSTM(64, return_sequences=True, activation='tanh')))
    model.add(Bidirectional(LSTM(32, return_sequences=False, activation='tanh')))
    model.add(Dense(64, activation='relu'))
    model.add(Dense(32, activation='relu'))
    model.add(Dense(4, activation='softmax'))

    return model


  • Tensorflow의 Bug인 것 같은데, LSTM의 Activation Function으로 Relu를 사용하면 Warning이 발생하고, Train이 잘 되지 않는 문제가 생기더군요.


  • Relu와 유사한 Tanh을 사용하면 그런 문제는 없어집니다만, 빨리 문제가 수정이 되었으면 좋겠습니다.


model = Define_Model_Rev_02()
model.compile(
    optimizer=tf.keras.optimizers.Adam(1e-3),
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

model.build( input_shape=(None, DATA_FRAMES_PER_DATA,63) )
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
bidirectional (Bidirectional (None, 115, 256)          196608    
_________________________________________________________________
bidirectional_1 (Bidirection (None, 115, 128)          164352    
_________________________________________________________________
bidirectional_2 (Bidirection (None, 64)                41216     
_________________________________________________________________
dense (Dense)                (None, 64)                4160      
_________________________________________________________________
dense_1 (Dense)              (None, 32)                2080      
_________________________________________________________________
dense_2 (Dense)              (None, 4)                 132       
=================================================================
Total params: 408,548
Trainable params: 408,548
Non-trainable params: 0
_________________________________________________________________


  • Check Point & Tensorboard 관련 설정을 합니다.
log_dir = os.path.join('Logs')
CHECKPOINT_PATH = os.path.join('CheckPoints_Hand_Gesture_Ver_00')
tb_callback = TensorBoard(log_dir=log_dir)

cp = ModelCheckpoint(filepath=CHECKPOINT_PATH, 
                     monitor='val_accuracy',                     
                     save_best_only = True,
                     verbose = 1)


  • 순조롭게 Training이 진행이 되는군요.
model.fit(  X_train, y_train, 
            validation_data=(X_test , y_test),
            epochs=2000, 
            callbacks=[cp , tb_callback]
         )
Epoch 1/2000
10/10 [==============================] - 7s 181ms/step - loss: 1.3401 - accuracy: 0.4124 - val_loss: 1.2626 - val_accuracy: 0.5000

Epoch 00001: val_accuracy improved from -inf to 0.50000, saving model to CheckPoints_Hand_Gesture_Ver_00


WARNING:absl:Found untraced functions such as lstm_cell_1_layer_call_and_return_conditional_losses, lstm_cell_1_layer_call_fn, lstm_cell_2_layer_call_and_return_conditional_losses, lstm_cell_2_layer_call_fn, lstm_cell_4_layer_call_and_return_conditional_losses while saving (showing 5 of 30). These functions will not be directly callable after loading.


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


Epoch 2/2000
10/10 [==============================] - 0s 42ms/step - loss: 1.1994 - accuracy: 0.4845 - val_loss: 1.2533 - val_accuracy: 0.4082

Epoch 00002: val_accuracy did not improve from 0.50000
Epoch 3/2000
10/10 [==============================] - 0s 42ms/step - loss: 1.0992 - accuracy: 0.5258 - val_loss: 1.1289 - val_accuracy: 0.4388

Epoch 00003: val_accuracy did not improve from 0.50000
Epoch 4/2000
10/10 [==============================] - 0s 41ms/step - loss: 0.9655 - accuracy: 0.6151 - val_loss: 0.9343 - val_accuracy: 0.5102

Epoch 00004: val_accuracy improved from 0.50000 to 0.51020, saving model to CheckPoints_Hand_Gesture_Ver_00


WARNING:absl:Found untraced functions such as lstm_cell_1_layer_call_and_return_conditional_losses, lstm_cell_1_layer_call_fn, lstm_cell_2_layer_call_and_return_conditional_losses, lstm_cell_2_layer_call_fn, lstm_cell_4_layer_call_and_return_conditional_losses while saving (showing 5 of 30). These functions will not be directly callable after loading.


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


Epoch 5/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.8116 - accuracy: 0.7251 - val_loss: 0.8239 - val_accuracy: 0.6122

Epoch 00005: val_accuracy improved from 0.51020 to 0.61224, saving model to CheckPoints_Hand_Gesture_Ver_00


WARNING:absl:Found untraced functions such as lstm_cell_1_layer_call_and_return_conditional_losses, lstm_cell_1_layer_call_fn, lstm_cell_2_layer_call_and_return_conditional_losses, lstm_cell_2_layer_call_fn, lstm_cell_4_layer_call_and_return_conditional_losses while saving (showing 5 of 30). These functions will not be directly callable after loading.


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


Epoch 6/2000
10/10 [==============================] - 0s 43ms/step - loss: 0.6971 - accuracy: 0.7388 - val_loss: 0.5423 - val_accuracy: 0.8163

Epoch 00006: val_accuracy improved from 0.61224 to 0.81633, saving model to CheckPoints_Hand_Gesture_Ver_00


WARNING:absl:Found untraced functions such as lstm_cell_1_layer_call_and_return_conditional_losses, lstm_cell_1_layer_call_fn, lstm_cell_2_layer_call_and_return_conditional_losses, lstm_cell_2_layer_call_fn, lstm_cell_4_layer_call_and_return_conditional_losses while saving (showing 5 of 30). These functions will not be directly callable after loading.


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


Epoch 7/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.6130 - accuracy: 0.7801 - val_loss: 0.4424 - val_accuracy: 0.8571

Epoch 00007: val_accuracy improved from 0.81633 to 0.85714, saving model to CheckPoints_Hand_Gesture_Ver_00


WARNING:absl:Found untraced functions such as lstm_cell_1_layer_call_and_return_conditional_losses, lstm_cell_1_layer_call_fn, lstm_cell_2_layer_call_and_return_conditional_losses, lstm_cell_2_layer_call_fn, lstm_cell_4_layer_call_and_return_conditional_losses while saving (showing 5 of 30). These functions will not be directly callable after loading.


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


Epoch 8/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.4498 - accuracy: 0.8763 - val_loss: 0.3313 - val_accuracy: 0.8980

Epoch 00008: val_accuracy improved from 0.85714 to 0.89796, saving model to CheckPoints_Hand_Gesture_Ver_00


WARNING:absl:Found untraced functions such as lstm_cell_1_layer_call_and_return_conditional_losses, lstm_cell_1_layer_call_fn, lstm_cell_2_layer_call_and_return_conditional_losses, lstm_cell_2_layer_call_fn, lstm_cell_4_layer_call_and_return_conditional_losses while saving (showing 5 of 30). These functions will not be directly callable after loading.


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


Epoch 9/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.6163 - accuracy: 0.7869 - val_loss: 0.3195 - val_accuracy: 0.9082

Epoch 00009: val_accuracy improved from 0.89796 to 0.90816, saving model to CheckPoints_Hand_Gesture_Ver_00


WARNING:absl:Found untraced functions such as lstm_cell_1_layer_call_and_return_conditional_losses, lstm_cell_1_layer_call_fn, lstm_cell_2_layer_call_and_return_conditional_losses, lstm_cell_2_layer_call_fn, lstm_cell_4_layer_call_and_return_conditional_losses while saving (showing 5 of 30). These functions will not be directly callable after loading.


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


Epoch 10/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.4396 - accuracy: 0.8419 - val_loss: 0.3986 - val_accuracy: 0.8673

Epoch 00010: val_accuracy did not improve from 0.90816
Epoch 11/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.4750 - accuracy: 0.8351 - val_loss: 0.4060 - val_accuracy: 0.8571

Epoch 00011: val_accuracy did not improve from 0.90816
Epoch 12/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.3731 - accuracy: 0.8763 - val_loss: 0.3412 - val_accuracy: 0.8776

Epoch 00012: val_accuracy did not improve from 0.90816
Epoch 13/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.3067 - accuracy: 0.9175 - val_loss: 0.3185 - val_accuracy: 0.8878

Epoch 00013: val_accuracy did not improve from 0.90816
Epoch 14/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.3288 - accuracy: 0.8900 - val_loss: 0.2752 - val_accuracy: 0.9082

Epoch 00014: val_accuracy did not improve from 0.90816
Epoch 15/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.2713 - accuracy: 0.9038 - val_loss: 0.3092 - val_accuracy: 0.9082

Epoch 00015: val_accuracy did not improve from 0.90816
Epoch 16/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.2607 - accuracy: 0.9244 - val_loss: 0.2166 - val_accuracy: 0.9388

Epoch 00016: val_accuracy improved from 0.90816 to 0.93878, saving model to CheckPoints_Hand_Gesture_Ver_00


WARNING:absl:Found untraced functions such as lstm_cell_1_layer_call_and_return_conditional_losses, lstm_cell_1_layer_call_fn, lstm_cell_2_layer_call_and_return_conditional_losses, lstm_cell_2_layer_call_fn, lstm_cell_4_layer_call_and_return_conditional_losses while saving (showing 5 of 30). These functions will not be directly callable after loading.


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


Epoch 17/2000
10/10 [==============================] - 0s 43ms/step - loss: 0.2057 - accuracy: 0.9278 - val_loss: 0.2626 - val_accuracy: 0.9184

Epoch 00017: val_accuracy did not improve from 0.93878
Epoch 18/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.2150 - accuracy: 0.9210 - val_loss: 0.2156 - val_accuracy: 0.9184

Epoch 00018: val_accuracy did not improve from 0.93878
Epoch 19/2000
10/10 [==============================] - 0s 43ms/step - loss: 0.2423 - accuracy: 0.9278 - val_loss: 0.2134 - val_accuracy: 0.9388

Epoch 00019: val_accuracy did not improve from 0.93878
Epoch 20/2000
10/10 [==============================] - 0s 39ms/step - loss: 0.2297 - accuracy: 0.9278 - val_loss: 0.1725 - val_accuracy: 0.9592

Epoch 00020: val_accuracy improved from 0.93878 to 0.95918, saving model to CheckPoints_Hand_Gesture_Ver_00


WARNING:absl:Found untraced functions such as lstm_cell_1_layer_call_and_return_conditional_losses, lstm_cell_1_layer_call_fn, lstm_cell_2_layer_call_and_return_conditional_losses, lstm_cell_2_layer_call_fn, lstm_cell_4_layer_call_and_return_conditional_losses while saving (showing 5 of 30). These functions will not be directly callable after loading.


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


Epoch 21/2000
10/10 [==============================] - 0s 43ms/step - loss: 0.1405 - accuracy: 0.9656 - val_loss: 0.1253 - val_accuracy: 0.9694

Epoch 00021: val_accuracy improved from 0.95918 to 0.96939, saving model to CheckPoints_Hand_Gesture_Ver_00


WARNING:absl:Found untraced functions such as lstm_cell_1_layer_call_and_return_conditional_losses, lstm_cell_1_layer_call_fn, lstm_cell_2_layer_call_and_return_conditional_losses, lstm_cell_2_layer_call_fn, lstm_cell_4_layer_call_and_return_conditional_losses while saving (showing 5 of 30). These functions will not be directly callable after loading.


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


Epoch 22/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.1602 - accuracy: 0.9416 - val_loss: 0.1779 - val_accuracy: 0.9388

Epoch 00022: val_accuracy did not improve from 0.96939
Epoch 23/2000
10/10 [==============================] - 0s 44ms/step - loss: 0.1561 - accuracy: 0.9450 - val_loss: 0.0920 - val_accuracy: 0.9796

Epoch 00023: val_accuracy improved from 0.96939 to 0.97959, saving model to CheckPoints_Hand_Gesture_Ver_00


WARNING:absl:Found untraced functions such as lstm_cell_1_layer_call_and_return_conditional_losses, lstm_cell_1_layer_call_fn, lstm_cell_2_layer_call_and_return_conditional_losses, lstm_cell_2_layer_call_fn, lstm_cell_4_layer_call_and_return_conditional_losses while saving (showing 5 of 30). These functions will not be directly callable after loading.


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


Epoch 24/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.1114 - accuracy: 0.9691 - val_loss: 0.1326 - val_accuracy: 0.9490

Epoch 00024: val_accuracy did not improve from 0.97959
Epoch 25/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.1194 - accuracy: 0.9553 - val_loss: 0.1855 - val_accuracy: 0.9490

Epoch 00025: val_accuracy did not improve from 0.97959
Epoch 26/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.5457 - accuracy: 0.8591 - val_loss: 0.6200 - val_accuracy: 0.7959

Epoch 00026: val_accuracy did not improve from 0.97959
Epoch 27/2000
10/10 [==============================] - 0s 40ms/step - loss: 0.3533 - accuracy: 0.9003 - val_loss: 0.6065 - val_accuracy: 0.7449

Epoch 00027: val_accuracy did not improve from 0.97959
Epoch 28/2000
10/10 [==============================] - 0s 41ms/step - loss: 0.2984 - accuracy: 0.8832 - val_loss: 0.3315 - val_accuracy: 0.8878

Epoch 00028: val_accuracy did not improve from 0.97959
Epoch 29/2000
10/10 [==============================] - 0s 41ms/step - loss: 0.2879 - accuracy: 0.9175 - val_loss: 0.4583 - val_accuracy: 0.8469

Epoch 00029: val_accuracy did not improve from 0.97959
Epoch 30/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.2127 - accuracy: 0.9313 - val_loss: 0.1830 - val_accuracy: 0.9490

Epoch 00030: val_accuracy did not improve from 0.97959
Epoch 31/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.1398 - accuracy: 0.9622 - val_loss: 0.1254 - val_accuracy: 0.9694

Epoch 00031: val_accuracy did not improve from 0.97959
Epoch 32/2000
10/10 [==============================] - 0s 41ms/step - loss: 0.0754 - accuracy: 0.9759 - val_loss: 0.1265 - val_accuracy: 0.9490

Epoch 00032: val_accuracy did not improve from 0.97959
Epoch 33/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.1338 - accuracy: 0.9622 - val_loss: 0.1827 - val_accuracy: 0.9388

Epoch 00033: val_accuracy did not improve from 0.97959
Epoch 34/2000
10/10 [==============================] - 0s 41ms/step - loss: 0.1562 - accuracy: 0.9588 - val_loss: 0.1647 - val_accuracy: 0.9490

Epoch 00034: val_accuracy did not improve from 0.97959
Epoch 35/2000
10/10 [==============================] - 0s 39ms/step - loss: 0.1652 - accuracy: 0.9519 - val_loss: 0.1364 - val_accuracy: 0.9490

Epoch 00035: val_accuracy did not improve from 0.97959
Epoch 36/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.1466 - accuracy: 0.9553 - val_loss: 0.2282 - val_accuracy: 0.9388

Epoch 00036: val_accuracy did not improve from 0.97959
Epoch 37/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.1387 - accuracy: 0.9725 - val_loss: 0.1778 - val_accuracy: 0.9592

Epoch 00037: val_accuracy did not improve from 0.97959
Epoch 38/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.0971 - accuracy: 0.9725 - val_loss: 0.3873 - val_accuracy: 0.9082

Epoch 00038: val_accuracy did not improve from 0.97959
Epoch 39/2000
10/10 [==============================] - 0s 44ms/step - loss: 0.1060 - accuracy: 0.9691 - val_loss: 0.0948 - val_accuracy: 0.9796

Epoch 00039: val_accuracy did not improve from 0.97959
Epoch 40/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.0561 - accuracy: 0.9828 - val_loss: 0.0627 - val_accuracy: 0.9796

Epoch 00040: val_accuracy did not improve from 0.97959
Epoch 41/2000
10/10 [==============================] - 0s 41ms/step - loss: 0.0489 - accuracy: 0.9897 - val_loss: 0.1453 - val_accuracy: 0.9490

Epoch 00041: val_accuracy did not improve from 0.97959
Epoch 42/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.0452 - accuracy: 0.9897 - val_loss: 0.0613 - val_accuracy: 0.9796

Epoch 00042: val_accuracy did not improve from 0.97959
Epoch 43/2000
10/10 [==============================] - 0s 41ms/step - loss: 0.0339 - accuracy: 0.9897 - val_loss: 0.0316 - val_accuracy: 0.9898

Epoch 00043: val_accuracy improved from 0.97959 to 0.98980, saving model to CheckPoints_Hand_Gesture_Ver_00


WARNING:absl:Found untraced functions such as lstm_cell_1_layer_call_and_return_conditional_losses, lstm_cell_1_layer_call_fn, lstm_cell_2_layer_call_and_return_conditional_losses, lstm_cell_2_layer_call_fn, lstm_cell_4_layer_call_and_return_conditional_losses while saving (showing 5 of 30). These functions will not be directly callable after loading.


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


Epoch 44/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.0228 - accuracy: 0.9966 - val_loss: 0.0231 - val_accuracy: 1.0000

Epoch 00044: val_accuracy improved from 0.98980 to 1.00000, saving model to CheckPoints_Hand_Gesture_Ver_00


WARNING:absl:Found untraced functions such as lstm_cell_1_layer_call_and_return_conditional_losses, lstm_cell_1_layer_call_fn, lstm_cell_2_layer_call_and_return_conditional_losses, lstm_cell_2_layer_call_fn, lstm_cell_4_layer_call_and_return_conditional_losses while saving (showing 5 of 30). These functions will not be directly callable after loading.


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


INFO:tensorflow:Assets written to: CheckPoints_Hand_Gesture_Ver_00\assets


Epoch 45/2000
10/10 [==============================] - 0s 43ms/step - loss: 0.0120 - accuracy: 1.0000 - val_loss: 0.0179 - val_accuracy: 1.0000

Epoch 00045: val_accuracy did not improve from 1.00000
Epoch 46/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.0105 - accuracy: 0.9966 - val_loss: 0.0130 - val_accuracy: 1.0000

Epoch 00046: val_accuracy did not improve from 1.00000
Epoch 47/2000
10/10 [==============================] - 0s 41ms/step - loss: 0.0092 - accuracy: 1.0000 - val_loss: 0.0118 - val_accuracy: 1.0000

Epoch 00047: val_accuracy did not improve from 1.00000
Epoch 48/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.0062 - accuracy: 1.0000 - val_loss: 0.0086 - val_accuracy: 1.0000

Epoch 00048: val_accuracy did not improve from 1.00000
Epoch 49/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.0047 - accuracy: 1.0000 - val_loss: 0.0068 - val_accuracy: 1.0000

Epoch 00049: val_accuracy did not improve from 1.00000
Epoch 50/2000
10/10 [==============================] - 0s 41ms/step - loss: 0.0037 - accuracy: 1.0000 - val_loss: 0.0056 - val_accuracy: 1.0000

Epoch 00050: val_accuracy did not improve from 1.00000
Epoch 51/2000
10/10 [==============================] - 0s 39ms/step - loss: 0.0031 - accuracy: 1.0000 - val_loss: 0.0045 - val_accuracy: 1.0000

Epoch 00051: val_accuracy did not improve from 1.00000
Epoch 52/2000
10/10 [==============================] - 0s 42ms/step - loss: 0.0026 - accuracy: 1.0000 - val_loss: 0.0038 - val_accuracy: 1.0000

Epoch 00052: val_accuracy did not improve from 1.00000
Epoch 53/2000
10/10 [==============================] - 0s 43ms/step - loss: 0.0022 - accuracy: 1.0000 - val_loss: 0.0033 - val_accuracy: 1.0000

Epoch 00053: val_accuracy did not improve from 1.00000
Epoch 54/2000
10/10 [==============================] - 0s 40ms/step - loss: 0.0019 - accuracy: 1.0000 - val_loss: 0.0029 - val_accuracy: 1.0000

Epoch 00054: val_accuracy did not improve from 1.00000
Epoch 55/2000
10/10 [==============================] - 0s 43ms/step - loss: 0.0017 - accuracy: 1.0000 - val_loss: 0.0026 - val_accuracy: 1.0000

Epoch 00055: val_accuracy did not improve from 1.00000
Epoch 56/2000
10/10 [==============================] - 0s 45ms/step - loss: 0.0015 - accuracy: 1.0000 - val_loss: 0.0023 - val_accuracy: 1.0000

Epoch 00056: val_accuracy did not improve from 1.00000
Epoch 57/2000
10/10 [==============================] - 0s 44ms/step - loss: 0.0014 - accuracy: 1.0000 - val_loss: 0.0020 - val_accuracy: 1.0000

Epoch 00057: val_accuracy did not improve from 1.00000
Epoch 58/2000
10/10 [==============================] - 0s 43ms/step - loss: 0.0012 - accuracy: 1.0000 - val_loss: 0.0019 - val_accuracy: 1.0000

Epoch 00058: val_accuracy did not improve from 1.00000
Epoch 59/2000
10/10 [==============================] - 0s 40ms/step - loss: 0.0011 - accuracy: 1.0000 - val_loss: 0.0017 - val_accuracy: 1.0000

Epoch 00059: val_accuracy did not improve from 1.00000
Epoch 60/2000
10/10 [==============================] - 0s 40ms/step - loss: 0.0010 - accuracy: 1.0000 - val_loss: 0.0016 - val_accuracy: 1.0000

Epoch 00060: val_accuracy did not improve from 1.00000
Epoch 61/2000
10/10 [==============================] - 0s 43ms/step - loss: 9.6202e-04 - accuracy: 1.0000 - val_loss: 0.0015 - val_accuracy: 1.0000

Epoch 00061: val_accuracy did not improve from 1.00000
Epoch 62/2000
10/10 [==============================] - 0s 41ms/step - loss: 8.9064e-04 - accuracy: 1.0000 - val_loss: 0.0013 - val_accuracy: 1.0000

Epoch 00062: val_accuracy did not improve from 1.00000
Epoch 63/2000
10/10 [==============================] - 0s 41ms/step - loss: 8.2291e-04 - accuracy: 1.0000 - val_loss: 0.0013 - val_accuracy: 1.0000

Epoch 00063: val_accuracy did not improve from 1.00000
Epoch 64/2000
10/10 [==============================] - 0s 42ms/step - loss: 7.7714e-04 - accuracy: 1.0000 - val_loss: 0.0011 - val_accuracy: 1.0000

Epoch 00064: val_accuracy did not improve from 1.00000
Epoch 65/2000
10/10 [==============================] - 0s 43ms/step - loss: 7.1956e-04 - accuracy: 1.0000 - val_loss: 0.0011 - val_accuracy: 1.0000

Epoch 00065: val_accuracy did not improve from 1.00000
Epoch 66/2000
10/10 [==============================] - 0s 43ms/step - loss: 6.7171e-04 - accuracy: 1.0000 - val_loss: 9.9315e-04 - val_accuracy: 1.0000

Epoch 00066: val_accuracy did not improve from 1.00000
Epoch 67/2000
10/10 [==============================] - 0s 42ms/step - loss: 6.3440e-04 - accuracy: 1.0000 - val_loss: 9.2510e-04 - val_accuracy: 1.0000

Epoch 00067: val_accuracy did not improve from 1.00000
Epoch 68/2000
10/10 [==============================] - 0s 42ms/step - loss: 5.9452e-04 - accuracy: 1.0000 - val_loss: 8.8794e-04 - val_accuracy: 1.0000

Epoch 00068: val_accuracy did not improve from 1.00000
Epoch 69/2000
10/10 [==============================] - 0s 43ms/step - loss: 5.6366e-04 - accuracy: 1.0000 - val_loss: 8.2888e-04 - val_accuracy: 1.0000

Epoch 00069: val_accuracy did not improve from 1.00000
Epoch 70/2000
10/10 [==============================] - 0s 41ms/step - loss: 5.3337e-04 - accuracy: 1.0000 - val_loss: 7.8085e-04 - val_accuracy: 1.0000

Epoch 00070: val_accuracy did not improve from 1.00000
Epoch 71/2000
10/10 [==============================] - 0s 43ms/step - loss: 5.0668e-04 - accuracy: 1.0000 - val_loss: 7.4026e-04 - val_accuracy: 1.0000

Epoch 00071: val_accuracy did not improve from 1.00000
Epoch 72/2000
10/10 [==============================] - 0s 43ms/step - loss: 4.8384e-04 - accuracy: 1.0000 - val_loss: 7.0405e-04 - val_accuracy: 1.0000

Epoch 00072: val_accuracy did not improve from 1.00000
Epoch 73/2000
10/10 [==============================] - 0s 42ms/step - loss: 4.6091e-04 - accuracy: 1.0000 - val_loss: 6.7255e-04 - val_accuracy: 1.0000

Epoch 00073: val_accuracy did not improve from 1.00000
Epoch 74/2000
10/10 [==============================] - 0s 45ms/step - loss: 4.4084e-04 - accuracy: 1.0000 - val_loss: 6.4374e-04 - val_accuracy: 1.0000

Epoch 00074: val_accuracy did not improve from 1.00000
Epoch 75/2000
10/10 [==============================] - 0s 42ms/step - loss: 4.2211e-04 - accuracy: 1.0000 - val_loss: 6.1681e-04 - val_accuracy: 1.0000

Epoch 00075: val_accuracy did not improve from 1.00000
Epoch 76/2000
10/10 [==============================] - 0s 42ms/step - loss: 4.0484e-04 - accuracy: 1.0000 - val_loss: 5.9214e-04 - val_accuracy: 1.0000

Epoch 00076: val_accuracy did not improve from 1.00000
Epoch 77/2000
10/10 [==============================] - 0s 42ms/step - loss: 3.8866e-04 - accuracy: 1.0000 - val_loss: 5.6560e-04 - val_accuracy: 1.0000

Epoch 00077: val_accuracy did not improve from 1.00000
Epoch 78/2000
10/10 [==============================] - 0s 40ms/step - loss: 3.7336e-04 - accuracy: 1.0000 - val_loss: 5.4555e-04 - val_accuracy: 1.0000

Epoch 00078: val_accuracy did not improve from 1.00000
Epoch 79/2000
10/10 [==============================] - 0s 41ms/step - loss: 3.5975e-04 - accuracy: 1.0000 - val_loss: 5.2469e-04 - val_accuracy: 1.0000

Epoch 00079: val_accuracy did not improve from 1.00000
Epoch 80/2000
10/10 [==============================] - 0s 43ms/step - loss: 3.4676e-04 - accuracy: 1.0000 - val_loss: 5.0368e-04 - val_accuracy: 1.0000

Epoch 00080: val_accuracy did not improve from 1.00000
Epoch 81/2000
10/10 [==============================] - 0s 40ms/step - loss: 3.3333e-04 - accuracy: 1.0000 - val_loss: 4.8990e-04 - val_accuracy: 1.0000

Epoch 00081: val_accuracy did not improve from 1.00000
Epoch 82/2000
10/10 [==============================] - 0s 42ms/step - loss: 3.2246e-04 - accuracy: 1.0000 - val_loss: 4.7290e-04 - val_accuracy: 1.0000

Epoch 00082: val_accuracy did not improve from 1.00000
Epoch 83/2000
10/10 [==============================] - 0s 42ms/step - loss: 3.1188e-04 - accuracy: 1.0000 - val_loss: 4.5597e-04 - val_accuracy: 1.0000

Epoch 00083: val_accuracy did not improve from 1.00000
Epoch 84/2000
10/10 [==============================] - 0s 42ms/step - loss: 3.0094e-04 - accuracy: 1.0000 - val_loss: 4.4185e-04 - val_accuracy: 1.0000

Epoch 00084: val_accuracy did not improve from 1.00000
Epoch 85/2000
10/10 [==============================] - 0s 42ms/step - loss: 2.9148e-04 - accuracy: 1.0000 - val_loss: 4.2189e-04 - val_accuracy: 1.0000

Epoch 00085: val_accuracy did not improve from 1.00000
Epoch 86/2000
10/10 [==============================] - 0s 43ms/step - loss: 2.8073e-04 - accuracy: 1.0000 - val_loss: 3.7538e-04 - val_accuracy: 1.0000

Epoch 00086: val_accuracy did not improve from 1.00000
Epoch 87/2000
10/10 [==============================] - 0s 42ms/step - loss: 2.7194e-04 - accuracy: 1.0000 - val_loss: 3.5864e-04 - val_accuracy: 1.0000

Epoch 00087: val_accuracy did not improve from 1.00000
Epoch 88/2000
10/10 [==============================] - 0s 41ms/step - loss: 2.6130e-04 - accuracy: 1.0000 - val_loss: 3.4925e-04 - val_accuracy: 1.0000

Epoch 00088: val_accuracy did not improve from 1.00000
Epoch 89/2000
10/10 [==============================] - 0s 43ms/step - loss: 2.5341e-04 - accuracy: 1.0000 - val_loss: 3.3956e-04 - val_accuracy: 1.0000

Epoch 00089: val_accuracy did not improve from 1.00000
Epoch 90/2000
10/10 [==============================] - 0s 42ms/step - loss: 2.4571e-04 - accuracy: 1.0000 - val_loss: 3.1883e-04 - val_accuracy: 1.0000

Epoch 00090: val_accuracy did not improve from 1.00000
Epoch 91/2000
10/10 [==============================] - 0s 42ms/step - loss: 2.3662e-04 - accuracy: 1.0000 - val_loss: 3.0886e-04 - val_accuracy: 1.0000

Epoch 00091: val_accuracy did not improve from 1.00000
Epoch 92/2000
10/10 [==============================] - 0s 41ms/step - loss: 2.3005e-04 - accuracy: 1.0000 - val_loss: 3.0076e-04 - val_accuracy: 1.0000

Epoch 00092: val_accuracy did not improve from 1.00000
Epoch 93/2000
10/10 [==============================] - 0s 43ms/step - loss: 2.2287e-04 - accuracy: 1.0000 - val_loss: 2.9805e-04 - val_accuracy: 1.0000

Epoch 00093: val_accuracy did not improve from 1.00000
Epoch 94/2000
10/10 [==============================] - 0s 41ms/step - loss: 2.1641e-04 - accuracy: 1.0000 - val_loss: 2.9316e-04 - val_accuracy: 1.0000

Epoch 00094: val_accuracy did not improve from 1.00000
Epoch 95/2000
10/10 [==============================] - 0s 43ms/step - loss: 2.1044e-04 - accuracy: 1.0000 - val_loss: 2.8779e-04 - val_accuracy: 1.0000

Epoch 00095: val_accuracy did not improve from 1.00000
Epoch 96/2000
10/10 [==============================] - 0s 42ms/step - loss: 2.0531e-04 - accuracy: 1.0000 - val_loss: 2.8114e-04 - val_accuracy: 1.0000

Epoch 00096: val_accuracy did not improve from 1.00000
Epoch 97/2000
10/10 [==============================] - 0s 42ms/step - loss: 1.9977e-04 - accuracy: 1.0000 - val_loss: 2.7443e-04 - val_accuracy: 1.0000

Epoch 00097: val_accuracy did not improve from 1.00000
Epoch 98/2000
10/10 [==============================] - 0s 41ms/step - loss: 1.9424e-04 - accuracy: 1.0000 - val_loss: 2.6919e-04 - val_accuracy: 1.0000

Epoch 00098: val_accuracy did not improve from 1.00000
Epoch 99/2000
10/10 [==============================] - 0s 42ms/step - loss: 1.8926e-04 - accuracy: 1.0000 - val_loss: 2.6381e-04 - val_accuracy: 1.0000

Epoch 00099: val_accuracy did not improve from 1.00000
Epoch 100/2000
10/10 [==============================] - 0s 41ms/step - loss: 1.8432e-04 - accuracy: 1.0000 - val_loss: 2.5892e-04 - val_accuracy: 1.0000

Epoch 00100: val_accuracy did not improve from 1.00000
Epoch 101/2000
10/10 [==============================] - 0s 42ms/step - loss: 1.7980e-04 - accuracy: 1.0000 - val_loss: 2.5380e-04 - val_accuracy: 1.0000

Epoch 00101: val_accuracy did not improve from 1.00000
Epoch 102/2000
10/10 [==============================] - 0s 43ms/step - loss: 1.7530e-04 - accuracy: 1.0000 - val_loss: 2.4898e-04 - val_accuracy: 1.0000

Epoch 00102: val_accuracy did not improve from 1.00000
Epoch 103/2000
10/10 [==============================] - 0s 42ms/step - loss: 1.7097e-04 - accuracy: 1.0000 - val_loss: 2.4421e-04 - val_accuracy: 1.0000

Epoch 00103: val_accuracy did not improve from 1.00000
Epoch 104/2000
10/10 [==============================] - 0s 42ms/step - loss: 1.6679e-04 - accuracy: 1.0000 - val_loss: 2.3982e-04 - val_accuracy: 1.0000

Epoch 00104: val_accuracy did not improve from 1.00000
Epoch 105/2000
10/10 [==============================] - 0s 40ms/step - loss: 1.6286e-04 - accuracy: 1.0000 - val_loss: 2.3554e-04 - val_accuracy: 1.0000

Epoch 00105: val_accuracy did not improve from 1.00000
Epoch 106/2000
10/10 [==============================] - 0s 43ms/step - loss: 1.5919e-04 - accuracy: 1.0000 - val_loss: 2.3038e-04 - val_accuracy: 1.0000

Epoch 00106: val_accuracy did not improve from 1.00000
Epoch 107/2000
10/10 [==============================] - 0s 41ms/step - loss: 1.5545e-04 - accuracy: 1.0000 - val_loss: 2.2587e-04 - val_accuracy: 1.0000

Epoch 00107: val_accuracy did not improve from 1.00000
Epoch 108/2000
10/10 [==============================] - 0s 43ms/step - loss: 1.5186e-04 - accuracy: 1.0000 - val_loss: 2.2157e-04 - val_accuracy: 1.0000

Epoch 00108: val_accuracy did not improve from 1.00000
Epoch 109/2000
10/10 [==============================] - 0s 43ms/step - loss: 1.4836e-04 - accuracy: 1.0000 - val_loss: 2.1814e-04 - val_accuracy: 1.0000

Epoch 00109: val_accuracy did not improve from 1.00000
Epoch 110/2000
10/10 [==============================] - 0s 43ms/step - loss: 1.4512e-04 - accuracy: 1.0000 - val_loss: 2.1466e-04 - val_accuracy: 1.0000

Epoch 00110: val_accuracy did not improve from 1.00000
Epoch 111/2000
10/10 [==============================] - 0s 41ms/step - loss: 1.4186e-04 - accuracy: 1.0000 - val_loss: 2.0782e-04 - val_accuracy: 1.0000

Epoch 00111: val_accuracy did not improve from 1.00000
Epoch 112/2000
10/10 [==============================] - 0s 42ms/step - loss: 1.3882e-04 - accuracy: 1.0000 - val_loss: 2.0302e-04 - val_accuracy: 1.0000

Epoch 00112: val_accuracy did not improve from 1.00000
Epoch 113/2000
10/10 [==============================] - 0s 44ms/step - loss: 1.3577e-04 - accuracy: 1.0000 - val_loss: 1.9915e-04 - val_accuracy: 1.0000

Epoch 00113: val_accuracy did not improve from 1.00000
Epoch 114/2000
10/10 [==============================] - 0s 43ms/step - loss: 1.3316e-04 - accuracy: 1.0000 - val_loss: 1.9585e-04 - val_accuracy: 1.0000

Epoch 00114: val_accuracy did not improve from 1.00000
Epoch 115/2000
10/10 [==============================] - 0s 44ms/step - loss: 1.3010e-04 - accuracy: 1.0000 - val_loss: 1.9300e-04 - val_accuracy: 1.0000

Epoch 00115: val_accuracy did not improve from 1.00000
Epoch 116/2000
10/10 [==============================] - 0s 43ms/step - loss: 1.2741e-04 - accuracy: 1.0000 - val_loss: 1.9016e-04 - val_accuracy: 1.0000

Epoch 00116: val_accuracy did not improve from 1.00000
Epoch 117/2000
10/10 [==============================] - 0s 42ms/step - loss: 1.2485e-04 - accuracy: 1.0000 - val_loss: 1.8784e-04 - val_accuracy: 1.0000

Epoch 00117: val_accuracy did not improve from 1.00000
Epoch 118/2000
10/10 [==============================] - 0s 42ms/step - loss: 1.2242e-04 - accuracy: 1.0000 - val_loss: 1.8558e-04 - val_accuracy: 1.0000

Epoch 00118: val_accuracy did not improve from 1.00000
Epoch 119/2000
10/10 [==============================] - 0s 41ms/step - loss: 1.2003e-04 - accuracy: 1.0000 - val_loss: 1.8294e-04 - val_accuracy: 1.0000

Epoch 00119: val_accuracy did not improve from 1.00000
Epoch 120/2000
10/10 [==============================] - 0s 42ms/step - loss: 1.1733e-04 - accuracy: 1.0000 - val_loss: 1.7990e-04 - val_accuracy: 1.0000

Epoch 00120: val_accuracy did not improve from 1.00000
Epoch 121/2000
 9/10 [==========================>...] - ETA: 0s - loss: 1.1390e-04 - accuracy: 1.0000