1日1回のKaggleMNIST DeepLearningコードのマイニング
8031 ワード
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.0y_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の悪夢を考えて...)
ここまで、次のような過程を経てきました.
2.学習用の関数の設定
大体いくつか設定しますが、
設定
この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(...)部分です.Reference
この問題について(1日1回のKaggleMNIST DeepLearningコードのマイニング), 我々は、より多くの情報をここで見つけました https://velog.io/@papago2355/하루-1코드-리뷰-MNIST-DeepLearning-코드-파헤치기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol