AI-Deep Learing 3日目

20428 ワード

学習内容


猫と犬の画像を分類します

# colab에서 드라이브에 있는 파일을 사용하기 위해 마운트
from google.colab import drive
drive.mount('/content/drive')
import keras
import os, shutil

  • 分類するフォルダを作成


  • ファイルのコピー

  • Copy files.... 
    ---traing file(s) (cat).... 
    ---validation file(s) (cat).... 
    ---test file(s) (cat).... 
    ---traing file(s) (dog).... 
    ---validation file(s) (dog).... 
    ---test file(s) (dog).... 
    チェック
  • コピーされたファイル数
  • print('훈련용 고양이 이미지 전체 개수:', len(os.listdir(train_cats_dir))) # 파일 전체 목록의 길이 확인
    print('검증용 고양이 이미지 전체 개수:', len(os.listdir(validation_cats_dir))) 
    print('테스트용 고양이 이미지 전체 개수:', len(os.listdir(test_cats_dir))) 
    print('훈련용 강아지 이미지 전체 개수:', len(os.listdir(train_dogs_dir)))
    print('검증용 강아지 이미지 전체 개수:', len(os.listdir(validation_dogs_dir))) 
    print('테스트용 강아지 이미지 전체 개수:', len(os.listdir(test_dogs_dir))) 
    훈련용 고양이 이미지 전체 개수: 1000
    검증용 고양이 이미지 전체 개수: 500
    테스트용 고양이 이미지 전체 개수: 500
    훈련용 강아지 이미지 전체 개수: 1000
    검증용 강아지 이미지 전체 개수: 500
    테스트용 강아지 이미지 전체 개수: 500
  • ニューラルネットワーク
  • の作成
    from keras import layers
    from keras import models
    
    # 레이어 11개 생성
    model = models.Sequential()
    model.add(layers.Conv2D(32, (3,3), activation='relu'))
    model.add(layers.MaxPooling2D((2,2)))
    model.add(layers.Conv2D(64, (3,3), activation='relu'))
    model.add(layers.MaxPooling2D((2,2)))
    model.add(layers.Conv2D(128, (3,3), activation='relu'))
    model.add(layers.MaxPooling2D((2,2)))
    model.add(layers.Conv2D(128, (3,3), activation='relu'))
    model.add(layers.MaxPooling2D((2,2)))
    model.add(layers.Flatten()) #이미지를 일자로 펴기
    model.add(layers.Dense(512, activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid'))
    #이진분류할 때는 sigmoid 사용
    #모델 컴파일
    from tensorflow.keras import optimizers
    model.compile(loss='binary_crossentropy', #둘 중 하나면 binary_crossentropy, 여러 개면 categorical_crossentropy
                  optimizer=optimizers.RMSprop(lr=1e-4),
                  metrics=['acc']) 
  • 画像サイズ統一
    画像の大きさによって特性が異なる
    from keras.preprocessing.image import ImageDataGenerator
    
    train_datagen = ImageDataGenerator(rescale=1./255)
    validation_datagen = ImageDataGenerator(rescale=1./255)
    
    train_generator = train_datagen.flow_from_directory(
        train_dir,
        target_size=(150,150),
        batch_size=20,
        class_mode='binary'
    )
    
    validation_generator = validation_datagen.flow_from_directory(
        validation_dir,
        target_size=(150,150),
        batch_size=20,
        class_mode='binary'
    )
  • 学習
  • model.fit_generator(
        train_generator,
        epochs=30,  #반복 횟수
        steps_per_epoch=100,
        validation_data=validation_generator,
        validation_steps=50
    )
    Epoch 1/30
    100/100 [==============================] - 478s 5s/step - loss: 0.6948 - acc: 0.5250 - val_loss: 0.6828 - val_acc: 0.5040
    Epoch 2/30
    100/100 [==============================] - 12s 124ms/step - loss: 0.6624 - acc: 0.5920 - val_loss: 0.6568 - val_acc: 0.5980
    Epoch 3/30
    100/100 [==============================] - 12s 123ms/step - loss: 0.6202 - acc: 0.6630 - val_loss: 0.6147 - val_acc: 0.6700
    ...중략...
    Epoch 29/30
    100/100 [==============================] - 12s 123ms/step - loss: 0.0362 - acc: 0.9900 - val_loss: 1.1306 - val_acc: 0.7200
    Epoch 30/30
    100/100 [==============================] - 12s 123ms/step - loss: 0.0328 - acc: 0.9900 - val_loss: 1.0944 - val_acc: 0.7310
  • モデル
  • を保存
    model.save('cats_and_dogs_small_l.h5') #모델의 확장자 h5
  • グラフィックスを使用して
  • を検証
    history = model.history
    
    import matplotlib.pyplot as plt
    
    acc = history.history['acc']
    val_acc = history.history['val_acc']
    loss = history.history['loss']
    val_loss = history.history['val_loss']
    
    epochs = range(len(acc))
    
    plt.plot(epochs, acc, 'bo', label='Training acc')
    plt.plot(epochs, val_acc, 'b', label='Validation acc')
    plt.title('Training and validation accuracy')
    plt.legend()
    
    plt.figure()
    
    plt.plot(epochs, loss, 'bo', label='Training loss')
    plt.plot(epochs, val_loss, 'b', label='Validation loss')
    plt.title('Training and validation loss')
    plt.legend()

    学習後期


    エラーが発生した場合、問題が発生しなければ解決方法が見つからないが、エラーが発生していないので心配だ.
    今日作った内容を一人で作る自信はありませんが、理解に満足してください.
    復習に時間がかかったので、方法を変えて、悪くないと思います.
    ビデオは全体的に速く见えて、知っている内容を整理して、今日はまずコードの内容を说明して、理解していない部分を単独で検査して、后でもう一度探して、知らない検査はもっと良くて、复习の时间も减りました.おかげさまで、聞きたい授業を聞く余裕ができました.