データマイニングは、ニューラルネットワーク(ベースpybrain)デジタル手書き文字認識セットを使用してのチュートリアルシリーズ(8)をはじめMNIST

データマイニングは、ニューラルネットワーク(ベースpybrain)デジタル手書き文字認識セットを使用してのチュートリアルシリーズ(8)をはじめMNIST

:このセクションでは、ニューラルネットワークを理解していない場合ので、強く、私の以前のブログで「スイカブック」、または見て見ることが推奨され、導入されたニューラルネットワークを持っていません(データマイニングチュートリアルシリーズをはじめと7をニューラルネットワークのe)の導入

もともとその後、「Pythonのデータ入力やマイニング実践」コードを識別するために、ニューラルネットワークを使用するステップ内側に、しかし、自分の世代のために確認コードを追跡するためのもの、そして私は、一瞬考えていない有名なMNISTデータセット行い、理由はなかったですそれを使用し、彼は香りがしませんか?

MNIST(混合国立標準研究所と技術データベース) 私たちは基本的に彼を理解して信じて、ほとんどの機械学習の前提条件は、それです。これは非常に大きな手書きでデジタルデータセット(公式サイト)。これは0〜9の手書きの数字が含まれています。データの一部を次のように

データセットは2つの部分、トレーニングとテストセットに分割されます。そして二つのファイル、データファイル、およびイメージの異なるセットでラベルのファイルに分割されます。データセットで60,000万トレーニングデータとテストデータを持っています。画像サイズは28 * 28です。

ダウンロードデータセット

データセットを持つすべての始まり、公式サイトをダウンロードする私たちのためにデータ・セットを提供しますが、にもかかわらずsklearnは、私たちはデータセットをダウンロードするためのより便利な方法を提供します。コードは以下の通りであります:

import numpy as np
from sklearn.datasets import fetch_openml
# X为image数据,y为标签
X, y = fetch_openml('mnist_784', version=1, return_X_y=True)

X、Y、中央には、トレーニングセットの両方が、テストセットを含む場合が含まれています。すなわち、データ70,000個のX又はYです。それはどのようなデータですか?

Xにおいて、各データの長さである(28 \回28 = 784 \ \) アレイは、データアレイは、画像の画素値です。各Yデータは、この画像(0-9)からデジタル表現の代わりに、タグです。

我々は、次に、0より画素値より大きいが1に設定され、データがフォルダに保存され、データを二値化します。

X[X > 0 ] = 1
np.save("./Data/dataset",X)
np.save("./Data/class",y)

そして、Dataフォルダに以下の文書の2がありました:

我々のデータは、データセットの途中で撮影し、その後、次のように、28 * 28の形式に転送します:

データセットはどちらかも私からも、取得するために上記の方法を使用することができるのGitHubのダウンロード(GitHubのファイルサイズ制限がそのように圧縮されているので、あなたは解凍を使用できるようにする必要があるデータセットのデータセット)を超えます。

ロードデータセット

私たちは今、データをロードすることができるので、前の手順では、我々は、良いデータセットをダウンロードしてください。

import numpy as np
X = np.load("./Data/dataset.npy")
y = np.load("./Data/class.npy")

Xは、次のように抽出されたデータであるです。

抽出されたデータyは、次の通り:

すべてが完璧だったが、ニューラルネットワークに問題がある、出力層は、実際にはこれです:

これは、直接出力の結果ではなく、出力\(Y_1、...、y_j、 ...、Y_L \) (MNISTで結果= 10 \ \(L) 数字のわずか10種類あるため)。上記の例では5、出力層は、単純なデジタル出力が、出力10個の値にだけではありません。それでは、どのよう5の出力は、出力10個の数字になりますか?ここでは、「1ホットエンコーディング」を使用します。

ワンホット符号化は、また、主に使用され、コーディング効率的として知られている\(N \)にステータスレジスタのビット(\ N)\コードする状態、他の独立したレジスタのビットによって各状態、および任意にときだけ有効。

以下のデータでは、例えば、各行はレコードを表し、各列はプロパティを表します。二つの特性の最初のは、彼だけなので0,1,2の3つの属性、3つの状態だけのコードが必要です。だから我々は100人の代表者に代わって0010 1001代表2を使用することができます。

そして、それをコードデータの後のデータは次のようになり?図は次のとおりです。

今、私たちは前にロードすることができ、データ・セット・ラベル\(yは\)「1つのホットエンコーディング」こと。

コードは以下の通りであります:

from sklearn.preprocessing import OneHotEncoder
# False代表不生成稀疏矩阵
onehot = OneHotEncoder(sparse = False)
# 首先将y转成行长为7000,列长为1的矩阵,然后再进行转化。
y = onehot.fit_transform(y.reshape(y.shape[0],1))

これは、収集したデータをカットが続きます。データセットカットトレーニングとテストセット。

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(X,y,random_state=14)

ニューラルネットワークでは、我々は、使用pybrainニューラルネットワークを構築するためのフレームワーク。しかし、その後、pybrainライブラリのために、彼は違っていた、彼は我々がそれを所定のフォーマットにデータを変換する必要があるので、自分のデータセットの形式を使用したいです。

from pybrain.datasets import SupervisedDataSet

train_data = SupervisedDataSet(x_train.shape[1],y.shape[1])
test_data = SupervisedDataSet(x_test.shape[1],y.shape[1])

for i in range(x_train.shape[0]):
    train_data.addSample(x_train[i],y_train[i])
for i in range(x_test.shape[0]):
    test_data.addSample(x_test[i],y_test[i])

最後に、データセットは、ここで終わりににロードされます。その後、我々はニューラルネットワークを構築するために始めることができます。

ニューラルネットワークを構築

まず、我々は唯一の入力層と出力層と隠れた層が含まれているニューラルネットワークを、作成します。

from pybrain.tools.shortcuts import buildNetwork
# X.shape[1]代表属性的个数,100代表隐层中神经元的个数,y.shape[1]代表输出
net = buildNetwork(X.shape[1],100, y.shape[1], bias=True)

ここではそれは、以下の機能「偏り」を持っています。バイアスの代わりに、このニューロンと各層であるバイアスニューロン活性化の代わりにバイアスニューロン、バイアス=真です。次の図のバイアスニューロンは、実際には、それはそれはちょうど別の方法である、閾値です。

今、私たちは、比較的単純なニューラルネットワークを築いてきたことを、我々は適切な重量値を取得するにはBPアルゴリズムを使用しています。

バックプロパゲーション(BP)アルゴリズム

上のアルゴリズムの具体的な手順のブログが導入された、BPアルゴリズムは途中pybrainにおける当社の使用するためのライブラリを提供していることは幸運です。ここでは直接コードに。見ることができますBackpropTrainerの詳細を使用して公式サイトを

from pybrain.supervised.trainers import BackpropTrainer
trainer = BackpropTrainer(net, train_data, learningrate=0.01,weightdecay=0.01)

そして、わずかに下に記載されているいくつかのパラメータがあります。

  • ネット:ニューラルネットワーク

  • train_data:トレーニングデータセット

  • learningrate:学習を下回っている割合、\(\ ETA \) 使用することも可能であるlrdecay減衰率を制御するために、このパラメータを、具体的には、見に行った公式サイトのドキュメントにそれを。

    \ [\デルタ\ theta_ {J} = \ \\ {式} \開始{アレイ} {1} \デルタW_ {HJ} = \イータG_ {J} B_ {H}を始める - \イータG_ {J} \ \ \デルタV_ {IH} = \イータE_ {H} X_ {I} \\ \デルタ\ gamma_ {H} = - \イータE_ {H} \\ \端{アレイ} \端{式} \]

  • weightdecay:体重減衰、減衰量は以下の通りです\(\ラムダ\)

    \ [\開始{式} E = \ラムダ\ FRAC {1} {M} \ sum_ {k = 1} ^ {M} E_ {K} +(1- \ラムダ)\ sum_ {I} W_ {I} ^ {2} \\ \ラムダ\で(0,1)\端{式} \]

その後、我々は訓練を始めることができます。

trainer.trainEpochs(epochs=100)

epochsつまり、トレーニングセットの数が横断訓練されています。

次に、ダウンロードには時間が待っています。合宿待ちが完成優れています。トレーニングセット、隠れた層のニューロンの数、PCのパフォーマンス、およびその関連ステップの数とトレーニング時間のサイズ。

覚えている覚えておいて、この時間は、プログラムはアリ雲の上に学生のマシンで実行する、または実行して、自分のマシンを使用することはありません。Lenovoの新しい小さなpro13 i5のバージョンの性能があることが、それでもあまりにも長い間世紀を実行することができますが、ちょっと(ゲームをプレイする私の時間を無駄に)。

予測します

前の工程を経て、いくつかの時間を待った後、我々はトレーニングモデルを完成させました。その後、我々はテストセットの予測を使用することができます。

predictions = trainer.testOnClassData(dataset=test_data)

predictions予測テストセットの結果を表す部分的なデータ:

その後、我々はの精度を検証するために開始し、ここでF1の評価を継続して使用することができます。これは、導入もはや、前に導入されていません。

F1検証

前ので注意を払うする必要があり、y_test我々はデータを使用がone-hot encodingエンコードされているので、我々が最初に必要な、one-hot正常な形にエンコードターン。

# 取每一行最大值的索引。
y_test_arry = y_test.argmax(axis =1)

次のように具体的な結果は以下のとおりです。

そして、F1検証のための値。

from sklearn.metrics import f1_score
print("F-score: {0:.2f}".format(f1_score(predictions,y_test_arry,average='micro')))

そして、次の結果:

結果は特に悪くはないが、特に良いではない、大丈夫と言うことができます。

概要

プロジェクト住所:Githubに上記精度はがた、唯一ではないが\(86 \%\) 大丈夫、すべての後に、それは隠された層と中間層、わずか100個のニューロンの層を使用することです。

コンピュータのパフォーマンスが十分ではなく、適切な場合にはステップ数とトレーニングセットのサイズを小さくし、隠れた層のニューロンの数。

参照

おすすめ

転載: www.cnblogs.com/xiaohuiduan/p/12635624.html