[PYTHON] I tried image recognition of CIFAR-10 with Keras-Learning-

Introduction

――In Tensorflow, we implemented CNN once, but this time we implemented it with a framework called Keras, which seems to be the most highly rated. ――When I tried using it, it contained various libraries that were more convenient than Tensorflow, and it felt like it was easy to implement. ――The reason is that the detailed calculation processing is apparently black-boxed, so it seems that you can understand it without thinking about it, but it seems that you can not do fine tuning. --For beginners who want to move based on the above. ――OpenCV3 is finally available, but Keras is also doing image manipulation, so there is no turn. ――One epoch takes about 7 minutes, so it may be better to try with about 10 epochs at first. It seems that 100 epochs take about 10 to 12 hours.

reference

https://github.com/aidiary/keras-examples/blob/master/cnn/cifar10/cifar10.py

What is CIFAR-10?

--A dataset of 32x32 pixel color images. --10 types of airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truck, consisting of 50,000 training data and 10,000 test data. ――It seems that you can easily call it as a library, so I tried using it after trying it.

environment

--Only the main ones are listed. --Please install the missing part from pip or Homebrew.

# OS/software/Library version
1 Mac OS X EI Capitan
2 Python 3.6 series
3 NumPy 1.13 series
4 Keras 1.2 system

Implementation

train.py


#!/usr/local/bin/python3
#!-*- coding: utf-8 -*-

import os
import numpy as np
from scipy.misc import toimage
import matplotlib.pyplot as plt

from keras.datasets import cifar10
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils.visualize_util import plot

def cnn_model(X_train, nb_classes):

    model = Sequential()

    model.add(Convolution2D(32, 3, 3, border_mode='same', input_shape=X_train.shape[1:]))
    model.add(Activation('relu'))
    model.add(Convolution2D(32, 3, 3))
    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'))
    model.add(Convolution2D(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(nb_classes))
    model.add(Activation('softmax'))

    model.compile(
        loss='categorical_crossentropy',
        optimizer='adam',
        metrics=['accuracy']
    )

    return model

def plot_cifar10(X, y, result_dir):
    plt.figure()

    #Draw image
    nclasses = 10
    pos = 1

    for targetClass in range(nclasses):
        targetIdx = []

        #Get index list of images of class classID
        for i in range(len(y)):
            if y[i][0] == targetClass:
                targetIdx.append(i)

        #Draw the first 10 randomly selected images from each class
        np.random.shuffle(targetIdx)

        for idx in targetIdx[:10]:
            img = toimage(X[idx])
            plt.subplot(10, 10, pos)
            plt.imshow(img)
            plt.axis('off')
            pos += 1

    plt.savefig(os.path.join(result_dir, 'plot.png'))

def save_history(history, result_file):
    loss = history.history['loss']
    acc = history.history['acc']
    val_loss = history.history['val_loss']
    val_acc = history.history['val_acc']
    nb_epoch = len(acc)

    with open(result_file, "w") as fp:
        fp.write("epoch\tloss\tacc\tval_loss\tval_acc\n")
        for i in range(nb_epoch):
            fp.write("%d\t%f\t%f\t%f\t%f\n" % (i, loss[i], acc[i], val_loss[i], val_acc[i]))

if __name__ == '__main__':

    #Number of data learning training trials
    nb_epoch = 100

    #Learning result storage directory
    result_dir = '{Save directory path}'

    #How many images to use in one learning
    batch_size = 128

    #Number of identification labels
    nb_classes = 10

    #Input image dimensions
    img_rows, img_cols = 32, 32

    #Number of channels (3 because it is RGB)
    img_channels = 3

    # CIFAR-10 Load data
    # (nb_samples, nb_rows, nb_cols, nb_channel) = tf
    (X_train, y_train), (X_test, y_test) = cifar10.load_data()

    #Randomly plot the image
    plot_cifar10(X_train, y_train, result_dir)

    #Pixel value is 0-Convert to 1
    X_train = X_train.astype('float32')
    X_test = X_test.astype('float32')
    X_train /= 255.0
    X_test /= 255.0

    #Class label (0-9) one-Convert to hot encoding format
    Y_train = np_utils.to_categorical(y_train, nb_classes)
    Y_test = np_utils.to_categorical(y_test, nb_classes)

    #model
    model = cnn_model(X_train, nb_classes)

    #View model summary
    model.summary()
    plot(model, show_shapes=True, to_file=os.path.join(result_dir, 'model.png'))

    #Learning
    history = model.fit(
        X_train,
        Y_train,
        batch_size=batch_size,
        nb_epoch=nb_epoch,
        verbose=1,
        validation_data=(X_test, Y_test),
        shuffle=True
    )

    #Save learned models, weights and history
    model_json = model.to_json()

    with open(os.path.join(result_dir, 'model.json'), 'w') as json_file:
        json_file.write(model_json)

    model.save_weights(os.path.join(result_dir, 'model.h5'))
    save_history(history, os.path.join(result_dir, 'history.txt'))

    #Model evaluation
    loss, acc = model.evaluate(X_test, Y_test, verbose=0)

    print('Test loss:', loss)
    print('Test acc:', acc)

Learning

--A really easy-to-understand UI.

Using TensorFlow backend.
____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
convolution2d_1 (Convolution2D)  (None, 32, 32, 32)    896         convolution2d_input_1[0][0]      
____________________________________________________________________________________________________
activation_1 (Activation)        (None, 32, 32, 32)    0           convolution2d_1[0][0]            
____________________________________________________________________________________________________
convolution2d_2 (Convolution2D)  (None, 30, 30, 32)    9248        activation_1[0][0]               
____________________________________________________________________________________________________
activation_2 (Activation)        (None, 30, 30, 32)    0           convolution2d_2[0][0]            
____________________________________________________________________________________________________
maxpooling2d_1 (MaxPooling2D)    (None, 15, 15, 32)    0           activation_2[0][0]               
____________________________________________________________________________________________________
dropout_1 (Dropout)              (None, 15, 15, 32)    0           maxpooling2d_1[0][0]             
____________________________________________________________________________________________________
convolution2d_3 (Convolution2D)  (None, 15, 15, 64)    18496       dropout_1[0][0]                  
____________________________________________________________________________________________________
activation_3 (Activation)        (None, 15, 15, 64)    0           convolution2d_3[0][0]            
____________________________________________________________________________________________________
convolution2d_4 (Convolution2D)  (None, 13, 13, 64)    36928       activation_3[0][0]               
____________________________________________________________________________________________________
activation_4 (Activation)        (None, 13, 13, 64)    0           convolution2d_4[0][0]            
____________________________________________________________________________________________________
maxpooling2d_2 (MaxPooling2D)    (None, 6, 6, 64)      0           activation_4[0][0]               
____________________________________________________________________________________________________
dropout_2 (Dropout)              (None, 6, 6, 64)      0           maxpooling2d_2[0][0]             
____________________________________________________________________________________________________
flatten_1 (Flatten)              (None, 2304)          0           dropout_2[0][0]                  
____________________________________________________________________________________________________
dense_1 (Dense)                  (None, 512)           1180160     flatten_1[0][0]                  
____________________________________________________________________________________________________
activation_5 (Activation)        (None, 512)           0           dense_1[0][0]                    
____________________________________________________________________________________________________
dropout_3 (Dropout)              (None, 512)           0           activation_5[0][0]               
____________________________________________________________________________________________________
dense_2 (Dense)                  (None, 10)            5130        dropout_3[0][0]                  
____________________________________________________________________________________________________
activation_6 (Activation)        (None, 10)            0           dense_2[0][0]                    
====================================================================================================
Total params: 1,250,858
Trainable params: 1,250,858
Non-trainable params: 0
____________________________________________________________________________________________________
Train on 50000 samples, validate on 10000 samples
Epoch 1/100
2017-08-29 11:55:15.047457: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2017-08-29 11:55:15.047489: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
2017-08-29 11:55:15.047498: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
2017-08-29 11:55:15.047505: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.
50000/50000 [==============================] - 400s - loss: 1.8624 - acc: 0.3123 - val_loss: 1.5157 - val_acc: 0.4537
Epoch 2/100
50000/50000 [==============================] - 455s - loss: 1.4213 - acc: 0.4825 - val_loss: 1.2090 - val_acc: 0.5645
Epoch 3/100
50000/50000 [==============================] - 384s - loss: 1.2453 - acc: 0.5549 - val_loss: 1.1120 - val_acc: 0.6004
Epoch 4/100
50000/50000 [==============================] - 414s - loss: 1.1602 - acc: 0.5869 - val_loss: 1.0376 - val_acc: 0.6304
Epoch 5/100
40960/50000 [=======================>......] - ETA: 64s - loss: 1.0852 - acc: 0.6156 

Learning results

――Finally, it is quite a number of 0.795500

epoch	loss	acc	val_loss	val_acc
0	1.862381	0.312260	1.515693	0.453700
1	1.421265	0.482520	1.209045	0.564500
2	1.245348	0.554880	1.111982	0.600400
3	1.160202	0.586880	1.037605	0.630400
4	1.082496	0.616840	1.002439	0.646900
5	1.014772	0.638600	0.921932	0.676100
6	0.968752	0.657040	0.890589	0.690000
7	0.933635	0.667640	0.854735	0.701200
8	0.893519	0.686920	0.841952	0.705100
9	0.866928	0.692880	0.832813	0.706700
10	0.835548	0.706200	0.808762	0.713600
11	0.811907	0.714380	0.790619	0.721300
12	0.787855	0.723800	0.769006	0.730800
13	0.769309	0.728920	0.757458	0.733200
14	0.749378	0.735600	0.731948	0.745700
15	0.729672	0.741200	0.707380	0.753900
16	0.711307	0.747860	0.720168	0.749600
17	0.694116	0.753920	0.690921	0.760300
18	0.685302	0.756300	0.688788	0.762900
19	0.670361	0.763320	0.699074	0.758100
20	0.655677	0.765700	0.683461	0.762800
21	0.650073	0.772340	0.675608	0.764000
22	0.637535	0.772880	0.705318	0.756400
23	0.627683	0.778300	0.659172	0.769500
24	0.608234	0.784560	0.649584	0.777400
25	0.605251	0.785540	0.670669	0.769400
26	0.604372	0.784440	0.657858	0.771600
27	0.591194	0.790200	0.648238	0.777000
28	0.583359	0.792300	0.644217	0.779500
29	0.579536	0.794680	0.654746	0.779200
30	0.577020	0.796780	0.650456	0.776600
31	0.558436	0.801840	0.654724	0.771200
32	0.551728	0.802580	0.660091	0.776500
33	0.551879	0.806080	0.691178	0.762100
34	0.551185	0.804320	0.643525	0.776900
35	0.537961	0.808680	0.648304	0.776100
36	0.538601	0.809580	0.663515	0.776100
37	0.526395	0.812180	0.667506	0.773200
38	0.520259	0.814020	0.637330	0.780900
39	0.520766	0.813460	0.626052	0.782500
40	0.513462	0.818240	0.637447	0.782200
41	0.508732	0.819540	0.628536	0.784700
42	0.512045	0.816880	0.648108	0.780600
43	0.502967	0.819200	0.681984	0.774500
44	0.502752	0.819600	0.626435	0.788800
45	0.506435	0.818640	0.641397	0.782800
46	0.492950	0.822220	0.643260	0.783700
47	0.490653	0.824700	0.652792	0.782700
48	0.479054	0.828640	0.641824	0.783700
49	0.483628	0.825200	0.636701	0.789600
50	0.483054	0.828940	0.635811	0.786600
51	0.472693	0.831800	0.628785	0.788600
52	0.473315	0.830320	0.630551	0.791700
53	0.466273	0.833520	0.636630	0.787100
54	0.466997	0.834320	0.627516	0.792000
55	0.467793	0.831500	0.641428	0.783800
56	0.456283	0.837320	0.635762	0.789500
57	0.452593	0.837640	0.636226	0.785800
58	0.459387	0.834740	0.628133	0.789200
59	0.450392	0.838600	0.651949	0.786700
60	0.446786	0.840840	0.628699	0.790300
61	0.443291	0.838820	0.635795	0.790300
62	0.445090	0.841860	0.630603	0.790400
63	0.438771	0.842060	0.618292	0.793700
64	0.444951	0.840980	0.631328	0.791900
65	0.443358	0.841860	0.631681	0.784200
66	0.436495	0.842280	0.640644	0.787600
67	0.434661	0.844800	0.625743	0.789400
68	0.431563	0.843140	0.633843	0.790500
69	0.430192	0.847000	0.642871	0.788800
70	0.421411	0.847940	0.624006	0.790100
71	0.423439	0.848720	0.650200	0.786900
72	0.420324	0.848240	0.654864	0.789300
73	0.421919	0.848480	0.627082	0.792700
74	0.410431	0.851180	0.642263	0.790100
75	0.419571	0.850860	0.636891	0.789100
76	0.413792	0.852300	0.653029	0.786400
77	0.415705	0.852520	0.644457	0.787400
78	0.423684	0.850840	0.631995	0.791600
79	0.410283	0.852720	0.652608	0.788600
80	0.411928	0.851480	0.634341	0.793000
81	0.405703	0.855640	0.630345	0.794300
82	0.408496	0.853320	0.652739	0.789500
83	0.402927	0.855320	0.642568	0.793900
84	0.404812	0.854160	0.637601	0.795100
85	0.400238	0.857520	0.633781	0.793700
86	0.403761	0.853880	0.625709	0.794700
87	0.404491	0.856420	0.635942	0.796500
88	0.392304	0.860800	0.636456	0.797500
89	0.398910	0.857180	0.655635	0.787900
90	0.392418	0.858680	0.634033	0.793500
91	0.390591	0.861520	0.627206	0.794700
92	0.385502	0.860740	0.657583	0.787700
93	0.391550	0.860260	0.664002	0.787900
94	0.388638	0.859500	0.648921	0.792000
95	0.385543	0.863360	0.644680	0.793800
96	0.386466	0.862720	0.648885	0.791200
97	0.384559	0.862300	0.651030	0.794400
98	0.384592	0.861200	0.629053	0.794900
99	0.388739	0.860320	0.634723	0.795500

Recommended Posts

I tried image recognition of CIFAR-10 with Keras-Learning-
I tried image recognition of CIFAR-10 with Keras-Image recognition-
I tried simple image recognition with Jupyter
I tried handwriting recognition of runes with scikit-learn
[OpenCV / Python] I tried image analysis of cells with OpenCV
I tried face recognition with OpenCV
I tried to find the entropy of the image with python
I tried "gamma correction" of the image with Python + OpenCV
I tried handwriting recognition of runes with CNN using Keras
I tried playing with the image with Pillow
I tried "smoothing" the image with Python + OpenCV
I tried "differentiating" the image with Python + OpenCV
Image recognition with keras
I tried Flask with Remote-Containers of VS Code
I tried to correct the keystone of the image
I tried "binarizing" the image with Python + OpenCV
I tried using the image filter of OpenCV
I tried simple image processing with Google Colaboratory.
I tried to make a simple image recognition API with Fast API and Tensorflow
I tried to extract features with SIFT of OpenCV
[Introduction to Pytorch] I tried categorizing Cifar10 with VGG16 ♬
I tried "morphology conversion" of images with Python + OpenCV
I tried fp-growth with python
I tried scraping with Python
[PyTorch] Image classification of CIFAR-10
I tried AutoGluon's Image Classification
I tried Learning-to-Rank with Elasticsearch!
I tried face recognition using Face ++
I tried clustering with PyCaret
Application of CNN2 image recognition
I tried image recognition of "Moon and Soft-shelled Turtle" with Pytorch (using torchvision.datasets.ImageFolder which corresponds to from_from_directry of keras)
I tried gRPC with Python
I tried scraping with python
Image recognition with Keras + OpenCV
Image processing with Python (I tried binarizing it into a mosaic art of 0 and 1)
I tried to find the average of the sequence with TensorFlow
I tried starting Django's server with VScode instead of Pycharm
I tried running Movidius NCS with python of Raspberry Pi3
I tried face recognition of the laughter problem using Keras.
I tried to implement ListNet of rank learning with Chainer
I tried a stochastic simulation of a bingo game with Python
I tried trimming efficiently with OpenCV
I tried summarizing sentences with summpy
seam carving (image cropping) I tried
I tried machine learning with liblinear
I tried web scraping with python.
I tried knocking 100 image processes (Q1 ~ Q10)
I tried moving food with SinGAN
I tried using GrabCut of OpenCV
I tried implementing DeepPose with PyTorch
I tried face detection with MTCNN
I tried running prolog with python 3.8.2.
Image recognition of fruits using VGG16
I tried SMTP communication with Python
I tried sentence generation with GPT-2
I tried learning LightGBM with Yellowbrick
I tried scraping the ranking of Qiita Advent Calendar with Python
I tried standalone deployment of play with fabric [AWS operation with boto] [Play deployment]
I tried to automate the watering of the planter with Raspberry Pi
I tried to build the SD boot image of LicheePi Nano
I tried to create a list of prime numbers with python