作成日: 2021/10/02 更新日: 2023/03/25 サイトの紹介と使い方
概要
- 手書き文字の認識モデルを構築します。
モデルの作成
1グループ対応
共有変数と関数-c001.py
c001.手書き文字-日本語-共有ソースを参照してください。
数字(numbers):011-02.py
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,MaxPooling2D
from tensorflow.keras.layers import Activation,Dropout,Flatten,Dense
from tensorflow.keras.utils import to_categorical
import c001_env as env
def build_model( x_train,nb_classes ):
model = Sequential(
[
Conv2D( 128,3,input_shape=x_train.shape[1:],activation='relu',name='Conv-11' ),
MaxPooling2D( pool_size=(2, 2) ),
Conv2D( 128,3,activation='relu',name='Conv-12' ),
Dropout( 0.3 ),
Conv2D( 64,3,input_shape=x_train.shape[1:],activation='relu',name='Conv-21' ),
MaxPooling2D( pool_size=(2, 2) ),
Conv2D( 64,3,activation='relu',name='Conv-22' ),
Dropout( 0.2 ),
Conv2D( 32,3,input_shape=x_train.shape[1:],activation='relu',name='Conv-31' ),
MaxPooling2D( pool_size=(2, 2) ),
Conv2D( 32,3,activation='relu',name='Conv-32' ),
Dropout( 0.1 ),
Flatten(),
Dense( nb_classes, activation='softmax',name='Dense-class' )
] )
return model
def main():
x_train = np.load( env.npy_x_train,allow_pickle=True)
y_train = np.load( env.npy_y_train,allow_pickle=True)
x_train = x_train.astype( 'float32' ) /255
y_train = to_categorical( y_train,env.nb_classes )
x_test,y_test = env.load_img( env.test_dir )
x_test = x_test.astype( 'float32' ) /255
y_test = to_categorical( y_test,env.nb_classes )
model = build_model( x_train,env.nb_classes )
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
history = model.fit(x_train,y_train, batch_size=5, epochs=20, validation_data=(x_test, y_test),verbose=1 )
json_string = model.to_json()
open( env.fs_json,'w').write(json_string )
model.save_weights( env.fs_hdf5 )
print( 'success' )
main()
カタカナ(katakana):012-02.py
- 数字(numbers)を変更
1. history = model.fit(x_train,y_train, batch_size=20, epochs=100, validation_data=(x_test, y_test),verbose=1 )
変更箇所:batch_size=20, epochs=100
アイウエオカキクケコサシスセソタツテト(チは似た文字対象のため除外)
loss: 9.2774e-04 - acc: 1.0000 - val_loss: 1.0692 - val_acc: 0.9200
Family対応 :012-51.py
共有変数と関数-c002.py
c001.手書き文字-日本語-共有ソースを参照してください。
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D,MaxPooling2D
from tensorflow.keras.layers import Activation,Dropout,Flatten,Dense
from tensorflow.keras.utils import to_categorical
import c002_env as env
def build_model( x_train,nb_classes ):
model = Sequential(
[
Conv2D( 512,3,input_shape=x_train.shape[1:],activation='relu',name='Conv-11' ),
MaxPooling2D( pool_size=(2, 2) ),
Conv2D( 128,3,activation='relu',name='Conv-12' ),
Dropout( 0.3 ),
Conv2D( 64,3,input_shape=x_train.shape[1:],activation='relu',name='Conv-21' ),
MaxPooling2D( pool_size=(2, 2) ),
Conv2D( 64,3,activation='relu',name='Conv-22' ),
Dropout( 0.3 ),
Conv2D( 32,3,input_shape=x_train.shape[1:],activation='relu',name='Conv-31' ),
MaxPooling2D( pool_size=(2, 2) ),
Conv2D( 32,3,activation='relu',name='Conv-32' ),
Dropout( 0.3 ),
Flatten(),
Dense( nb_classes, activation='softmax',name='Dense-class' )
] )
return model
def main():
x_train = np.load( env.npy_x_train,allow_pickle=True)
y_train = np.load( env.npy_y_train,allow_pickle=True)
x_train = x_train.astype( 'float32' ) /255
y_train = to_categorical( y_train,env.nb_classes )
x_test,y_test = env.load_img2( '/test/' )
x_test = x_test.astype( 'float32' ) /255
y_test = to_categorical( y_test,env.nb_classes )
model = build_model( x_train,env.nb_classes )
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
history = model.fit(x_train,y_train, batch_size=20, epochs=100, validation_data=(x_test, y_test),verbose=1 )
json_string = model.to_json()
open( env.fs_json,'w').write(json_string )
model.save_weights( env.fs_hdf5 )
print( 'success' )
main()
前の記事:012-01.手書き文字-日本語の文字画像をnumpyに変換
次の記事:014-01.手書き文字-日本語の文字を外部評価-教師有り