すでに入手したkersモデルを使って、自分の手書きの数字方式を識別します。


環境:Python+kers、バックエンドはTensorflowです。
トレーニングセット:MNIST
手書きの数字を識別する神経ネットをどのように訓練するかについては、ネット上の資源が豊富で、しかもかなり高い精度を達成することができます。しかし、どのように画像をネットに入力し、訓練されたモデルを覚醒させて識別するかに関わる人は少ないです。次に実現方法と注意事項を説明します。
まず、import関連のライブラリはここでは言いません。
訓練されたモデルを導入する必要があります。
model=load_model('cnn')モデル2.h 5'(cnn_)モデル2.h 5をモデル名に置き換える)
その後は写真をインポートします。必要なフォーマットは28*28です。利用可能なopencvのインポート:
img=cv 2.imread('temp 3.png',0)(temp 3.pngを手書きの写真に置き換える)
その後、レレスホープはモデルの入力要求に適合します。
img=(img.reshpe(1,1,28,28).astype(float 32)/255
その後モデルで識別できます。
predicat=model.predicat_クラスes(img)
最後のprintはpredicatでいいです。
次にポイントを書きます。MNISTは黒い底の白い文字の写真を使っていますので、自分で数字を書く時は必ず注意してください。得られた写真を黒い底の白い字に変えてください。でないと、認識が間違ってしまいます。
ソース一覧:

import cv2
import numpy as np
from keras.models import load_model
model = load_model('cnn_model_2.h5')

image = cv2.imread('temp3.png', 0)
img = cv2.imread('temp3.png', 0)

img = (img.reshape(1,1,28,28)).astype("float32")/255
predict = model.predict_classes(img)
print ('   :')
print (predict)

cv2.imshow("Image1", image)
cv2.waitKey(0)
効果図:

知識を補充します:kersはカスタムの階を編纂します。
前に書いたら
私たちが呼び出すために多くのパッケージがありますが、いくつかの時に必要なオペレーティングカーasはないので、この時にはカスタムケアレー層を学ぶ必要があります。
1.Lamband
これは便利ですが、簡単で無状態のカスタム操作しかできません。

from keras.layers import Input,Lambda
from keras import Model
import tensorflow as tf

input=Input(shape=(224,224,3))
input.shape #Input      batchsize  
output=Lambda(lambda x: x[...,1])(input) #          ,...         
Model=Model(inputs=input,outputs=output)
Model.output
2.ケアレスcustom
kersaから中国語の文書を勉強します。

2.   keras (       )
① build:    , self.build=True,        super([layer],self).build()  
② call:      
③ compute_output_shape:       shape

import keras.backend as K
from keras.engine.topology import Layer #   Layer     ,   MyLayer    Layer 

class MyLayer(Layer): #     keras  
 def __init__(self,output_dim,**kwargs): #     
  self.output_dim=output_dim
  super(MyLayer,self).__init__(**kwargs) #           
 def build(self,input_shape): # Mylayer          
  #  add_weight     Mylayer      
  self.kernel=self.add_weight(name='kernel',
         shape=(input_shape[1],self.output_dim), #        shape       
         initializer='uniform',
         trainable=True)
  super(MyLayer,self).build(input_shape) #    ,        
  #self.build=True
 def call(self,x): #call         x      , x      ,         
  return K.dot(x,self.kernel) #    
 def compute_output_shape(self,input_shape):
  return (input_shape[0],self.output_dim) #            output_shape
--------------------------------------------------------------------------------
class Mylayer(Layer):
 def __init__(self,output_dim,**kwargs):
  self.output_dim=output_dim
  super(MyLayer,self).__init__(**kwargs)
 def build(self,input_shape):
  assert isinstance(input_shape,list) #  input_shape   list   
  self.kernel=self.add_weight(name='kernel',
         shape=(input_shape[0][1],self.output_dim), #input_shape     [(2,2),(3,3)]
         initializer='uniform',
         trainable=True)
  super(MyLayer,self).build(input_shape)
 def call(self,x):
  assert isinstance(x,list)
  a,b=x #       x       [(2,2),(3,3)] list,a=(2,2),b=(3,3)
  return [K.dot(a,self.kernel)+b,K.mean(b,axis=-1)]
以上のように、すでに手に入れたkersasモデルを使って、自分の手書きの数字方式を識別します。つまり、小編集は皆さんに全部の内容を共有します。