ããã«ã¡ã¯ãHabrïŒ ã«ããã®äžã§ã
Kerasãã¬ãŒã ã¯ãŒã¯ã䜿çšããInceptionV3ã¢ãŒããã¯ãã£ã®ç³ã¿èŸŒã¿ãã¥ãŒã©ã«ãããã¯ãŒã¯ã®å®è£
ã«ã€ããŠèª¬æããŸãã ãã¥ãŒããªã¢ã«ã
å°éã®ããŒã¿ã䜿çšãã匷åãªåé¡ã¢ãã«ã®æ§ç¯ ããèªãã åŸãèšäºãæžãããšã«ããŸããã ãã¥ãŒããªã¢ã«ã®èè
ã®æ¿èªãåŸãŠãèšäºã®å
容ãå°ãå€æŽããŸããã èè
ãææ¡ãããã¥ãŒã©ã«ãããã¯ãŒã¯
VGG16ãšã¯ç°ãªãã
Kerasã«ãããããã€ã³ã¹ããŒã«ãããŠããGoogleãã£ãŒããã¥ãŒã©ã«ãããã¯ãŒã¯
Inception V3ããã¬ãŒãã³ã°ããŸãã
ããªããåŠã³ãŸãïŒ
- Kerasã©ã€ãã©ãªãããã¥ãŒã©ã«ãããã¯ãŒã¯Inception V3ãã€ã³ããŒãããŸãã
- ãããã¯ãŒã¯ãèšå®ããŸãïŒéã¿ãããŒãããã¢ãã«ã®äžéšãå€æŽãïŒ fc-layers ïŒãã¢ãã«ããã€ããªåé¡ã«é©åãããŸã;
- ãã¥ãŒã©ã«ãããã¯ãŒã¯ã®äžäœç³ã¿èŸŒã¿å±€ã埮調æŽããŸãã
- ImageDataGeneratorã䜿çšããŠããŒã¿æ¡åŒµãé©çšããŸãã
- ãããã¯ãŒã¯ãéšåçã«ãã¬ãŒãã³ã°ããŠããªãœãŒã¹ãšæéãç¯çŽããŸãã
- ã¢ãã«ã®ããã©ãŒãã³ã¹ãè©äŸ¡ããŸãã
èšäºãæžããšããç§ã¯Kerasãã¬ãŒã ã¯ãŒã¯ã®ããã€ãã®èå³æ·±ãæ©èœãæããã«ããæãå®çšçãªè³æãæ瀺ããã¿ã¹ã¯ãèªåã§èšå®ããŸããã
æè¿ããã¥ãŒã©ã«ãããã¯ãŒã¯ã®äœæãšã¢ããªã±ãŒã·ã§ã³ã«ç¹åãããã¥ãŒããªã¢ã«ããŸããŸãç»å ŽããŠããŸãã èå³æ·±ããã¬ã³ããç®ã«ããããšã¯å€§ããªåã³ã§ããããã°ã©ãã³ã°ã®åéã®éå°é家ã«ãšã£ãŠæ°ããæçš¿ããŸããŸãç解ãããããªã£ãŠããŸãã
äžéšã®èè
ã¯ãæãèªç¶ãªèšèªã䜿çšããŠãèªè
ã«ãã®ãããã¯ã玹ä»ããããšããŠããŸãã ãŸããåççãªéã®çè«ãšå®è·µãçµã¿åãããåªããèšäºïŒ
1ã2ã3ãªã© ïŒããããå¿
èŠãªæå°å€ããã°ããç解ããç¬èªã®äœããäœæãå§ããããšãã§ããŸãã
ã ããããã€ã³ãã«ïŒ
ãŸãæåã«ãã©ã€ãã©ãªã«ã€ããŠå°ã説æããŸããAnacondaãã©ãããã©ãŒã ãã€ã³ã¹ããŒã«ããããšããå§ãããŸãã Python 2.7ã䜿çšããŸããã ä»äºã«ã¯
Jupyter Notebookã䜿çšãããšäŸ¿å©ã§ãã Anacondaã«ã¯ãã§ã«ããªã€ã³ã¹ããŒã«ãããŠããŸãã
Kerasãã¬ãŒã ã¯ãŒã¯ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã ããã¯ãšã³ããšããŠã
Theanoã䜿çšããŸããã Kerasã¯äž¡æ¹ããµããŒãããŠãããããTensorflowã䜿çšã§ããŸãã Windowsã§ã®TheanoçšCUDAã®ã€ã³ã¹ããŒã«ã«ã€ããŠã¯ã
ãã¡ããã芧ãã ãã ã
1.ããŒã¿ïŒ
ãã®äŸã§ã¯ã
kaggle.comã§ã
ç¬ãšç« ããšããæ©æ¢°åŠç¿ã³ã³ãã¹ãã®ç»åã䜿çšããŸãã ããŒã¿ã¯ç»é²åŸã«å©çšå¯èœã«ãªããŸãã ãã®ã»ããã«ã¯ã12,500å¹ã®ç«ãš12,500å¹ã®ç¬ã®25,000æã®ç»åãå«ãŸããŠããŸãã ã¯ã©ã¹1ã¯ç¬ãã¯ã©ã¹0ã¯ç«ã«å¯Ÿå¿ããŸãã ã¢ãŒã«ã€ããããŠã³ããŒããããã次ã®ãã
ã«åã¯ã©ã¹ã®1000åã®ã€ã¡ãŒãžããã£ã¬ã¯ããªã«é
眮ããŸãã
data/ train/ dogs/ dog001.jpg dog002.jpg ... cats/ cat001.jpg cat002.jpg ... validation/ dogs/ dog1000.jpg dog1001.jpg ... cats/ cat1000.jpg cat1001.jpg ...
ããŒã¿ã»ããå
šäœã®äœ¿çšã劚ãããã®ã¯äœããããŸããã ç§ã¯ãå
ã®èšäºã®èè
ãšåæ§ã«ãéãããéžæè¢ã䜿çšããŠãå°ããªç»åã»ããã§ãããã¯ãŒã¯ã®å¹çã確èªããããšã«ããŸããã次ã®3ã€ã®åé¡ããããŸãã
- éãããéã®ããŒã¿ã
- éãããã·ã¹ãã ãªãœãŒã¹ïŒããšãã°ãIntel Core i5-4440 3.10GHzã8 GBã®RAMãNVIDIA GeForce GTX 745ããããŸãïŒã
- éãããæéïŒã¢ãã«ã1æ¥ä»¥å
ã«ãã¬ãŒãã³ã°ãããã
éãããç»åããªã¥ãŒã ã§ã¯ã åãã¬ãŒãã³ã°ã®å¯èœæ§ãé«ããªããŸãã ããã«å¯Ÿæããã«ã¯ã次ã®ãã®ãå¿
èŠã§ãã
- 倧ããªããããã¢ãŠããã€ã³ã¹ããŒã«ããŸãã ç§ãã¡ã®å Žåãããã¯0.5ã«ãªããŸãã
- ããŒã¿æ¡åŒµã䜿çšããŸãã ãã®ææ³ã«ãããããŸããŸãªå€æã«ãã£ãŠç»åã®æ°ãå¢ããããšãã§ããŸãïŒãã®å Žåãã¹ã±ãŒã«ãã·ãããæ°Žå¹³åå°ã«å€åããããŸãïŒã
- å®éšã§ã¯ãæ·±ããããã¯ãŒã¯ã䜿çšããŸãã
ãã£ãŒããã¥ãŒã©ã«ãããã¯ãŒã¯ã¯ãªãœãŒã¹ãèŠæ±ããŠãããããæåŸã®ãã€ã³ãã¯ç§ãã¡ã«é¢ä¿ããã¯ãã§ãã ãããªã«ãŒãã§VGG16ãæããããšããã§ããŸããã§ãããã€ã³ã»ãã·ã§ã³ã®ãããªå·šäººã¯èšããŸã§ããããŸããã ãã ãã解決çã¯æ¬¡ã®ãšããã§ãã
- æåã«ã imagenetããŒã¿ããŒã¹ããã®å€æ°ã®ç»åã§ãã¬ãŒãã³ã°ãããã¢ãã«ã䜿çšããŸãã 幞ããªããšã«ãäžé£ã®ç»åã«ã¯ç«ãšç¬ãå«ãŸããŠããŸããã
- ã¢ãã«ãéšåçã«ãã¬ãŒãã³ã°ããŸãã
- æåã«ããããã¯ãŒã¯ã®äžéšã§ïŒInceptionã®ã¿ãä»ããŠïŒæ¡åŒµç»åãå®è¡ããnumpyé
åãšããŠä¿åããŸãã
- çµæã®numpyé
åã䜿çšããŠãå®å
šã«æ¥ç¶ãããäžäœå±€ããã¬ãŒãã³ã°ããŸãã
- 次ã«ãã¢ãã«ã®äžäœå±€ãšäžäœå±€ãçµã¿åãããŠæ°ããã¢ãã«ã埮調æŽããŸãããåæã«ãæåŸã®å±€ãé€ããã¹ãŠã®å±€ãInceptionããåŠç¿ããªãããã«ãããã¯ããŸãã
æéã®çµéã«äŒŽãåé¡ã®å¯äžã®è§£æ±ºçã¯ã䞊åèšç®ã®äœ¿çšãèŠãŠããŸãã ãã®ããã«ã¯ã
CUDAããµããŒãããã°ã©ãã£ãã¯ã«ãŒããå¿
èŠã§ãã
Pythonçšã®CUDAãã€ã³ã¹ããŒã«ããŠããããã»ã©å€§ããªåé¡ã«ãªããªãããšãé¡ã£ãŠããŸã ã
ã©ã€ãã©ãªãã€ã³ããŒãããŸãã
from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential, Model from keras.applications.inception_v3 import InceptionV3 from keras.callbacks import ModelCheckpoint from keras.optimizers import SGD from keras import backend as K K.set_image_dim_ordering('th') import numpy as np import pandas as pd import h5py import matplotlib.pyplot as plt
2. InceptionV3ã¢ãã«ãäœæããã€ã¡ãŒãžãããŒãããŠä¿åããŸãã
ç§ãã¡ã®è¡åã®å³ãå«ã倧ããªåç Kerasã©ã€ãã©ãªã«ã¯ãããã€ãã®èšç·Žããããã¥ãŒã©ã«ãããã¯ãŒã¯ããããŸãã
ã¢ãã«åŒæ°ãªã¹ãinclude_topïŒãããã¯ãŒã¯ã®ããããæå¹ãŸãã¯ç¡å¹ã«ããŸããããã¯ãåºåã1000åããå®å
šã«æ¥ç¶ãããã¬ã€ã€ãŒã§ãã
å¿
èŠãªãã®ã§ã次ãèšå®ããŸããinclude_top = False;
ãŠã§ã€ã ïŒãã¬ãŒãã³ã°æžã¿ãŠã§ã€ããããŒã/ããŒãããŸããã Noneã®å Žåãéã¿ã¯ã©ã³ãã ã«åæåãããŸãã ãimagenetãã®å Žåã
ImageNetããŒã¿ã«ããŒãããããŠã§ã€ããããŒããããŸãã
ãã®ã¢ãã«ã§ã¯éã¿ãå¿
èŠã§ãããããã£ãŠãweights = "imagenet";
input_tensor ïŒãã®åŒæ°ã¯ãã¢ãã«ã«å
¥åã¬ã€ã€ãŒã䜿çšããå Žåã«äŸ¿å©ã§ãã
ç§ãã¡ã¯åœŒã«è§ŠããŸããã
input_shape ïŒãã®åŒæ°ã§ã¯ãç»åã®ãµã€ãºãèšå®ããŸãã æäžå±€ãåãé¢ãããŠããå Žåã«è¡šç€ºãããŸãïŒinclude_top = FalseïŒã ã¢ãã«ã«æäžå±€ãããŒãããå Žåã100ã®ç»åãµã€ãºã¯ïŒ3ã299ã299ïŒã«ãªããŸãã
æäžå±€ãåé€ããå°ããªç»åïŒ3ã150ã150ïŒãåæããããšæããŸãã ãããã£ãŠã次ã®ããã«ãªããŸãïŒinput_shape =ïŒïŒ
ã¢ãã«ãäœæããŸãã
inc_model=InceptionV3(include_top=False, weights='imagenet', input_shape=((3, 150, 150)))
ããã§ã¯ãããŒã¿ã®æ¡åŒµãè¡ããŸãããã ãã®ããã«ãKerasã¯ããããImageDataGeneratorãæäŸããŸãã ãã©ã«ãããç»åãçŽæ¥ååŸããå¿
èŠãªå€æããã¹ãŠå®è¡ããŸãã
åã¯ã©ã¹ã®åçã¯å¥ã
ã®ãã©ã«ããŒã«å
¥ããå¿
èŠããããŸãã RAMã«ç»åãèªã¿èŸŒãŸãªãããã«ããããã¯ãŒã¯ã«ã¢ããããŒãããçŽåã«ç»åãå€æããŸãã ãããè¡ãã«ã¯ã.flow_from_directoryã¡ãœããã䜿çšããŸãã ç»åã®ãã¬ãŒãã³ã°ãšãã¹ãçšã«å¥ã
ã®ãžã§ãã¬ãŒã¿ãŒãäœæããŸãããïŒ
bottleneck_datagen = ImageDataGenerator(rescale=1./255)
éèŠãªãã€ã³ãã匷調ãããã
shuffle = Falseãæå®ããŸããã ã€ãŸããç°ãªãã¯ã©ã¹ã®ç»åã¯æ··åšããŸããã æåã«ãæåã®ãã©ã«ããŒããç»åãå°çãããããããã¹ãŠçµäºãããšã2çªç®ãããã©ã«ããŒã«å°çããŸãã ãªãå¿
èŠãªã®ããåŸã§èŠãŠãã ããã
èšç·ŽãããInceptionãéããŠæ¡åŒµç»åãå®è¡ããåºåãnumpyé
åãšããŠä¿åããŸãã
bottleneck_features_train = inc_model.predict_generator(train_generator, 2000) np.save(open('bottleneck_features/bn_features_train.npy', 'wb'), bottleneck_features_train) bottleneck_features_validation = inc_model.predict_generator(validation_generator, 2000) np.save(open('bottleneck_features/bn_features_validation.npy', 'wb'), bottleneck_features_validation)
ãã®ããã»ã¹ã«ã¯æéãããããŸãã
3.ã¢ãã«ã®äžéšãäœæããããŒã¿ãããŒãããŠä¿åããŸãã
å
ã®æçš¿ã§ã¯ãèè
ã¯256åã®ãã¥ãŒãã³ãæã€1ã€ã®ãããã¯ãŒã¯ã¬ã€ã€ãŒã䜿çšããŸãããããããã64åã®ãã¥ãŒãã³ãæã€2ã€ã®ã¬ã€ã€ãŒãš0.5ã®å€ãæã€ããããã¢ãŠãã¬ã€ã€ãŒã䜿çšããŸãã å®æããã¢ãã«ããã¬ãŒãã³ã°ãããšïŒæ¬¡ã®ã¹ãããã§è¡ããŸãïŒãã³ã³ãã¥ãŒã¿ãŒãã¯ã©ãã·ã¥ããŠåèµ·åããããããã®å€æŽãäœåãªããããŸããã
é
åãããŒãããŸãã
train_data = np.load(open('bottleneck_features_and_weights/bn_features_train.npy', 'rb')) train_labels = np.array([0] * 1000 + [1] * 1000) validation_data = np.load(open('bottleneck_features_and_weights/bn_features_validation.npy', 'rb')) validation_labels = np.array([0] * 1000 + [1] * 1000)
以åã«
shuffle = Falseãæå®ããããšã«æ³šæããŠãã ããã ãããŠä»ãç°¡åã«
ã©ãã«ãæå®ã§ããŸãã åã¯ã©ã¹ã«ã¯2000åã®ç»åãããããã¹ãŠã®ç»åãé çªã«åä¿¡ãããããããã¬ãŒãã³ã°çšãšãã¹ããµã³ãã«çšã«1000åã®ãŒããš1000åã®ãŠãããããããŸãã
FFNãããã¯ãŒã¯ã®ã¢ãã«ãäœæããã³ã³ãã€ã«ããŸãã
fc_model = Sequential() fc_model.add(Flatten(input_shape=train_data.shape[1:])) fc_model.add(Dense(64, activation='relu', name='dense_one')) fc_model.add(Dropout(0.5, name='dropout_one')) fc_model.add(Dense(64, activation='relu', name='dense_two')) fc_model.add(Dropout(0.5, name='dropout_two')) fc_model.add(Dense(1, activation='sigmoid', name='output')) fc_model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
é
åãããã«ããŒãããŸãã
fc_model.fit(train_data, train_labels, nb_epoch=50, batch_size=32, validation_data=(validation_data, validation_labels)) fc_model.save_weights('bottleneck_features_and_weights/fc_inception_cats_dogs_250.hdf5')
çŸåšããã©ã«ãããããŒã¿ãããŒãããŠããªããããéåžžã®
è¿äŒŒæ¹æ³ã䜿çšããŸãã
åŠç¿ããã»ã¹ã¯éåžžã«é«éã§ãã åæ代ã¯ç§ã«1ç§ããããŸããã Train on 2000 samples, validate on 2000 samples Epoch 1/50 2000/2000 [==============================] - 1s - loss: 2.4588 - acc: 0.8025 - val_loss: 0.7950 - val_acc: 0.9375 Epoch 2/50 2000/2000 [==============================] - 1s - loss: 1.3332 - acc: 0.8870 - val_loss: 0.9330 - val_acc: 0.9160 ⊠Epoch 48/50 2000/2000 [==============================] - 1s - loss: 0.1096 - acc: 0.9880 - val_loss: 0.5496 - val_acc: 0.9595 Epoch 49/50 2000/2000 [==============================] - 1s - loss: 0.1100 - acc: 0.9875 - val_loss: 0.5600 - val_acc: 0.9560 Epoch 50/50 2000/2000 [==============================] - 1s - loss: 0.0850 - acc: 0.9895 - val_loss: 0.5674 - val_acc: 0.9565
ã¢ãã«ã®ç²ŸåºŠãæšå®ããŸãã
fc_model.evaluate(validation_data, validation_labels)
[0.56735104312408047ã0.95650000000000002]
ç§ãã¡ã®ã¢ãã«ã¯ããã®ã¿ã¹ã¯ã«ååã«å¯Ÿå¿ããŠããŸãã ãã ããnumpyé
åã®ã¿ãåãå
¥ããŸãã ããã¯ç§ãã¡ã«ã¯åããŸããã å
¥åç»åãåãå
¥ããæ¬æ Œçãªã¢ãã«ãååŸããããã«ã2ã€ã®ã¢ãã«ãæ¥ç¶ããŠå床ãã¬ãŒãã³ã°ããŸãã
4.æçµã¢ãã«ãäœæããæ¡åŒµããŒã¿ãããŒãããŠãéã¿ãä¿åããŸãã
weights_filename='bottleneck_features_and_weights/fc_inception_cats_dogs_250.hdf5' x = Flatten()(inc_model.output) x = Dense(64, activation='relu', name='dense_one')(x) x = Dropout(0.5, name='dropout_one')(x) x = Dense(64, activation='relu', name='dense_two')(x) x = Dropout(0.5, name='dropout_two')(x) top_model=Dense(1, activation='sigmoid', name='output')(x) model = Model(input=inc_model.input, output=top_model)
ãã®äžã«ãŠã§ã€ããããŒãããŸãã
weights_filename='bottleneck_features_and_weights/fc_inception_cats_dogs_250.hdf5' model.load_weights(weights_filename, by_name=True)
ççŽã«èšã£ãŠãç§ã¯è·éããããå Žåãšäœ¿ããªãå Žåã®ã¢ãã«ã®ãã¬ãŒãã³ã°ã®æå¹æ§ã«éãã¯èŠãããŸããã§ããã ãã ããååïŒby_name = TrueïŒã«ãã£ãŠç¹å®ã®ã¬ã€ã€ãŒã«ãŠã§ã€ããããŒãããæ¹æ³ã«ã€ããŠèª¬æããŠããããããã®ã»ã¯ã·ã§ã³ãçµäºããŸãããããã¯éå§ã¬ã€ã€ãŒ1ã205ïŒ
for layer in inc_model.layers[:205]: layer.trainable = False
ã¢ãã«ãã³ã³ãã€ã«ããŸãã
model.compile(loss='binary_crossentropy', optimizer=SGD(lr=1e-4, momentum=0.9),
.npyé
åããå®å
šã«æ¥ç¶ãããã¬ã€ã€ãŒãæåã«ãã¬ãŒãã³ã°ãããšãã«ã
RMSpropãªããã£ãã€ã¶ãŒã䜿çšããããšã«æ³šæããŠãã ããã 次ã«ãã¢ãã«ã埮調æŽããããã«ã確ççåŸé
éäžæ³ã䜿çšããŸãã ããã¯ããã§ã«èšç·Žãããã¹ã±ãŒã«ã«å¯ŸããããŸãã«ãé¡èãªæŽæ°ãé²ãããã«è¡ãããŸãã
ãã¹ããµã³ãã«ã§æãæ£ç¢ºãªéã¿ã®ã¿ããã¬ãŒãã³ã°ããã»ã¹ã§ä¿åãããããã«ããŸãã
filepath="new_model_weights/weights-improvement-{epoch:02d}-{val_acc:.2f}.hdf5" checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True, mode='max') callbacks_list = [checkpoint]
æ°ããã€ã¡ãŒãžãžã§ãã¬ãŒã¿ãŒãäœæããŠãå®å
šãªã¢ãã«ããã¬ãŒãã³ã°ããŸãã ãã¬ãŒãã³ã°ãµã³ãã«ã®ã¿ãå€æããŸãã ãã¹ãã«ã¯è§ŠããŸããã
train_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) test_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( 'data/img_train/', target_size=(150, 150), batch_size=32, class_mode='binary') validation_generator = test_datagen.flow_from_directory( 'data/img_val/', target_size=(150, 150), batch_size=32, class_mode='binary') pred_generator=test_datagen.flow_from_directory('data/img_val/', target_size=(150,150), batch_size=100, class_mode='binary')
åŸã§
pred_generatorã䜿çšããŠãã¢ãã«ã®åäœã瀺ããŸãã
ã¢ãã«ã«ç»åãã¢ããããŒãããŸãã
model.fit_generator( train_generator, samples_per_epoch=2000, nb_epoch=200, validation_data=validation_generator, nb_val_samples=2000, callbacks=callbacks_list)
ã¯ãŒã©ãŒãã€ãºãèãããŠåŸ
ã¡ãŸã... Epoch 1/200 1984/2000 [============================>.] - ETA: 0s - loss: 1.0814 - acc: 0.5640Epoch 00000: val_acc improved from -inf to 0.71750, saving model to new_model_weights/weights-improvement-00-0.72.hdf5 2000/2000 [==============================] - 224s - loss: 1.0814 - acc: 0.5640 - val_loss: 0.6016 - val_acc: 0.7175 Epoch 2/200 1984/2000 [============================>.] - ETA: 0s - loss: 0.8523 - acc: 0.6240Epoch 00001: val_acc improved from 0.71750 to 0.77200, saving model to new_model_weights/weights-improvement-01-0.77.hdf5 2000/2000 [==============================] - 215s - loss: 0.8511 - acc: 0.6240 - val_loss: 0.5403 - val_acc: 0.7720 ⊠Epoch 199/200 1968/2000 [============================>.] - ETA: 1s - loss: 0.1439 - acc: 0.9385Epoch 00008: val_acc improved from 0.90650 to 0.91500, saving model to new_model_weights/weights-improvement-08-0.92.hdf5 2000/2000 [==============================] - 207s - loss: 0.1438 - acc: 0.9385 - val_loss: 0.2786 - val_acc: 0.9150 Epoch 200/200 1968/2000 [============================>.] - ETA: 1s - loss: 0.1444 - acc: 0.9350Epoch 00009: val_acc did not improve 2000/2000 [==============================] - 206s - loss: 0.1438 - acc: 0.9355 - val_loss: 0.3898 - val_acc: 0.8940
æ代ããšã«210ã220ç§ããã£ãã 200æ代ã®ç 究ã«ã¯çŽ12æéããããŸããã
5.ã¢ãã«ã®ç²ŸåºŠãæšå®ãã
model.evaluate_generator(pred_generator, val_samples=100)
[0.2364250123500824ã0.9100000262260437]
ãã®ããã
pred_generatorã
圹ã«ç«ã¡ãŸããã
val_samplesã¯ãžã§ãã¬ãŒã¿ãŒã®
batch_sizeã®å€ãšäžèŽããå¿
èŠãããããšã«æ³šæããŠãã ããïŒ
粟床91.7ïŒ
ã ãµã³ããªã³ã°ãéãããŠããããšãèãããšãããã¯ç²ŸåºŠãæªãããã§ã¯ãªããšèšãèªç±åºŠããããŸãã
ã¢ãã«ã®èª¬æ
æ£è§£ã®å²åãšãšã©ãŒã®å€§ãããèŠãã ãã§ã¯èå³ããããŸããã ã¢ãã«ãåã¯ã©ã¹ã«å¯ŸããŠããã€ã®æ£è§£ãšäžæ£è§£ãäžããããèŠãŠã¿ãŸãããã
imgs,labels=pred_generator.next() array_imgs=np.transpose(np.asarray([img_to_array(img) for img in imgs]),(0,2,1,3)) predictions=model.predict(imgs) rounded_pred=np.asarray([round(i) for i in predictions])
pred_generator.nextïŒïŒã¯äŸ¿å©ãªãã®ã§ãã ç»åãå€æ°ã«ããŒãããã©ãã«ãå²ãåœãŠãŸãã
åã¯ã©ã¹ã®ç»åã®æ°ã¯ãäžä»£ããšã«ç°ãªããŸãã
pd.value_counts(labels) 0.0 51 1.0 49 dtype: int64
ã¢ãã«ã¯åã¯ã©ã¹ã®ç»åãããã€äºæž¬ããŸãããïŒ
pd.crosstabïŒã©ãã«ãrounded_predïŒ
Col_0 | 0.0 | 1.0 |
---|
Row_0 | | |
0.0 | 47 | 4 |
1.0 | 8 | 41 |
ãã®ã¢ãã«ã§ã¯ã100ã®ã©ã³ãã ãªç»åãã¢ããããŒããããŸãããç«ã®ç»å51æãšç¬ã®ç»å49æã§ãã 51å¹ã®ç«ã®ãã¡ãã¢ãã«ã¯47å¹ãæ£ããèªèãã50å¹ã®ç¬ã®ãã¡41å¹ãæ£ããèªèããããã®çããµã³ãã«ã®ã¢ãã«ã®å
šäœçãªç²ŸåºŠã¯88ïŒ
ã§ããã
ééã£ãŠèªèãããåçãèŠãŠã¿ãŸãããã
wrong=[im for im in zip(array_imgs, rounded_pred, labels, predictions) if im[1]!=im[2]] plt.figure(figsize=(12,12)) for ind, val in enumerate(wrong[:100]): plt.subplots_adjust(left=0, right=1, bottom=0, top=1, wspace = 0.2, hspace = 0.2) plt.subplot(5,5,ind+1) im=val[0] plt.axis('off') plt.text(120, 0, round(val[3], 2), fontsize=11, color='red') plt.text(0, 0, val[2], fontsize=11, color='blue') plt.imshow(np.transpose(im,(2,1,0)))
éã®æ°åã¯ç»åã®çã®ã¯ã©ã¹ã§ãã ã¢ãã«ã«ãã£ãŠèµ€ã®æ°å€ãäºæž¬ãããŸãïŒèµ€ã®æ°å€ã0.5æªæºã®å Žåãã¢ãã«ã¯åçã®ç«ã0.5ãè¶
ããå Žåãç¬ãä¿¡ããŸãïŒã æ°å€ã0ã«è¿ã¥ãã»ã©ããããã¯ãŒã¯ã®åã«ç«ããããšç¢ºä¿¡ã§ããŸãã èå³æ·±ãããšã«ãå€ãã®ç¬ã®ç»åãšã©ãŒã«ã¯ãå°åç¬ãåç¬ãå«ãŸããŠããŸãã
ã¢ãã«ãæ£ããäºæž¬ããæåã®20åã®ç»åãèŠãŠã¿ãŸãããã
right=[im for im in zip(array_imgs, rounded_pred, labels, predictions) if im[1]==im[2]] plt.figure(figsize=(12,12)) for ind, val in enumerate(right[:20]): plt.subplots_adjust(left=0, right=1, bottom=0, top=1, wspace = 0.2, hspace = 0.2) plt.subplot(5,5,ind+1) im=val[0] plt.axis('off') plt.text(120, 0, round(val[3], 2), fontsize=11, color='red') plt.text(0, 0, val[2], fontsize=11, color='blue') plt.imshow(np.transpose(im,(2,1,0)))
ãã®ã¢ãã«ã¯ãæ¯èŒçå°ããªãµã³ãã«ã§ã®ç»åèªèã®ã¿ã¹ã¯ã«ããŸã察å¿ããŠããããšãããããŸãã
ãã®æçš¿ãã圹ã«ç«ãŠã°å¹žãã§ãã ã質åããææ¡ããåŸ
ã¡ããŠãããŸãã
Githubãããžã§ã¯ã