Réseau neuronal convolutif (CNN) Réseau neuronal convolutif (CNN) Faisons une expérience pour identifier le nom de l'image de la fleur!
Cette fois, nous mettrons le programme dans l'environnement docker.
Macbook pro 13 2016
docker peut être facilement installé en tant que binaire à partir du site suivant.
https://docs.docker.com/docker-for-mac/
Vous pouvez installer un binaire compilé contenant des packages d'apprentissage automatique Construisez un environnement avec conda (Miniconda).
$ docker pull continuumio/miniconda3
$ vi Dockerfile
:
$ cat Dockerfile
FROM continuumio/miniconda3
RUN apt-get update
RUN pip install --upgrade pip
RUN pip install tensorflow \
pandas \
scipy \
Pillow \
keras
RUN pip install -U scikit-learn
RUN mkdir /home/src/
$ docker build -t conda:init .
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
conda init daf923e29da8 2 hours ago 1.55 GB
Cette fois, montez le dossier à développer sur le docker.
# [mount dir]Veuillez réécrire et utiliser.
$ docker run -i -t -v [mount dir]:/home/src conda:init /bin/bash
Vous pouvez quitter en appuyant sur "Ctrl + p" ou "Ctrl + q".
Lors de l'accès à nouveau au conteneur
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
745860b72c67 conda:init "/usr/bin/tini -- ..." 11 hours ago Up 11 hours friendly_galileo
#Spécifiez l'ID DE CONTENEUR
$ docker attach 745860b72c67
Ceci termine la préparation de l'environnement
Collectez des images de fleurs sur Internet! Nommez la fleur dans le nom du répertoire comme indiqué dans la capture ci-dessous, et placez-y l'image de la fleur.
Préparez un programme pour enregistrer les données d'image et un tableau de catégories.
data_create.py
from PIL import Image
import sys
from sklearn import cross_validation
import os, glob
import numpy as np
import random, math
#
#Générer des données d'entraînement
#
class DataCreate :
def __init__(self, script_name):
Image.LOAD_TRUNCATED_IMAGES = True
def create(self) :
input_dir = "images"
categorys = []
dir_list = os.listdir(input_dir)
for index, dir_name in enumerate(dir_list):
if dir_name == '.DS_Store' :
continue
categorys.append(dir_name)
image_size = 50
train_data = [] #données d'image,Données d'étiquette
for idx, category in enumerate(categorys):
try :
print("---", category)
image_dir = input_dir + "/" + category
files = glob.glob(image_dir + "/*.jpg ")
for i, f in enumerate(files):
img = Image.open(f)
img = img.convert("RGB")
img = img.resize((image_size, image_size))
data = np.asarray(img)
train_data.append([data, idx])
except:
print("SKIP : " + category)
#Mélanger les données
random.shuffle(train_data)
X, Y = [],[]
for data in train_data:
X.append(data[0])
Y.append(data[1])
test_idx = math.floor(len(X) * 0.8)
xy = (np.array(X[0:test_idx]), np.array(X[test_idx:]),
np.array(Y[0:test_idx]), np.array(Y[test_idx:]))
np.save("./npy/flower", xy)
if __name__ == "__main__":
args = sys.argv
datacreate = DataCreate(args[0])
datacreate.create()
Ensuite, préparez un programme pour créer un modèle d'apprentissage.
train.py
import sys
import os
import numpy as np
import pandas as pd
import gc
from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.utils import np_utils
#
#Générer un modèle
#
class TrainModel :
def __init__(self):
input_dir = 'images'
self.nb_classes = len([name for name in os.listdir(input_dir) if name != ".DS_Store"])
x_train, x_test, y_train, y_test = np.load("./npy/flower.npy")
#Normaliser les données
self.x_train = x_train.astype("float") / 256
self.x_test = x_test.astype("float") / 256
self.y_train = np_utils.to_categorical(y_train, self.nb_classes)
self.y_test = np_utils.to_categorical(y_test, self.nb_classes)
def train(self, input=None) :
model = Sequential()
# K=32, M=3, H=3
if input == None :
model.add(Convolution2D(32, 3, 3, border_mode='same', input_shape=self.x_train.shape[1:]))
else :
model.add(Convolution2D(32, 3, 3, border_mode='same', input_shape=input))
# K=64, M=3, H=3 (réglage)
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Convolution2D(64, 3, 3, border_mode='same'))
model.add(Activation('relu'))
# K=64, M=3, H=3 (réglage)
model.add(Convolution2D(64, 3, 3))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
# biases nb_classes
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(self.nb_classes))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
if input == None :
#Apprenez et enregistrez le modèle
model.fit(self.x_train, self.y_train, batch_size=32, nb_epoch=10)
hdf5_file = "./model/flower-model.hdf5"
model.save_weights(hdf5_file)
#test de modèle
score = model.evaluate(self.x_test, self.y_test)
print('loss=', score[0])
print('accuracy=', score[1])
return model
if __name__ == "__main__":
args = sys.argv
train = TrainModel()
train.train()
gc.collect()
L'apprentissage est maintenant terminé.
Ensuite, essayez de l'exécuter.
#Organiser les images
$ python data_create.py
---Ai (Tadeai)
---Aogiri
---Aomoria Zami (Okino Zami)
---Agapanthe (Murasakikunsilane)
---Akaza
---Akashouma
---Sarrasin Akabana
---Akabana Mitsumata
---Akaya Jio
---Acanthe(Haazami)
---Aginashi
---Flocon de neige Akizaki
---Akino Unagitsukami
---Akino Tamurasou (Salvia Japonica)
---Akinonogeshi
---Akinowasu Regusa
:
:
#Apprentissage
$ python train.py
:
loss= 0.0410282239616
accuracy= 0.992773946126
Le taux de réussite de 99% est buggy (rires)
Préparez un programme simple pour tester le modèle.
check.py
import train as train
import sys, os
from PIL import Image
import numpy as np
import pandas as pd
if len(sys.argv) <= 1:
quit()
image_size = 50
input_dir = 'images'
categories = [name for name in os.listdir(input_dir) if name != ".DS_Store"]
X = []
for file_name in sys.argv[1:]:
img = Image.open(file_name)
img = img.convert("RGB")
img = img.resize((image_size, image_size))
in_data = np.asarray(img)
X.append(in_data)
X = np.array(X)
model = train.TrainModel().train(X.shape[1:])
model.load_weights("./model/flower-model.hdf5")
predict = model.predict(X)
for pre in predict:
y = pre.argmax()
print("Nom de la fleur: ", categories[y])
Testé avec des fleurs de concombre.
$ python check.py test/flower.jpg
Using TensorFlow backend.
Nom de la fleur:concombre
Le concombre est réussi! Mais il y avait des moments où d'autres photos ne fonctionnaient pas. Je vais étudier un peu plus et le redonner.
Je vais également vous expliquer comment créer un chat bot avec apprentissage lorsque vous en aurez le temps.
Recommended Posts