簡體   English   中英

如何將新數字手寫體訓練成存在 keras model?

[英]How to train new digits handwriting into exist keras model?

我有一個現有的 model 訓練來識別手寫數字。 然后我有一個新的樣本數字來訓練更多的 model。 有沒有辦法做到這一點?

  import os
  import cv2 as cv
  import numpy as np
  import matplotlib.pyplot as plt
  import tensorflow as tf

  ### train model ###
  mnist = tf.keras.datasets.mnist
  (x_train, y_train), (x_test, y_test) = mnist.load_data()
  x_train = x_train/255
  x_test = x_test/255

  model = tf.keras.models.Sequential()
  model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
  model.add(tf.keras.layers.Dense(units=128,activation=tf.nn.relu))
  model.add(tf.keras.layers.Dense(units=10,activation=tf.nn.softmax))

  model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])

  model.fit(x_train, y_train, epochs=5)
  model.save('traineddata.model')

我的新樣本是這樣的 1 號: 在此處輸入圖像描述

您可以加載圖像,轉換為灰度,調整為(28,28)
並通過一個示例轉換為訓練數組,並將其與fit()一起使用

x_example = cv2.imread('image.png')
x_example = cv2.cvtColor(x_example, cv2.COLOR_BGR2GRAY)
x_example = cv2.resize(x_example, (28, 28))

y_example = 1

x_data = np.array( [ x_example ] )  # it has to be array with shape (1, 28, 28) instead of (28, 28)
y_data = np.array( [ y_example ] )  # it has to be array with shape (1, 1) instead of (1,)

model.fit(x_data, y_data, epochs=5)

但它不能很好地預測epochs=5
對於epochs=10 ,它為該圖像提供了正確的預測,但我沒有檢查它是否仍然為其他圖像提供正確的預測。

也許將圖像添加到x_trainy_train並再次重新訓練會更好。

x_data = np.append(x_train, [x_example], axis=0)
y_data = np.append(y_train, y_example)

model.fit(x_data, y_data, epochs=5)

就像在現實生活中一樣——當你學習新元素時,你最好記住它而不是舊元素。 當您用新元素再次學習所有元素時,您會刷新所有信息並記住所有這些信息。


我用於測試的最小工作代碼。

import warnings

warnings.filterwarnings('ignore')  # hide/supress warnings

import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

### train model ###

def build():
    print('-'*50)
    print('# Building model ')
    print('-'*50)
    
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Flatten(input_shape=(28, 28)))
    model.add(tf.keras.layers.Dense(units=128, activation=tf.nn.relu))
    model.add(tf.keras.layers.Dense(units=10, activation=tf.nn.softmax))
    
    model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])

    return model
    
def train(model, x_train, y_train, epochs=5):
    print('-'*50)
    print('# Training model')
    print('-'*50)
    
    model.fit(x_train, y_train, epochs=epochs)

def save(model):
    print('-'*50)
    print('# Saving model')
    print('-'*50)

    model.save('traineddata.model')

def load():
    print('-'*50)
    print('# Loading model')
    print('-'*50)
    
    return tf.keras.models.load_model('traineddata.model')

def test_one(model, x_example, y_example):
    print('-'*50)
    print('# Testing one element')
    print('-'*50)
    
    # create array with one or more images
    x_data = np.array( [ x_example ] )
    y_data = np.array( [ y_example ] )

    print('x_data shape:', x_data.shape)
    print('y_data shape:', y_data.shape)
    print(' expected:', y_data)

    # get list with one or more predictions
    y_results = model.predict(x_data)

    print('predicted:', y_results.argmax(axis=1))

def retrain_one(model, x_example, y_example, epochs=5):
    print('-'*50)
    print('# Retraining one element')
    print('-'*50)

    # create array with one or more images
    x_data = np.array( [ x_example ] )
    y_data = np.array( [ y_example ] )

    print('x_data shape:', x_data.shape)
    print('y_data shape:', y_data.shape)
    print('y_data:', y_data)

    model.fit(x_data, y_data, epochs=epochs)

def retrain_all(model, x_train, y_train, x_example, y_example, epochs=5):
    print('-'*50)
    print('# Retraining all elements')
    print('-'*50)

    # create array with all images
    x_data = np.append(x_train, [x_example], axis=0)
    y_data = np.append(y_train, y_example)

    print('x_data shape:', x_data.shape)
    print('y_data shape:', y_data.shape)
    print('y_data:', y_data)

    model.fit(x_data, y_data, epochs=epochs)

# --- main ---

# - load train/test images -

print('>>> Loading train/test data ...')
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

x_train = x_train/255
x_test = x_test/255

# - train + save or load -

if not os.path.exists('traineddata.model'):
    print('>>> Building model ...')
    model = build()

    print('>>> Training model ...')
    train(model, x_train, y_train)

    print('>>> Saving model ...')
    save(model)
else:
    print('>>> Loading model ...')
    model = load()

#print(' - test on single example - ')
#index = 0
#test_one(model, x_train[index], y_train[index])

print(' - image - ')

x_example = cv2.imread('image.png')
x_example = cv2.cvtColor(x_example, cv2.COLOR_BGR2GRAY)
x_example = cv2.resize(x_example, (28, 28))

y_example = 1

print('>>> Predicting without training')

test_one(model, x_example, y_example)

print('>>> Predicting with training one element (epochs=10)')

retrain_one(model, x_example, y_example, epochs=10)  # epochs=5 epochs=7
test_one(model, x_example, y_example)

print('>>> Predicting with retraining all elements')

retrain_all(model, x_train, y_train, x_example, y_example)
test_one(model, x_example, y_example)

#print('>>> Saving new model')
#model.save('traineddata.model')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM