1日1回のKaggleMNIST DeepLearningコードのマイニング


MNIST Dataset



これらのイメージは機械学習が行われる日です.

オーダー

  • データ加工
  • 型番設定
  • 学習
  • 図表検証の正確性
  • 結論
  • 1.データ加工<-最も困難

    mnist = tf.keras.datasets.mnist
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    x_train, x_test = x_train / 255.0, x_test / 255.0
    y_train = tf.one_hot(y_train, 10)
    y_test = tf.one_hot(y_test, 10)
    x_train, x_test = x_train/255.0, x_test/255.0
    y_train = tf.one_hot(y_train, 10)
    y_test = tf.one_hot(y_test, 10)
    上から
    このデータには0~255の値があります(ピクセルなので0~255です).
    しかし、画像自体は白黒画像であり、最終的には0または1でしか区別できない.
    だから.
    x_train, x_test = x_train/255.0, x_test/255.0
    すべてのマトリクス値(画像を表すマトリクス値)を0または1に変換します.
    y_train = tf.one_hot(y_train, 10)
    y_test = tf.one_hot(y_test, 10)
    ここで熱符号化を実行します.私たちが使うデータは0から9までの数字で、例えば画像Aが最終的に1という数字に対応しているので、問題はそれをA=1と呼ぶと、想像以上に複雑になるということです.上の画像を255に分けてマトリクス値を0 or 1に固定することも有利です.
    したがって、1つの熱符号化された画像Aが1を表す場合、1の項目では1の値を使用し、残りの項目では0の値を使用することが望ましい.
    OUTPUT
    Number representation: 0
    One-hot encoding: [5][4] [3][2] [1][0]
    Array/vector: 0 0 0 0 0 1
    Number representation: 5
    One-hot encoding: [5][4] [3][2] [1][0]
    Array/vector: 1 0 0 0 0 0
    この方式で行ったほうがよいこれは、1つの熱符号化が使用される理由であり、1つの熱符号化がこのような分類または分類データに使用されることが好ましい.
    train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(50)
    test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(50)
    トレーニング用のデータとテスト用のデータをデータセットに組み合わせる.Tensorflow 2.x以上は本当に良くて、batchsize、つまり1回にランダムにいくつかの入力を選んで入ります.
    train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(50)
    test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(50)
    tf.data.Datset.from_tensor_slices(....).batch(n)はコマンド言語であり、実現しやすい.(Tensorflow 1.5の悪夢を考えて...)
    ここまで、次のような過程を経てきました.
  • 優先受信データ
  • 白黒データ、データを表すマトリクスを1または0
  • に変換
  • 学習するデータが属する項目(画像が何を表すか)をhot符号化1または0
  • に変換する
  • の学習および訓練のためのデータをデータセットに設定し、batchsizeも設定した.
  • 2.学習用の関数の設定


    大体いくつか設定しますが、
    設定
  • Flatten(平面化)関数
  • Forward関数(演算用)
  • を設定
  • アクティブ化関数設定(線形値を非線形値に変換)
  • モデル(学習)関数
  • を設定する
  • cross entropy(誤差を減らす)関数
  • を設定します.
    この5種類を順に設定します.

    2-1.平面化関数の設定

    from tensorflow.keras.layers import Flatten
    flatten = Flatten(dtype='float32')
    コードには大きな説明はありませんが、平面化関数を使用する理由は簡単です.これは、2 Dデータを1 Dに変換して計算しやすくするために設定されています.(ここでは複雑な数式計算に伴う可能性があり、私たちが持っているデータをより容易なデータに変換することができます.しかし、より容易であるため、データの密度がより高くなるため、データの密度もより高くなります.)

    2-2. Forward関数の設定


    演算に使用するForward関数を設定します.
    W = tf.Variable(tf.zeros([784, 10], tf.float32))
    b = tf.Variable(tf.zeros([10], tf.float32))
    def forward(x):
        return tf.matmul(x, W) + b
    まず,ここではモデルを学習する際に,低W(weight)とb(bias)を学習と呼ぶことを指摘する.したがって,この2つの変化により,このコードの最終的な目標は,与えられた入力値に適合する最適なWとBを見つけることであるという答えを見つけた.
    (ここでwは784,10の理由は、1枚の画像が横28画素、縦28画素であるため、両者を乗算すると(平面化)784となる.)
    我々はy=ax+b形式の乗算を先進的に行い,tf.これをmal(a,b)で設定します.

    2-3. Activate関数の設定

    def activate(x):
        return tf.nn.softmax(forward(x))
    これも簡単で、これを使う理由はちょっと複雑です.簡単に言えば、私たちが処理する入力はすべて線形データです.つまり、この点だけでは、これらのデータは「理解」するしかなく、適用したり使用したりすることはできません.そこで,データを現実の非線形データに変換するためにactivation関数を用いてデータをnone線形と見なし,none線形と見なしsoftmax操作を実行し,簡単に言えば
    「あなたの流量は1です!」あなたのデータは0の確率で0.5程度、1日の確率で0.1程度、2日の確率で0.01程度…これはデータ分類確率に関する仕事です.

    2-4. モデルの設定

    def model(x):
        x = flatten(x)
        return activate(x)
    はい、それではこれを総合して、次のような過程を経ます.
    データのフラット化を実行する->演算を実行する->softmax.

    2-5. クロスエントロピーの設定

    def cross_entropy(y_label, y_pred):
        return (-tf.reduce_sum(y_label * tf.math.log(y_pred + 1.e-10)))
    これは学習値と実際のデータの違い(loss)を計算する方法の一つにすぎない.

    3.Gradient Descentの学習


    簡単にkeras設定モデルで学習します.
    ここではまずオプティマイザを設定します.△勉強はどんなスピードで行いますか.
    optimizer = tf.keras.optimizers.SGD(learning_rate=0.25)
    学習の過程を設定する.
    def train_step(x, y):
        with tf.GradientTape() as tape:
            current_loss = cross_entropy(y, model(x))
    
            grads = tape.gradient(current_loss, [W, b])
            optimizer.apply_gradients(zip(grads, [W, b]))
        return current_loss.numpy()
    まず,current loss項は容易に理解できる.(計算誤差のみ)
    でもちょっとわからない部分がテープ部分
    私はずっとテープをよく理解していないので、簡単に私の理解の方法で書いて、以下のようにします.
    まずtapeに設定した部分は,このコマンドを実行するcontext(ここでは関数回転時)の下で行う演算を順次記憶する装置と見なすことができる.(私が実行した様々な計算結果値を一時的に保存することができます)この関数では、Gradient Decentを実行して傾斜を求めるプロセスと見なすことができます.さらに、オプティマイザは、これらの傾斜の変化を適用して、次の学習の速度に影響します.
    これらの関数で使用される演算の結果をテープで簡単に記憶し、関数の実行時に自由に取り出すことができると見なすだけでは理解しにくい.
    次に、学習プロセスを示す関数を設定します.△そうすれば、勉強がうまくいくかどうかを知ることができる.
    # Weight tensor
    W = tf.Variable(tf.zeros([784, 10],tf.float32))
    # Bias tensor
    b = tf.Variable(tf.zeros([10],tf.float32))
    
    loss_values=[]
    accuracies = []
    epochs = 10
    
    for i in range(epochs):
        j=0
        # each batch has 50 examples
        for x_train_batch, y_train_batch in train_ds:
            j+=1
            current_loss = train_step(x_train_batch, y_train_batch)
            if j%500==0: #reporting intermittent batch statistics
                print("epoch ", str(i+1), "batch", str(j), "loss:", str(current_loss) ) 
        
        # collecting statistics at each epoch...loss function and accuracy
        #  loss function
        current_loss = cross_entropy( y_train, model( x_train )).numpy()
        loss_values.append(current_loss)
        correct_prediction = tf.equal(tf.argmax(model(x_train), axis=1),
                                      tf.argmax(y_train, axis=1))
        #  accuracy
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)).numpy()
        accuracies.append(accuracy)
        print("end of epoch ", str(i+1), "loss", str(current_loss), "accuracy", str(accuracy) ) 
    複雑に見えますが、実はそうではありません.
    ここでまず、時代は繰り返される回数です.つまり、この学習の過程は全部で10回行われる.
    for i in range(epochs):
        j=0
        # each batch has 50 examples
        for x_train_batch, y_train_batch in train_ds:
            j+=1
            current_loss = train_step(x_train_batch, y_train_batch)
            if j%500==0: #reporting intermittent batch statistics
                print("epoch ", str(i+1), "batch", str(j), "loss:", str(current_loss) ) 
    この部分ではまずbatchsizeが50であることを前提としているので,train dsでは常に50個の入力値を抽出してtrain dsのデータをすべて入れるまで繰り返し文を行う.また,進行状況を確認するために500回入力するたびにprint文を実行して結果の進行状況を確認する.
    # collecting statistics at each epoch...loss function and accuracy
        #  loss function
        current_loss = cross_entropy( y_train, model( x_train )).numpy()
        loss_values.append(current_loss)
        correct_prediction = tf.equal(tf.argmax(model(x_train), axis=1),
                                      tf.argmax(y_train, axis=1))
        #  accuracy
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)).numpy()
        accuracies.append(accuracy)
        print("end of epoch ", str(i+1), "loss", str(current_loss), "accuracy", str(accuracy) ) 
    この部分も複雑に見えますが、実は簡単!実際、#loss functionと#精度の下の部分は同じなので、少し説明するだけです.
    # collecting statistics at each epoch...loss function and accuracy
        #  loss function
        current_loss = cross_entropy( y_train, model( x_train )).numpy()
        loss_values.append(current_loss)
        correct_prediction = tf.equal(tf.argmax(model(x_train), 
        	                          tf.argmax(y_train, axis=1))
    まずcurrent lossでさっき作成したcross entropyで誤差を計算します.その後、その誤差をloss value配列に格納します.また、correct prediction部分は簡単で、これは私が予測した値vsの実際の値の比較であり、正しい場合はtrue、またはfalseが渡されます.ここでは,trueの回数のみを決定し,これらをすべて加算し,行った回数で割ると平均的な精度が得られる.このプロセスを行うのはtfです.reduce_mean(...)部分です.