手書き認識のための単層基本ニューラルネットワーク

手書き認識のための単層基本ニューラルネットワーク

[[214992]]


まず、コード

  1. テンソルフローをインポートする
  2.  
  3. tensorflow.examples.tutorials.mnistからinput_dataをインポートします
  4.  
  5. matplotlib.pyplot をpltとしてインポートします。
  6.  
  7.  
  8.  
  9. # 通常のニューラルネットワーク学習
  10.  
  11. # 学習・研修クラス
  12.  
  13. クラス Normal:
  14.  
  15.  
  16.  
  17. 重量 = []
  18.  
  19. バイアス = []
  20.  
  21.  
  22.  
  23. __init__(self)を定義します。
  24.  
  25. 自己回数 = 1000
  26.  
  27. 自己.mnist = []
  28.  
  29. 自己セッション = tensorflow.Session()
  30.  
  31. self.xs = tensorflow.placeholder(tensorflow.float32、[なし、784])
  32.  
  33. self.ys = tensorflow.placeholder(tensorflow.float32、[なし、10])
  34.  
  35. self.save_path = 'learn/result/normal.ckpt'  
  36.  
  37.  
  38.  
  39. def run(self):
  40.  
  41. 自己.import_data()
  42.  
  43. 自己トレーニング()
  44.  
  45. 自己保存()
  46.  
  47.  
  48.  
  49. def _setWeight(自分自身、重量):
  50.  
  51. 自己重量 = 重量
  52.  
  53.  
  54.  
  55. def _setBiases(self, バイアス):
  56.  
  57. self.biases = バイアス
  58.  
  59.  
  60.  
  61. _getWeight(自分自身の重み)を定義します。
  62.  
  63. 自己の重みを返す
  64.  
  65.  
  66.  
  67. _getBiases(self)を定義します。
  68.  
  69. 自己バイアスを返す
  70.  
  71. # 電車
  72.  
  73. def train(self):
  74.  
  75.  
  76.  
  77. 予測 = self.add_layer(self.xs, 784, 10, activation_function=tensorflow.nn.softmax)
  78.  
  79.  
  80.  
  81. クロスエントロピー = tensorflow.reduce_mean(
  82.  
  83. -テンソルフロー.reduce_sum(
  84.  
  85. self.ys * tensorflow.log(予測)
  86.  
  87. 、削減指標=[1])
  88.  
  89.  
  90. train_step = tensorflow.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
  91.  
  92.  
  93.  
  94. 自己セッションを実行します(tensorflow.global_variables_initializer())
  95.  
  96.  
  97.  
  98. iが範囲内にある場合(self.times):
  99.  
  100. batch_xs、batch_ys = self.mnist.train.next_batch(100) です。
  101.  
  102. self.session.run(train_step、feed_dict={self.xs: batch_xs、self.ys: batch_ys}) を実行します。
  103.  
  104. i % 50 == 0の場合:
  105.  
  106. # 画像はラベルに変換され、画像は x に相当し、ラベルは y に相当します
  107.  
  108. 精度 = self.computer_accurary(
  109.  
  110. 自己.mnist.テスト.画像、
  111.  
  112. 自己.mnist.テスト.ラベル、
  113.  
  114. 予測
  115.  
  116.  
  117.  
  118.  
  119. # データのインポート
  120.  
  121. def import_data(自分自身):
  122.  
  123. self.mnist = input_data.read_data_sets( 'MNIST_data' 、 one_hot = True )
  124.  
  125.  
  126.  
  127. # データ節約
  128.  
  129. def save(self):
  130.  
  131. セーバー = tensorflow.train.Saver()
  132.  
  133. パス = saver.save(self.session, self.save_path)
  134.  
  135.  
  136.  
  137. # 隠しレイヤーを追加
  138.  
  139. def add_layer(self,inputs,input_size,output_size,activation_function=None):
  140.  
  141.  
  142.  
  143. 重み = tensorflow.Variable(tensorflow.random_normal([input_size,output_size]),dtype=tensorflow.float32,名前= '重み' )
  144.  
  145.  
  146.  
  147. バイアス = tensorflow.Variable(tensorflow.zeros([1,output_size]) + 0.1,dtype=tensorflow.float32, name = 'biases' )
  148.  
  149. Wx_plus_b = tensorflow.matmul(入力、重み) + バイアス
  150.  
  151.  
  152.  
  153. self._setBiases(バイアス)
  154.  
  155. self._setWeight(重量)
  156.  
  157.  
  158.  
  159. activation_functionNone の場合:
  160.  
  161. 出力 = Wx_plus_b
  162.  
  163. それ以外
  164.  
  165. 出力 = activation_function(Wx_plus_b,)
  166.  
  167.  
  168.  
  169. 出力を返す
  170.  
  171.  
  172.  
  173.  
  174.  
  175. # 結果データと実際のデータの精度を計算する
  176.  
  177. def computer_accurary(自己、x_データ、y_データ、tf_予測):
  178.  
  179.  
  180.  
  181. 予測 = self.session.run(tf_prediction、feed_dict={self.xs:x_data、self.ys:y_data})
  182.  
  183.  
  184.  
  185. # 2つの行列の最高値のインデックス位置を返し、対応する位置の値を比較してTrue / Falseに設定します 
  186.  
  187. 正しい予測 = tensorflow.equal(tensorflow.argmax(予測,1),tensorflow.argmax(y_data,1))
  188.  
  189.  
  190.  
  191. #データ形式を変換し、次元を減らして平均値を求めます
  192.  
  193. 精度 = tensorflow.reduce_mean( tensorflow.cast (correct_predition, tensorflow.float32))
  194.  
  195.  
  196.  
  197. 結果 = self.session.run(正確、フィードディクショナリ = {self.xs:x_data、self.ys:y_data})
  198.  
  199.  
  200.  
  201. 結果を返す
  202.  
  203.  
  204.  
  205. # 識別クラス
  206.  
  207. クラス NormalRead(Normal):
  208.  
  209.  
  210.  
  211. 入力サイズ = 784
  212.  
  213. 出力サイズ = 10
  214.  
  215.  
  216.  
  217. def run(self):
  218.  
  219. 自己.import_data()
  220.  
  221. 自己.getSaver()
  222.  
  223. origin_input = self._getInput()
  224.  
  225. 出力= self.recognize(origin_input)
  226.  
  227.  
  228.  
  229. self._showImage(元の入力)
  230.  
  231. self._showOutput(出力)
  232.  
  233. 合格
  234.  
  235.  
  236.  
  237. # 認識結果を表示
  238.  
  239. def _showOutput(self,出力):
  240.  
  241. 番号 =出力.インデックス( 1 )
  242.  
  243. print( '認識された番号:' , 番号)
  244.  
  245.  
  246.  
  247. # 認識した画像を表示する
  248.  
  249. def _showImage(self、origin_input):
  250.  
  251. データ = []
  252.  
  253. tmp = []
  254.  
  255. 私 = 1
  256.  
  257. # 元のデータを表示可能なマトリックスに変換する
  258.  
  259. origin_input[0]v場合:
  260.  
  261. i %28 == 0 の場合:
  262.  
  263. tmp.append(v)
  264.  
  265. データを追加します(tmp)
  266.  
  267. tmp = []
  268.  
  269. それ以外
  270.  
  271. tmp.append(v)
  272.  
  273. 私 += 1
  274.  
  275.  
  276.  
  277. plt.figure()
  278.  
  279. plt.imshow(data, cmap= 'binary' ) # 白黒表示
  280.  
  281. plt.show()
  282.  
  283.  
  284.  
  285.  
  286.  
  287. def _setBiases(self, バイアス):
  288.  
  289. self.biases = バイアス
  290.  
  291. 合格
  292.  
  293.  
  294.  
  295. def _setWeight(自分自身、重量):
  296.  
  297. 自己重量 = 重量
  298.  
  299. 合格
  300.  
  301.  
  302.  
  303. _getBiases(self)を定義します。
  304.  
  305. 自己バイアスを返す
  306.  
  307.  
  308.  
  309. _getWeight(自分自身の重み)を定義します。
  310.  
  311. 自己の重みを返す
  312.  
  313.  
  314.  
  315. # トレーニングモデルを取得する
  316.  
  317. getSaver(self)を定義します。
  318.  
  319. 重み = tensorflow.Variable(tensorflow.random_normal([self.input_size, self.output_size]), dtype=tensorflow.float32,名前= 'weight' )
  320.  
  321.  
  322.  
  323. バイアス = tensorflow.Variable(tensorflow.zeros([1, self.output_size]) + 0.1、dtype=tensorflow.float32、名前= 'biases' )
  324.  
  325.  
  326.  
  327. セーバー = tensorflow.train.Saver()
  328.  
  329. saver.restore(self.session、self.save_path) を使います。
  330.  
  331.  
  332.  
  333. self._setWeight(重量)
  334.  
  335. self._setBiases(バイアス)
  336.  
  337.  
  338.  
  339. def recognize(自己、origin_input):
  340.  
  341. 入力 = tensorflow.placeholder(tensorflow.float32,[なし,784])
  342.  
  343. 重量 = self._getWeight()
  344.  
  345. バイアス = self._getBiases()
  346.  
  347.  
  348.  
  349. 結果 = tensorflow.matmul(入力,重み) + バイアス
  350.  
  351. resultSof = tensorflow.nn.softmax(result,) # ソフトマックスを使用して結果セットを刺激する
  352.  
  353. resultSig = tensorflow.nn.sigmoid(resultSof,) # シグモイド関数を使用して、後続の分類のために結果セットを刺激します
  354.  
  355. 出力= self.session.run(resultSig,{input:origin_input})
  356.  
  357.  
  358.  
  359. 出力=出力[0]
  360.  
  361.  
  362.  
  363. # 認識結果を分類する
  364.  
  365. 出力tmp = []
  366.  
  367. アイテム 出力:
  368.  
  369. 項目 < 0.6 の場合:
  370.  
  371. 出力tmpに追加(0)
  372.  
  373. それ以外
  374.  
  375. 出力tmp.append(1)
  376.  
  377.  
  378.  
  379. output_tmpを返す
  380.  
  381.  
  382.  
  383. def _getInput(自分):
  384.  
  385. 入力、y = self.mnist.train.next_batch(100);
  386.  
  387. 戻り値[入力[50]]

上記がプログラムです。プログラム全体はTensorFlowをベースに実装されています。TensorFlowの具体的なインストールについては説明しません。

トレーニングプロセス全体について詳しく説明することはしません。インターネット上にはトレーニングに関するチュートリアルはたくさんあるのですが、トレーニング結果に関するチュートリアルはほとんどないことがわかりました。

プログラム全体では、トレーニング結果モデルは tensorflow.train.Saver() の save を通じて保存され、その後、tensorflow.train.Saver() の restore によってモデルが復元され、トレーニングされた重みと値が取得されます。

ここで注目すべき点は、バッチ トレーニングでは手書きの写真 100 枚が一度にランダムに取り出されるため、実際にはバッチでランダムに 100 枚の写真を撮影しましたが、次のプログラムを通じて 1 枚の写真を認識に渡したということです。

  1. def _getInput(自分):
  2.  
  3. 入力、y = self.mnist.train.next_batch(100);
  4.  
  5. 戻り値[入力[50]]

戻り値のデータ構造は、実際にはこのバッチの 50 番目の画像を取得するためのものであることに注意してください。実際、このプログラムは次のように記述されます。

  1. def _getInput(自分):
  2.  
  3. 入力、y = self.mnist.train.next_batch(1);
  4.  
  5. [入力[0]]を返す

もっと良くなるでしょう。

認識にはトレーニング済みの隠し層が必要なので、ここでは画像を認識していますが、バッチデータの構造を渡す必要があります。

次に、認識のために、2 つの活性化関数を使用しました。

  1. resultSof = tensorflow.nn.softmax(result,) # ソフトマックスを使用して結果セットを刺激する
  2.  
  3. resultSig = tensorflow.nn.sigmoid(resultSof,) # シグモイド関数を使用して、後続の分類のために結果セットを刺激します

ここで、最初のソフトマックス励起後のデータが e を底とする指数形式になっていることがわかりました。通常の浮動小数点数に変換すると、それが何であるかがよくわかりませんでした。そのため、デジタル認識の判断をするのに不便だったので、再びシグモイド励起に通しました。

後ほど、ループ判定による実際の分類を行います。その理由は、まず認識結果の形式についてお話しするためです。

  1. [0,0,0,0,0,0,0,0,0,1,0]

上記のデータと同様に、これは 8 を表します。つまり、以下の配列表の 1 の数は 0 などの数値を表します。

  1. [1,0,0,0,0,0,0,0,0,0,0]

ここでのシグモイド関数は、実際に各位置のデータを分類します。分類値が 0.52 未満の場合、データは実際に「はい」または「いいえ」を表し、つまり、この位置の値は 0 に対応し、0.52 より大きい値は true、つまり 1 に対応することがわかりました。プログラムでは、0.6 を判断の境界としました。

実際、この限界値は、認識結果に基づくのではなく、ニューラルネットワークのトレーニング中に取得する必要があります(トレーニング中のパラメータも感情に基づいていますが)。

この記事は私の個人的な理解に基づいて書かれています。後で間違いを見つけた場合は、新しい記事で指摘しますが、この記事は保存されません。後で自分の考えや記録を確認して、どのように罠に陥ったかを知ることができるためです。

前回シグモイド関数について書いた記事はこちらです。

https://segmentfault.com/a/11...

他の活性化関数に関する情報はオンラインで見つけることができます。基本的な数学の知識の多くは、より具体的なアプリケーションに適用すると非常に興味深いものになります。

<<:  マッキンゼー:人工知能の最大の課題と機会

>>:  アリババの年次技術概要: 検索における人工知能の応用と実践

ブログ    
ブログ    
ブログ    

推薦する

...

この「ペア」は悪くないですね! AIとのペアプログラミング

翻訳者 |陳俊レビュー | Chonglou 「ペアプログラミング」という概念を聞いたことがあります...

一緒にハイキングに行きませんか? Baidu Brain EasyDLは、企業向けAI実装の山を登るお手伝いをします

エンタープライズ AI モデルの開発では、データの準備からモデルのトレーニング、サービスの展開まで、...

展望: 2023 年のディープラーニングとメタバースの未来

ディープラーニング (DL) は、再帰型ニューラル ネットワーク、長期短期記憶、畳み込みニューラル ...

...

CMU と ETH が画期的な成果を達成: 敏捷性が最大限に高められたロボット犬は、スピードと安全性を兼ね備え、超高速で障害物を乗り越えることができます。

高速ロボット動作の分野では、速度と安全性の両立が常に大きな課題となっています。しかし今、カーネギーメ...

...

データ構造とアルゴリズムの簡単な紹介

一般的なデータ構造にはどのようなものがありますか? 基本的な操作は何ですか? 一般的なソート アルゴ...

画像ベースの AI プロジェクト用のデータセットを準備する 7 つのステップ

翻訳者 |陳俊レビュー | Chonglouご存知のとおり、データセットはおそらく機械学習プロジェク...

...

Java プログラミング スキル - データ構造とアルゴリズムの「スタック」

[[387145]]基本的な紹介1. スタックはFILO(先入れ後出し)順序付きリストです2. ス...

デジタル変革の本質、道筋、段階、課題を1つの記事で解説

01エンタープライズデジタルトランスフォーメーションの本質デジタル化により、人間が暮らす現実世界と仮...

RPAテクノロジーが製造業の未来をどのように変えるか

RPA コンサルティング サービスは、製造業者がソフトウェア ロボットを使用してさまざまな反復的なル...

生成AIの構築には、大きなモデルだけでは不十分

生成型人工知能 (GenAI) の急速な台頭により、企業はビジネス アプリケーションでこのテクノロジ...

データセンター管理者は AI と ML の爆発的な増加にどのように備えればよいのでしょうか?

生成 AI と機械学習 (ML) は急速に一般の人々の意識に入り込み、これらの有望なテクノロジーの能...