Faltungsneurales Netzwerk (CNN) Faltungsneurales Netzwerk (CNN) Lassen Sie uns ein Experiment durchführen, um den Namen anhand des Bildes der Blume zu identifizieren!
Dieses Mal werden wir das Programm in die Docker-Umgebung stellen.
Macbook pro 13 2016
Docker kann einfach als Binärdatei von der folgenden Site installiert werden.
https://docs.docker.com/docker-for-mac/
Sie können eine kompilierte Binärdatei mit Paketen für maschinelles Lernen installieren Bauen Sie eine Umgebung mit 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
Hängen Sie dieses Mal den zu entwickelnden Ordner in Docker ein.
# [mount dir]Bitte umschreiben und verwenden.
$ docker run -i -t -v [mount dir]:/home/src conda:init /bin/bash
Sie können den Vorgang beenden, indem Sie "Strg + p" oder "Strg + q" drücken.
Beim erneuten Zugriff auf den Container
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
745860b72c67 conda:init "/usr/bin/tini -- ..." 11 hours ago Up 11 hours friendly_galileo
#Geben Sie die CONTAINER-ID an
$ docker attach 745860b72c67
Damit ist die Umgebungsvorbereitung abgeschlossen
Sammeln Sie entsprechende Blumenbilder aus dem Internet! Benennen Sie die Blume im Verzeichnisnamen, wie in der Abbildung unten gezeigt, und platzieren Sie das Bild der Blume darin.
Bereiten Sie ein Programm zum Speichern von Bilddaten und einer Reihe von Kategorien vor.
data_create.py
from PIL import Image
import sys
from sklearn import cross_validation
import os, glob
import numpy as np
import random, math
#
#Trainingsdaten generieren
#
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 = [] #Bilddaten,Daten beschriften
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)
#Daten mischen
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()
Bereiten Sie als Nächstes ein Programm vor, um ein Lernmodell zu erstellen.
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
#
#Modell generieren
#
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")
#Normalisieren Sie die Daten
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 (Einstellung)
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 (Einstellung)
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 :
#Lernen und speichern Sie das Modell
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)
#Modelltest
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()
Das Lernen ist jetzt abgeschlossen.
Versuchen Sie es dann.
#Bilder anordnen
$ python data_create.py
---Ai (Tadeai)
---Aogiri
---Aomoria Zami (Okino Zami)
---Agapanthus (Murasakikunsilane)
---Akaza
---Akashouma
---Akabana Buchweizen
---Akabana Mitsumata
---Akaya Jio
---Akanthus(Haazami)
---Aginashi
---Akizaki Schneeflocke
---Akino Unagitsukami
---Akino Tamurasou (Salvia Japonica)
---Akinonogeshi
---Akinowasu Regusa
:
:
#Lernen
$ python train.py
:
loss= 0.0410282239616
accuracy= 0.992773946126
Die Trefferquote von 99% ist fehlerhaft (lacht)
Bereiten Sie ein einfaches Programm für die Modellprüfung vor.
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("Blumenname: ", categories[y])
Getestet mit Gurkenblüten.
$ python check.py test/flower.jpg
Using TensorFlow backend.
Blumenname:Gurke
Gurke ist erfolgreich! Aber es gab Zeiten, in denen andere Fotos nicht funktionierten. Ich werde ein bisschen mehr lernen und es wieder geben.
Ich werde Ihnen auch geben, wie Sie einen Chat-Bot mit Lernen erstellen, wenn Sie Zeit haben.
Recommended Posts