Keras CIFAR-10カラー画像オブジェクト認識畳み込みニューラルネットワーク

参考図書「Tensorflow + Kerasが深い人工知能の実用化を学ぶ、」とリンダグイ
章IX、やつ。
これは不可避的に説明し非常にユーザーフレンドリー入門練習帳、すべてのコードであり、


CIFAR-10データセットは、10カテゴリ、飛行機、車、鳥、猫、鹿、犬、カエル、馬、ボート、トラックに分け、60000 32x32のカラー画像です。50000のトレーニング画像、万テスト画像

1.データ処理セット
1-1。データセットのダウンロードCIFAR-10

from keras.datasets import cifar10
import numpy as np
np.random.seed(10)

(x_image_train,y_label_train),\
(x_image_test,y_label_test)=cifar10.load_data()

cifar10.load_data()データセットCIFAR-10のダウンロードや読書のために、最初のダウンロードには多少時間がかかります

1-2。表示トレーニングデータ
形状を確認してくださいx_image_train
1-3。もっと見る訓練データ(ラベルとイメージ)

import matplotlib.pyplot as plt
label_dict={0:'airplane',1:'automobile',2:'bird',3:'cat',4:'deer',5:'dog',6:'frog',
													7:'horse',8:'ship',9:'truck'}
#用字典dict定义每一个数字所代表的图像类别名称
def plot_images_labels_prediction(images,labels,prediction,idx,num=10):
     fig=plt.gcf()
     fig.set_size_inches(12,14)
     if num>25: num=25
     for i in range(0,num):
         ax=plt.subplot(5,5,1+i)
         ax.imshow(images[idx],cmap='binary')
         title=str(i)+','+label_dict[labels[i][0]]
         if len(prediction)>0:
             title+='=>'+label_dict[prediction[i]]
             
         ax.set_title(title,fontsize=10)
         ax.set_xticks([]);ax.set_yticks([])
         idx+=1
     plt.show()
     
plot_images_labels_prediction(x_image_train,y_label_train,[],0)#查看训练数据前十项

予測= []、[表示のない予測
前処理画像、ラベルデータに1-4
画像の標準化を、ラベルがホットコード(ワン・ホット・エンコーディング)に変換され
たデジタル標準化するモデルのモデル精度の精度を向上させることができ、モデルは、収束速度を向上させます。

#image预处理 (RGB各通道除以255标准化)
x_image_train_norm=x_image_train.astype('float32')/255.0
x_image_test_norm=x_image_test.astype('float32')/255.0
x_image_train_norm[0][0][0]

RGBを表す第1の点データ3の正規化された画像のトレーニングデータの結果を参照
配列([0.23137255、0.24313726、0.24705882]、DTYPE =のfloat32):12である]アウト

ラベルの前処理
5の前にビューラベル形状データ
ここに画像を挿入説明
ここに画像を挿入説明
ホットエンコード一つにラベル
(1- O-(1000000000)、(01億)、----。6に対応している(0000001000))

#label 预处理
#Keras 提供了np_utils.to_categorical方法可进行One-Hot Encoding转换
from keras.utils import np_utils
y_label_train_OneHot=np_utils.to_categorical(y_label_train).reshape(50000,10)
y_label_test_OneHot=np_utils.to_categorical(y_label_test).reshape(10000,10)

入力:y_label_train_OneHot [:5] ここに画像を挿入説明
2 Keras畳み込みニューラルネットワーク画像認識CIFAR 10-
第1の部分データセットに接続されたダウンロードされ、処理
2-1
、畳み込みニューラルネットワークは、2つの部分に分割することができる
画像の特徴を抽出:畳み込み層1(CONV1 )、プールされた層1(pooling1)、CONV2、pooling2 、 画像特徴抽出。
完全に接続されたニューラルネットワーク:ニューラルネットワーク平坦化層、中間層、で構成される出力層。

2-2モデル
畳み込み層、プールされた層、完全接続ネットワーク(フラット、隠された出力層)が積層線形
model.add()増加層モデル

#2-1 建立模型
from keras.models import Sequential
from keras.layers import Dense,Dropout,Activation,Flatten
from keras.layers import Conv2D,MaxPooling2D,ZeroPadding2D

#建立线性堆叠模型,后续只要将各个神经网络加入模型即可
model=Sequential()
#建立卷积层1
model.add(Conv2D(filters=32,kernel_size=(3,3),input_shape=(32,32,3),
                 activation='relu',padding='same'))
#建立池化层1,将32x32的图像缩减为16x16的图像
model.add(MaxPooling2D(pool_size=(2,2)))
#建立卷积层2
model.add(Conv2D(filters=64,kernel_size=(3,3),activation='relu',padding='same'))
#加入Dropout避免过拟合
model.add(Dropout(0.25))
#建立池化层2
model.add(MaxPooling2D(pool_size=(2,2)))
#建立神经网络
    #建立平坦层
model.add(Flatten())
model.add(Dropout(0.25))
    #建立隐藏层
model.add(Dense(1024,activation='relu'))
model.add(Dropout(0.25))    
    #建立输出层
model.add(Dense(10,activation='softmax'))
  • CONV1層パラメータ
    |フィルタ= 32、| 32のフィルターはランダムに生成された配置|
    | | kernel_size =(3,3)|各フィルタサイズ3×3
    | =パディング「は、同一」|畳み込み画像を畳み込み演算によって生成させ同じ大きさ|
    | input_size =(32,32,3)|三次元形状およびサイズ32×32、カラー画像を表す第3の次元、RGBの3チャネルの第1の2次元画像の代表|
    |活性化=「RELU」|設けられた活性層関数relu |
  • 1つのパラメータをプーリング
  • POOL_SIZE =(2,2)、画像は32×32 16×16に低減されます
  • CONV1層パラメータ
    |フィルタ= 64、| 64のフィルターはランダムに生成された配置|
    | | kernel_size =(3,3)|各フィルタサイズ3×3
    | =パディング「は、同一」|畳み込み画像を畳み込み演算によって生成させ同じ大きさ|
    |活性化=「RELU」|層の活性化関数がRELUを配置|
  • ドロップアウト回避の過剰適合
  • model.add(ドロップアウト(0.25))反復は、ニューラルネットワークの中のニューロンの25%を放棄各研修
    上記と同様の残りのパラメータ
    入力:プリント(model.summary())モデルの要約ビュー
    ここに画像を挿入説明
    2-3トレーニング
#开始训练
train_history=model.fit(x=x_image_train_norm,y=y_label_train_OneHot,validation_split=0.2,
                                epochs=20,batch_size=128,verbose=2)
  • ロス:綿密な研究で機能設定の損失、クロスエントロピーより良いトレーニングを使用して
  • オプティマイザ:トレーニング、利用アダム・オプティマイザは、訓練より速い収束を行い、精度を向上させることができます
  • モデルが正確なレートである方法を評価するメトリックのセット
  • model.fitトレーニングは、トレーニングプロセスは、パラメータが必要性をmodel.fit、train_history内部に存在します。
  • 入力データパラメータをトレーニング
  • x_image_train_norm、y_label_train_OneHot
  • トレーニングと検証データセット率
  • データを検証するためのトレーニングデータ(= 40000 50000x0.8)のvalidation_split = 0.2、80%、20%
  • エポック= 20、20ネットワークトレーニング
  • = 128、128 BATCH_SIZEデータの各バッチ、40,000 / 128 = 313ロットの合計、各ネットワークのトレーニングデータ313は、バッチを処理します
  • 冗長= 2、訓練プロセスが表示されます

2-3ビューの訓練の結果は
、精度、実行損失を見ます

def show_train_history(train_history,train,validation):
    plt.plot(train_history.history[train])
    plt.plot(train_history.history[validation])
    plt.title('Train History')
    plt.ylabel(train)
    plt.xlabel('Epoch')
    plt.legend(['train','validation'],loc='upper left')
    plt.show()


show_train_history(train_history,'acc','val_acc')

plt.figure()
show_train_history(train_history,'loss','val_loss')

結果:
ここに画像を挿入説明
ここに画像を挿入説明

#查看模型正确率
scores=model.evaluate(x_image_test_norm,y_label_test_OneHot,verbose=1)

ここに画像を挿入説明

#2-4 进行预测
prediction=model.predict_classes(x_image_test_norm)
#预测结果,前10项数据
prediction[:10]
#显示前10项结果
plt.figure()
plot_images_labels_prediction(x_image_test,y_label_test,prediction,0,10)

ここに画像を挿入説明
2-5番組の予測確率
ビューテストデータの確率(として分類毎の確率)

#2-5 显示预测概率
#预测概率
Predicted_Probability=model.predict(x_image_test_norm)

def show_Predicted_Probability(y_label,prediction,x_image,
                                   Predicted_Probabilty,i):
    print('label:',label_dict[y_label[i][0]],
              'predict',label_dict[prediction[i]])
    plt.figure(figsize=(2,2))
    plt.imshow(np.reshape(x_image_test[i],(32,32,3)))
    plt.show()
    for j in range(10):
        print(label_dict[j]+' '+'Probability:%1.9f'%(Predicted_Probability[i][j]))
show_Predicted_Probability(y_label_test,prediction,x_image_test,Predicted_Probability,1)  

ここに画像を挿入説明ここに画像を挿入説明

この写真は船は、船が最初の0は、分類誤りである、あなたはまた、上記のように確率を見ることができ、最終的な予測が正確である、0.8812の確率、最高の確率として分類されていることがわかります。

2-6示す混同行列
の混同行列pd.crosstabによって確立され、その入力要件は、一次元アレイ、y_label_test.shape持つすべて、prediction.shape、それぞれ、y_label_testある一次元図、(10000,1)ではないです使用変形は、一次元配列に変換しました

#2-6 显示混淆矩阵
y=y_label_test.reshape(-1)  #将其转换为一维数组

import pandas as pd
print(label_dict)
pd.crosstab(y,prediction,rownames=['labels'],colnames=['predict'])

ここに画像を挿入説明
斜めの予測が正しいか、それはほとんどの混乱のカテゴリーを分析し、少なくとも混乱することができます。

2-7読み込みと保存のモデル
各トレーニング畳み込みニューラルネットワークは、各トレーニングが完了した後にモデルの保存、,,缶を長い時間がかかるだろう、あるいは負荷の重みにウエイト、トレーニングモデルの次の実行を保存し、トレーニングを継続します

'''
#2-7 模型的加载与保存
model.save('model.h5')
#保存模型权重
model.save_weights('my_model_weights.h5')
#下次使用的时候
model = load_model('model.h5')
model.load_weights('my_model_weights.h5')
'''

ここに画像を挿入説明
スクリプトファイルを保存するフォルダ内のファイルの保存の良いH5があるでしょう

ENDが
作成3回の畳み込みニューラルネットワークは、さらに精度を向上します。

課題:
1.白い問題、変数名が間違っ振戦
2.注意注意寸法、np_utils.to_categorical方法オリジナルの本はワンホットエンコーディング変換することができ、変換されたの形状(50000,1、 Iビットを再構築するために行ったように、)10)、出力層は、2次元ベクトルを入力することを示唆し、ネットワークのトレーニングエラーが続き、(50000,1,10受信されます。チャールズは、このnp_utils.to_categoricalそうに悪く、前MNIST手書き数字認識が、これは問題はないだろうか理解していませんでした。
変更:
y_label_train_OneHot = np_utils.to_categorical(y_label_train).reshape(50000,10)

学習プロセスを記録するために不断の努力を続ける...お読みいただきありがとうございました

公開された10元の記事 ウォン称賛10 ビュー7521

おすすめ

転載: blog.csdn.net/qq_41647438/article/details/88614989