[PYTHON] Données de formation par CNN

CNN avec keras, essayez avec l'image que vous avez choisie Les bases ont été créées en se référant à cet article.

C'est juste une différence subtile.

J'ai moi-même enquêté sur les détails et j'ai réussi à le faire. Je n'ai pas assez étudié parce que je suis Yoshi parce que j'ai beaucoup bougé.

Le but est de juger OK ou NG à partir d'une image d'une certaine chose. Les données d'image (640x480) sont utilisées comme données d'origine. J'utilise 1000 feuilles pour OK et NG.

Le but est de garder une note des résultats atteints par les débutants.

environnement

Windows10 64bit Anaconda navigator Jupiter notebook Python 3.7.7 tensorflow 2.1.0 tensorflow-gpu 2.1.0 keras 2.3.1 numpy 1.18.1 matplotlib 3.1.3

Construisez un programme dans l'environnement ci-dessus

Bibliothèque

cnn.ipynb


import keras
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.convolutional import MaxPooling2D
from keras.layers import Activation, Conv2D, Flatten, Dense,Dropout
from sklearn.model_selection import train_test_split
from keras.optimizers import SGD, Adadelta, Adagrad, Adam, Adamax, RMSprop, Nadam
from PIL import Image
import numpy as np
import glob
import matplotlib.pyplot as plt
import time
import os

Je n'avais besoin que de ʻAdadelta pour de l'importation de keras.optimizers` Je veux essayer diverses choses et les intégrer. (Je ne l'ai pas testé après tout ...)

Divers réglages

cnn.ipynb


#Réglage
batch_size = 16
epochs = 200

#Répertoire d'images
test_dir ="Spécifiez le répertoire dans lequel les images sont enregistrées"
folder = os.listdir(test_dir)

#Réglage de la taille lors du redimensionnement de l'image originale 640x480
x_image_size = 200#640→200
y_image_size = 200#480→200
dense_size  = len(folder)

Quant à batch_size, les valeurs de paramétrage telles que 1, 4, 32, etc. roulaient pour voir divers sites. Au début, j'ai essayé de le tourner à 32, mais j'ai eu une erreur et cela n'a pas fonctionné, alors je l'ai réglé sur 16. Je ne peux pas dire que c'est correct parce que je n'ai pas enquêté sur tous les détails ... Je viens de me retourner, alors je l'utilise.

Je l'ai réglé séparément pour essayer différentes tailles d'image verticalement et horizontalement. En conséquence, j'ai dû le laisser tomber à 200 ou il était trop lourd à déplacer. Donc ʻimage_size = 200` est très bien. (La dernière description doit être partiellement modifiée)

Chargement d'image

cnn.ipynb


X = []
Y = []
for index, name in enumerate(folder):
    dir = test_dir + name
    files = glob.glob(dir + "/*.jpg ")
    for i, file in enumerate(files):
        image = Image.open(file)
        image = image.convert("RGB")
        image = image.resize((x_image_size, y_image_size))
        data = np.asarray(image)
        X.append(data)
        Y.append(index)

X = np.array(X)
Y = np.array(Y)
X = X.astype('float32')
X = X / 255.0

Y = np_utils.to_categorical(Y, dense_size)
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.15)

Cette fois, le test a été fixé à 15%, ce qui est presque le même que l'article auquel j'ai fait référence.

Création de modèles CNN

cnn.ipynb


model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',input_shape=X_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(dense_size))
model.add(Activation('softmax'))

model.summary()

Pour être honnête, j'étudie Où et comment le touchez-vous pour le changer? Je ne sais pas. site officiel de Keras Je regarde ici, mais les amateurs ne peuvent pas comprendre ...

Création de machine d'apprentissage

cnn.ipynb


optimizers ="Adadelta"
results = {}

model.compile(loss='categorical_crossentropy', optimizer=optimizers, metrics=['accuracy'])
results[0]= model.fit(X_train, y_train, validation_split=0.2, epochs=epochs,batch_size=batch_size)

model_json_str = model.to_json()
open('model.json', 'w').write(model_json_str)
model.save('weights.h5');

Pour être honnête, je ne pourrais même pas l'atteindre sans Qiita. Merci beaucoup.

résultat

Résultat d'apprentissage 2020-09-22 (3).png

résultats de test 2020-09-22 (4).png

Au début, le résultat était terrible et le résultat d'apprentissage est devenu une barre horizontale. À ce moment-là, les données d'image sont aussi petites qu'environ 50 chacune. Le nombre d'époques était également d'environ 20.

Quelqu'un m'a dit que "les images sont la vie", et je pense que c'était exactement le résultat.

Après cela, je suis ravi de faire une inférence basée sur ces données et d'obtenir le résultat correctement.

Résumé

Pour une raison quelconque, j'ai pu le créer sous forme de données. Je me suis rendu compte que la partie «essayer diverses choses» faisait cruellement défaut. J'ai pu savoir à nouveau que je ne me souviens pas ou essayer de savoir à moins de bouger ma main.

Si vous commencez avant l'âge de 40 ans, ce sera difficile car votre cerveau refusera.

c'est tout.

Recommended Posts

Données de formation par CNN
Créer des données d'entraînement
Corrélation par prétraitement des données
Gzip compresser les données en streaming
Visualisation des données par préfecture
Données acquises par Django reliées
Estimation de la profondeur par CNN (CNN SLAM # 3)
Première analyse de données satellitaires par Tellus
Cours de formation Data Scientist Chapitre 2 Jour 2
Cours de formation Data Scientist Chapitre 3 Jour 3
Cours de formation Data Scientist Chapitre 4 Jour 1
Cours de formation Data Scientist Chapitre 3 Jour 1 + 2
Fractionnement des données de formation étiquetées sur le nettoyage des pandas
10 sélections d'extraction de données par pandas.DataFrame.query
Animation des géodonnées par geopandas
Détection d'anomalies des données ECG par profil matriciel
Organisez les données séparées par dossier avec Python
J'ai suivi une formation à l'analyse de données Python à distance