データセットをロードし、Mnistを説明
- mnist手書きデータセット、55,000トレーニングサンプル、5000個のサンプル、および検証試験サンプル10000の合計
-
上記のコードは、ディスプレイに関連するいくつかの情報を印刷、read_data_setsを用いる方法、および注にデータを読み取るために符号化されたワンホット形式で読み取る請求即ち、TFのmnistモジュールを用いて、上記のようにローディングコードデータ次元の寸法は、特定のコメントを参照してください。import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data import matplotlib.pyplot as plt import numpy as np # 数据载入 mnist = input_data.read_data_sets("MNIST/", one_hot=True) # 以独热编码的形式载入数据 # 训练集训练数据,验证集评估调参,测试集进行最后的测试 print("训练集数量: ", mnist.train.num_examples) print("验证集数量: ", mnist.validation.num_examples) print("测试集数量: ", mnist.test.num_examples) # 可以解开注释,看里面的数据形式 # print("图像形状:", mnist.train.images.shape) # 784即28X28 # print("标签形状:", mnist.train.labels.shape) # print("首图尺寸:", mnist.train.images[0].shape) # print("首图内容:", mnist.train.images[0].reshape(28, 28))
- ワンホット符号の説明について:いわゆるホット符号化をアレイの形で符号化され、配列は唯一つを有するされ、残りの値は0であり、印刷を達成するために、このコード印刷(mnist.labels [1])を使用することができ用語ホット符号化データでロードされたとき、mnitsデータセットは、一意のタグ値は、熱の一次元アレイであろう。mnistによる識別、精度はユークリッド距離と類似考え、単独で熱の使用に基づいて決定されますより簡単に算出された差分を符号化します。
データ分割
正確に未知のデータできるだけ予測することができる最終モデルとトレーニングを構築することは、効果的な予測を確実にするために、データセットは、データセット、テストセット検証セットに分割する必要があります。
全体のトレーニング:
そして、テストセットの効果を確実にするために、効果を検証するための位置データのために良いフィットすることができ、それが必要です:テストセットの数が十分な大きさで、最後のモデルがあることをテストセットとテストセットとデータのためのトレーニングセットを触れないでくださいまで同じの全体的な説明に分布。
mnistデータセットでは、職員はトレーニングセットとテストセット検証セットの優れた部門を持っています。
バッチは、データを読みます
- Pythonはバッチでデータを取得するために文をスライスに利用されてもよい;そのようなプリント(mnist.train.labels [夜12時10分])として、0~9に対応するサンプルインデックスタグ値を印刷バッチを表示します。
- TFでmnistパケット、データの方法は、バッチを読み取るが提供され、
即ちnext_batch;データ(BATCH_SIZE)が読み込まれるそのパラメータパッケージの体積は、戻り値は、タグの対応するセットを有する画像のコレクション含む、印刷ステートメントを、画像セットの寸法は[10784]について得られた、寸法タブセットである[10、 10]。# mnist中提供了下述方法,可以进行批量读取数据 batch_images_xs, batch_labels_ys = mnist.train.next_batch(batch_size=10) print(batch_images_xs.shape, batch_images_ys.shape)
モデルの構築
-
定義された入力重みと前方計算。入力ディメンションのため、サイズは、限られた数、NONEとプレースホルダを限定嵌合を容易にし、バッチデータを読み出さない、寸法に相当は、行列乗算を直接一般初期B、Xになされ得ることが、ランダムに重みwを初期化しながら、しかし、ノート0であり、結果がドメインにマッピングされているソフトマックス計算された確率値を用いて計算されたフォワード計算は、行列乗算の定義プラスオフセット計算され、このマッピングは、しばしば、CNNに使用使用されFC最後の層。x = tf.placeholder(tf.float32, [None, 784], name="X") y = tf.placeholder(tf.float32, [None, 10], name="Y") w = tf.Variable(tf.random_normal([784, 10]), name="W") b = tf.Variable(tf.zeros([10]), name="b") forward = tf.matmul(x, w)+b # 前向计算 preb = tf.nn.softmax(forward) # 利用softmax进行结果向概率域的映射
- 追加ソフトマックスのためにこのメソッドが対応タグで算出されたスコア値の各種サイズに対応する確率値、合計値が1である確率、大きな値の種類に対応する高い確率スコア、特定の式を与えますそれはCがクラスの数を表し、。
-
図に示すように、超パラメータの定義。単一のトレーニングを行うには100個のサンプルを読んで設定し、トレーニングは50の合計を訓練するために、total_batch単一のトレーニング時間を行います。# 超参设置 train_epochs = 50 # 训练轮数 batch_size = 100 # 单批次训练样本数 total_batch = int(mnist.train.num_examples/batch_size) # 一轮训练要训练的批次数 learing_rate = 0.01 # 学习率 display_step = 1 # 显示粒度
-
しばしばクロスエントロピー損失関数を用いて、マルチ分類問題のために、損失関数を設定するステップと、情報の分野におけるクロスエントロピーは本来確率の近似度を比較し、ホット符号化を使用することで、ためのマッピングソフトマックスタグ値の結果間の差を計算します確率の差であり、クロスエントロピーが算出され、pは、値タグである場合、Qは、クロスエントロピー近い2つの小さい、ソフトマックスマップ後に算出した値です。# 定义损失函数 # 交叉熵损失函数 loss_fuction = tf.reduce_mean(-tf.reduce_sum(y*tf.log(preb), reduction_indices=1))
-
カスタム最適化;勾配降下アルゴリズムが極小に陥る可能性がある、とのクロス損失を使用してこの問題を回避する時期はまだ勾配降下アルゴリズムを使用するには、L2を用いたマルチ分類アルゴリズムはloss_functionを行います。# 优化器 optimizer = tf.train.GradientDescentOptimizer(learing_rate).minimize(loss_fuction)
-
動作は、トレーニングのすなわち正しい比率を精度定義; correct_predictionは、最大値がプログレッシブ予測値タグ値集合インデックス分布の第1のセットが得られた様々なアイテムを比較した後、サンプルのインデックス値に対応するラインとして、前記しました、そうでない場合はTRUE、FALSEと同様、精度は、のfloat32型にTrueおよびFalseのセットである平均のすべての要素、平均結果は精度です。# 定义准确率 correct_prediction = tf.equal(tf.argmax(preb, 1), tf.argmax(y, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
トレーニングと評価モデル
-
コードとして、モデルのトレーニング。# 声明会话以及初始化变量 sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) # 开始训练 print("Train Start !!!!!") for epoch in range(train_epochs): # 逐轮次 for batch_size in range(total_batch): # 共进行total_batch次的单一批次训练 xs, ys = mnist.train.next_batch(batch_size) # zip数据送入feed,此时类型已经符合 sess.run(optimizer, feed_dict={x: xs, y: ys}) # 运行迭代优化器 # 运行一个l轮后,利用验证即求解损失与准确度 loss, acc = sess.run([loss_fuction, accuracy], feed_dict={x: mnist.validation.images,y:mnist.validation.labels}) # 打印本轮训练结果 if(epoch+1) % display_step == 0: print("Train Epoch: ",'%02d'%(epoch+1), "Loss: ", "{:.9f}".format(loss), "Accuracy: ", "{:.4f}".format(acc)) print("Train Finish !!!!!")
-
抽出された画像、タグ値と予測値を表示するためのヘルパー関数。# 测试结果可视化函数 def plot_images_labels_prediction(images, # 图像列表 labels, # 标签列表 prediction, # 预测值列表 index, # 所显示的第一张图的索引值 num=10 # 显示的图像数目 ): fig = plt.gcf() # 获取当前图表 fig.set_size_inches(10, 12) # 设置总图尺寸为10英寸X12英寸 if num > 25: # 限制总的显示数目不超过25张 num = 25 for i in range(0, num): # 逐个处理子图 ax = plt.subplot(5, 5, i+1) ax.imshow(np.reshape(images[index], (28, 28)), cmap='binary') title = "label="+str(np.argmax(labels[index])) if len(prediction) > 0: title += ",Prediction=" + str(prediction[index]) ax.set_title(title, fontsize=10) ax.set_xticks([]) ax.set_yticks([]) index += 1 plt.show()
-
モデルの検出と可視化を使用しました。# 一次检测所有test样本 prediction_result = sess.run(tf.argmax(preb, 1), feed_dict={x: mnist.test.images}) # 打印前十个检测结果 print(prediction_result[:10]) # 可视化前10个检测结果 plot_images_labels_prediction(mnist.test.images, mnist.test.labels, prediction_result, 10, 10)
- 上述したように検出結果。