[[214992]]
まず、コード - テンソルフローをインポートする
-
- tensorflow.examples.tutorials.mnistからinput_dataをインポートします
-
- matplotlib.pyplot をpltとしてインポートします。
-
-
-
- # 通常のニューラルネットワーク学習
-
- # 学習・研修クラス
-
- クラス Normal:
-
-
-
- 重量 = []
-
- バイアス = []
-
-
-
- __init__(self)を定義します。
-
- 自己回数 = 1000
-
- 自己.mnist = []
-
- 自己セッション = tensorflow.Session()
-
- self.xs = tensorflow.placeholder(tensorflow.float32、[なし、784])
-
- self.ys = tensorflow.placeholder(tensorflow.float32、[なし、10])
-
- self.save_path = 'learn/result/normal.ckpt'
-
-
-
- def run(self):
-
- 自己.import_data()
-
- 自己トレーニング()
-
- 自己保存()
-
-
-
- def _setWeight(自分自身、重量):
-
- 自己重量 = 重量
-
-
-
- def _setBiases(self, バイアス):
-
- self.biases = バイアス
-
-
-
- _getWeight(自分自身の重み)を定義します。
-
- 自己の重みを返す
-
-
-
- _getBiases(self)を定義します。
-
- 自己バイアスを返す
-
- # 電車
-
- def train(self):
-
-
-
- 予測 = self.add_layer(self.xs, 784, 10, activation_function=tensorflow.nn.softmax)
-
-
-
- クロスエントロピー = tensorflow.reduce_mean(
-
- -テンソルフロー.reduce_sum(
-
- self.ys * tensorflow.log(予測)
-
- 、削減指標=[1])
-
- )
-
- train_step = tensorflow.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
-
-
-
- 自己セッションを実行します(tensorflow.global_variables_initializer())
-
-
-
- iが範囲内にある場合(self.times):
-
- batch_xs、batch_ys = self.mnist.train.next_batch(100) です。
-
- self.session.run(train_step、feed_dict={self.xs: batch_xs、self.ys: batch_ys}) を実行します。
-
- i % 50 == 0の場合:
-
- # 画像はラベルに変換され、画像は x に相当し、ラベルは y に相当します
-
- 精度 = self.computer_accurary(
-
- 自己.mnist.テスト.画像、
-
- 自己.mnist.テスト.ラベル、
-
- 予測
-
- )
-
-
-
- # データのインポート
-
- def import_data(自分自身):
-
- self.mnist = input_data.read_data_sets( 'MNIST_data' 、 one_hot = True )
-
-
-
- # データ節約
-
- def save(self):
-
- セーバー = tensorflow.train.Saver()
-
- パス = saver.save(self.session, self.save_path)
-
-
-
- # 隠しレイヤーを追加
-
- def add_layer(self,inputs,input_size,output_size,activation_function=None):
-
-
-
- 重み = tensorflow.Variable(tensorflow.random_normal([input_size,output_size]),dtype=tensorflow.float32,名前= '重み' )
-
-
-
- バイアス = tensorflow.Variable(tensorflow.zeros([1,output_size]) + 0.1,dtype=tensorflow.float32, name = 'biases' )
-
- Wx_plus_b = tensorflow.matmul(入力、重み) + バイアス
-
-
-
- self._setBiases(バイアス)
-
- self._setWeight(重量)
-
-
-
- activation_functionがNone の場合:
-
- 出力 = Wx_plus_b
-
- それ以外:
-
- 出力 = activation_function(Wx_plus_b,)
-
-
-
- 出力を返す
-
-
-
-
-
- # 結果データと実際のデータの精度を計算する
-
- def computer_accurary(自己、x_データ、y_データ、tf_予測):
-
-
-
- 予測 = self.session.run(tf_prediction、feed_dict={self.xs:x_data、self.ys:y_data})
-
-
-
- # 2つの行列の最高値のインデックス位置を返し、対応する位置の値を比較してTrue / Falseに設定します
-
- 正しい予測 = tensorflow.equal(tensorflow.argmax(予測,1),tensorflow.argmax(y_data,1))
-
-
-
- #データ形式を変換し、次元を減らして平均値を求めます
-
- 精度 = tensorflow.reduce_mean( tensorflow.cast (correct_predition, tensorflow.float32))
-
-
-
- 結果 = self.session.run(正確、フィードディクショナリ = {self.xs:x_data、self.ys:y_data})
-
-
-
- 結果を返す
-
-
-
- # 識別クラス
-
- クラス NormalRead(Normal):
-
-
-
- 入力サイズ = 784
-
- 出力サイズ = 10
-
-
-
- def run(self):
-
- 自己.import_data()
-
- 自己.getSaver()
-
- origin_input = self._getInput()
-
- 出力= self.recognize(origin_input)
-
-
-
- self._showImage(元の入力)
-
- self._showOutput(出力)
-
- 合格
-
-
-
- # 認識結果を表示
-
- def _showOutput(self,出力):
-
- 番号 =出力.インデックス( 1 )
-
- print( '認識された番号:' , 番号)
-
-
-
- # 認識した画像を表示する
-
- def _showImage(self、origin_input):
-
- データ = []
-
- tmp = []
-
- 私 = 1
-
- # 元のデータを表示可能なマトリックスに変換する
-
- origin_input[0]のvの場合:
-
- i %28 == 0 の場合:
-
- tmp.append(v)
-
- データを追加します(tmp)
-
- tmp = []
-
- それ以外:
-
- tmp.append(v)
-
- 私 += 1
-
-
-
- plt.figure()
-
- plt.imshow(data, cmap= 'binary' ) # 白黒表示
-
- plt.show()
-
-
-
-
-
- def _setBiases(self, バイアス):
-
- self.biases = バイアス
-
- 合格
-
-
-
- def _setWeight(自分自身、重量):
-
- 自己重量 = 重量
-
- 合格
-
-
-
- _getBiases(self)を定義します。
-
- 自己バイアスを返す
-
-
-
- _getWeight(自分自身の重み)を定義します。
-
- 自己の重みを返す
-
-
-
- # トレーニングモデルを取得する
-
- getSaver(self)を定義します。
-
- 重み = tensorflow.Variable(tensorflow.random_normal([self.input_size, self.output_size]), dtype=tensorflow.float32,名前= 'weight' )
-
-
-
- バイアス = tensorflow.Variable(tensorflow.zeros([1, self.output_size]) + 0.1、dtype=tensorflow.float32、名前= 'biases' )
-
-
-
- セーバー = tensorflow.train.Saver()
-
- saver.restore(self.session、self.save_path) を使います。
-
-
-
- self._setWeight(重量)
-
- self._setBiases(バイアス)
-
-
-
- def recognize(自己、origin_input):
-
- 入力 = tensorflow.placeholder(tensorflow.float32,[なし,784])
-
- 重量 = self._getWeight()
-
- バイアス = self._getBiases()
-
-
-
- 結果 = tensorflow.matmul(入力,重み) + バイアス
-
- resultSof = tensorflow.nn.softmax(result,) # ソフトマックスを使用して結果セットを刺激する
-
- resultSig = tensorflow.nn.sigmoid(resultSof,) # シグモイド関数を使用して、後続の分類のために結果セットを刺激します
-
- 出力= self.session.run(resultSig,{input:origin_input})
-
-
-
- 出力=出力[0]
-
-
-
- # 認識結果を分類する
-
- 出力tmp = []
-
- アイテムの 出力:
-
- 項目 < 0.6 の場合:
-
- 出力tmpに追加(0)
-
- それ以外:
-
- 出力tmp.append(1)
-
-
-
- output_tmpを返す
-
-
-
- def _getInput(自分):
-
- 入力、y = self.mnist.train.next_batch(100);
-
- 戻り値[入力[50]]
上記がプログラムです。プログラム全体はTensorFlowをベースに実装されています。TensorFlowの具体的なインストールについては説明しません。 トレーニングプロセス全体について詳しく説明することはしません。インターネット上にはトレーニングに関するチュートリアルはたくさんあるのですが、トレーニング結果に関するチュートリアルはほとんどないことがわかりました。 プログラム全体では、トレーニング結果モデルは tensorflow.train.Saver() の save を通じて保存され、その後、tensorflow.train.Saver() の restore によってモデルが復元され、トレーニングされた重みと値が取得されます。 ここで注目すべき点は、バッチ トレーニングでは手書きの写真 100 枚が一度にランダムに取り出されるため、実際にはバッチでランダムに 100 枚の写真を撮影しましたが、次のプログラムを通じて 1 枚の写真を認識に渡したということです。 - def _getInput(自分):
-
- 入力、y = self.mnist.train.next_batch(100);
-
- 戻り値[入力[50]]
戻り値のデータ構造は、実際にはこのバッチの 50 番目の画像を取得するためのものであることに注意してください。実際、このプログラムは次のように記述されます。 - def _getInput(自分):
-
- 入力、y = self.mnist.train.next_batch(1);
-
- [入力[0]]を返す
もっと良くなるでしょう。 認識にはトレーニング済みの隠し層が必要なので、ここでは画像を認識していますが、バッチデータの構造を渡す必要があります。 次に、認識のために、2 つの活性化関数を使用しました。 - resultSof = tensorflow.nn.softmax(result,) # ソフトマックスを使用して結果セットを刺激する
-
- resultSig = tensorflow.nn.sigmoid(resultSof,) # シグモイド関数を使用して、後続の分類のために結果セットを刺激します
ここで、最初のソフトマックス励起後のデータが e を底とする指数形式になっていることがわかりました。通常の浮動小数点数に変換すると、それが何であるかがよくわかりませんでした。そのため、デジタル認識の判断をするのに不便だったので、再びシグモイド励起に通しました。 後ほど、ループ判定による実際の分類を行います。その理由は、まず認識結果の形式についてお話しするためです。 - [0,0,0,0,0,0,0,0,0,1,0]
上記のデータと同様に、これは 8 を表します。つまり、以下の配列表の 1 の数は 0 などの数値を表します。 - [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... 他の活性化関数に関する情報はオンラインで見つけることができます。基本的な数学の知識の多くは、より具体的なアプリケーションに適用すると非常に興味深いものになります。 |