CNNネットワークによる画像認識

22153 ワード

CNNネットワークによる画像認識

  • 概要
  • 第1ステップ取得データセット
  • 展示前24枚の画像
  • すべてのデータセットを255で割る再構成画像
  • データをテストセット、トレーニングセット、検証セット
  • に分解する.
  • ボリュームニューラルネットワークの構築を開始する
  • モデルトレーニング開始!
  • テストセット予測
  • 結果展示!!!
  • 感言:
  • 概要


    **本明細書ではkeras(2.1.4)を使用します.その他のバージョンには穴があります.ネットワークフレームワークはCNNネットワークを構築し、cifar 10データセットに対して画像認識を行い、cifar 10はlabel付きの画像データセットであり、データセットの種類は非常に豊富で、ネットワーク性能をよく検査することができ、話は多くなく、直接本題**に入ることができる.

    最初のステップでデータセットを取得


    kerasでcifar 10データセットを直接ダウンロードできます(データセットが大きい場合は時間がかかる場合があります)
    import keras
    # cifar10 
    from keras.datasets import cifar10
    (x_train, y_train), (x_test, y_test) = cifar10.load_data()
    

    展示前の24枚の画像


    データセットの一部のサンプルを観察して、なぜか聞かないでください.プログラマーの厳格さが必要です.厳格!厳格!(大事なことは3回言う)
    import numpy as np
    import matplotlib.pyplot as plt
    
    fig = plt.figure(figsize=(20,5))
    for i in range(36):
        ax = fig.add_subplot(3, 12, i + 1, xticks=[], yticks=[])
        ax.imshow(np.squeeze(x_train[i]))
    

    すべてのデータセットを255で割って画像を再構築


    画像の単一画素の最大値が255であるため、255で割ると、各画素を0-1の間に縮めることができ、標準化と同様である
    x_train = x_train.astype('float32')/255
    x_test = x_test.astype('float32')/255
    

    データをテストセット、トレーニングセット、検証セットに分解

    from keras.utils import np_utils
    
    #  one-hot
    num_classes = len(np.unique(y_train))
    y_train = keras.utils.to_categorical(y_train, num_classes)
    y_test = keras.utils.to_categorical(y_test, num_classes)
    
    #  
    (x_train, x_valid) = x_train[5000:], x_train[:5000]
    (y_train, y_valid) = y_train[5000:], y_train[:5000]
    
    #  
    print('x_train shape:', x_train.shape)
    
    #  
    print(x_train.shape[0], 'train samples')
    print(x_test.shape[0], 'test samples')
    print(x_valid.shape[0], 'validation samples')
    

    ボリュームニューラルネットワークの構築を開始

    from keras.models import Sequential
    from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
    # , 
    model = Sequential()
    # , same ,relu 
    model.add(Conv2D(filters=16, kernel_size=2, padding='same', activation='relu', 
                            input_shape=(32, 32, 3)))
    # 
    model.add(MaxPooling2D(pool_size=2))
    model.add(Conv2D(filters=32, kernel_size=2, padding='same', activation='relu'))
    model.add(MaxPooling2D(pool_size=2))
    model.add(Conv2D(filters=64, kernel_size=2, padding='same', activation='relu'))
    model.add(MaxPooling2D(pool_size=2))
    # , 
    model.add(Dropout(0.3))
    # 
    model.add(Flatten())
    model.add(Dense(500, activation='relu'))
    model.add(Dropout(0.4))
    model.add(Dense(10, activation='softmax'))
    # 
    model.summary()
    # , , , 
    model.compile(loss='categorical_crossentropy', optimizer='rmsprop', 
                      metrics=['accuracy'])
    

    モデルトレーニング開始!


    GPUのない仲間をかわいがる...
    from keras.callbacks import ModelCheckpoint   
    
    # 
    checkpointer = ModelCheckpoint(filepath='model.weights.best.hdf5', verbose=1, 
                                   save_best_only=True)
    hist = model.fit(x_train, y_train, batch_size=32, epochs=100,
              validation_data=(x_valid, y_valid), callbacks=[checkpointer], 
              verbose=2, shuffle=True)
    

    テストセット予測


    ついに人の心を奮い立たせる時になって、自分で作った模型の性能を知りたくありませんか?待ってろ!
    #  
    y_hat = model.predict(x_test)
    
    #  -- :(source: https://www.cs.toronto.edu/~kriz/cifar.html)
    cifar10_labels = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
    

    結果展示!!!

    #  
    fig = plt.figure(figsize=(20, 8))
    for i, idx in enumerate(np.random.choice(x_test.shape[0], size=32, replace=False)):
        ax = fig.add_subplot(4, 8, i + 1, xticks=[], yticks=[])
        ax.imshow(np.squeeze(x_test[idx]))
        pred_idx = np.argmax(y_hat[idx])
        true_idx = np.argmax(y_test[idx])
        ax.set_title("{} ({})".format(cifar10_labels[pred_idx], cifar10_labels[true_idx]),
                     color=("green" if pred_idx == true_idx else "red"))
    

    感想:


    正直に言うと、画像認識の発展は長い過程であり、結果を通じて、私たちは確かに機械を困らせていることがわかります.あなたたちがその訓練結果を自分で見ているとは信じません.あなた自身が何なのか分からない写真があります.の応援ありがとうございました!バイバイ!
    まだ終わっていません.GPUのない仲間はアマゾンに行って無料のGPUサーバーを申請した後、最後にデータセットを提供する先輩たちに敬意を表します!