芸能人の顔を機械学習させて顔タイプ診断してみる(その3)

[芸能人の顔を機械学習させて顔タイプ診断してみる（その２）](https://qiita.com/yuni/items/340c5fea8886ec900b3a)に記載した続きです。

2,400枚のタイプ別芸能人の画像を使って、顔タイプ診断をしようと試みています。
ローカルPCで学習させたら、9時間以上かかっても学習終わらなかったので、今回はAzureVMでGPU使ってみました。

《使った画像》

|顔タイプ|名前|train画像(枚)|test画像(枚)|ラベル|
|:--------------:|:---------------:|:---------------:|:---------------:|:---------------:|
|フレッシュ|吉高由里子<br>小西真奈美<br>広末涼子|200<br>200<br>200|50<br>50<br>50|0|
|キュート|宮崎あおい<br>小倉優子<br>中川翔子|200<br>200<br>200|50<br>50<br>50|1|
|クール|長谷川潤<br>松下奈緒<br>黒木メイサ|200<br>200<br>200|50<br>50<br>50|2|
|フェミニン|滝川クリステル<br>武井咲<br>蛯原友里|200<br>200<br>200|50<br>50<br>50|3|
||合計|2,400|600||

##データ収集＆下準備
[既に準備は終わっています](https://qiita.com/yuni/items/340c5fea8886ec900b3a)。
後は、学習させるのみ！

##学習環境
AzureのVM環境も既に構築済みです。
[以前に作っていたVM環境を移行](https://qiita.com/yuni/items/2af85dd544cd257f0815)した際に、サイズの変更を行い、GPU搭載のNV6にしました。

```
仮想環境：Azure Virtual Machines
オペレーティング システム：Linux
サイズ：標準 NV6 (6 vcpu 数、56 GB メモリ)
```


##学習
###パラメータ
下記パラメータでやってみました。

```
max_steps：1500 #1000でも終わらなかった
batch_size：10 #100だとaccuracyが下がっていった
learning_rate：1e-6　#1e-5以上にするとaccuracyが変動しなかった
```

コードは、これまでと同じコードを使いました。

```testFeceType.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import cv2
import numpy as np
import tensorflow as tf
import tensorflow.python.platform

NUM_CLASSES = 4
IMAGE_SIZE = 28
IMAGE_PIXELS = IMAGE_SIZE*IMAGE_SIZE*3

flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_string('train', '/home/yuni/no9/train.txt', 'File name of train data')
flags.DEFINE_string('test', '/home/yuni/no9/test.txt', 'File name of train data')
flags.DEFINE_string('train_dir', '/home/yuni/no9/data', 'Directory to put the training data.')
flags.DEFINE_integer('max_steps', 1500, 'Number of steps to run trainer.')
flags.DEFINE_integer('batch_size', 10, 'Batch size'
                     'Must divide evenly into the dataset sizes.')
flags.DEFINE_float('learning_rate', 1e-6, 'Initial learning rate.')

def inference(images_placeholder, keep_prob):
    """ 予測モデルを作成する関数

    引数: 
      images_placeholder: 画像のplaceholder
      keep_prob: dropout率のplace_holder

    返り値:
      y_conv: 各クラスの確率(のようなもの)
    """
    # 重みを標準偏差0.1の正規分布で初期化
    def weight_variable(shape):
      initial = tf.truncated_normal(shape, stddev=0.1)
      return tf.Variable(initial)

    # バイアスを標準偏差0.1の正規分布で初期化
    def bias_variable(shape):
      initial = tf.constant(0.1, shape=shape)
      return tf.Variable(initial)

    # 畳み込み層の作成
    def conv2d(x, W):
      return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

    # プーリング層の作成
    def max_pool_2x2(x):
      return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                            strides=[1, 2, 2, 1], padding='SAME')
    
    # 入力を28x28x3に変形
    x_image = tf.reshape(images_placeholder, [-1, 28, 28, 3])

    # 畳み込み層1の作成
    with tf.name_scope('conv1') as scope:
        W_conv1 = weight_variable([5, 5, 3, 32])
        b_conv1 = bias_variable([32])
        h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)

    # プーリング層1の作成
    with tf.name_scope('pool1') as scope:
        h_pool1 = max_pool_2x2(h_conv1)
    
    # 畳み込み層2の作成
    with tf.name_scope('conv2') as scope:
        W_conv2 = weight_variable([5, 5, 32, 64])
        b_conv2 = bias_variable([64])
        h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)

    # プーリング層2の作成
    with tf.name_scope('pool2') as scope:
        h_pool2 = max_pool_2x2(h_conv2)

    # 全結合層1の作成
    with tf.name_scope('fc1') as scope:
        W_fc1 = weight_variable([7*7*64, 1024])
        b_fc1 = bias_variable([1024])
        h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
        h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
        # dropoutの設定
        h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

    # 全結合層2の作成
    with tf.name_scope('fc2') as scope:
        W_fc2 = weight_variable([1024, NUM_CLASSES])
        b_fc2 = bias_variable([NUM_CLASSES])

    # ソフトマックス関数による正規化
    with tf.name_scope('softmax') as scope:
        y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)

    # 各ラベルの確率のようなものを返す
    return y_conv

def loss(logits, labels):
    """ lossを計算する関数

    引数:
      logits: ロジットのtensor, float - [batch_size, NUM_CLASSES]
      labels: ラベルのtensor, int32 - [batch_size, NUM_CLASSES]

    返り値:
      cross_entropy: 交差エントロピーのtensor, float

    """

    # 交差エントロピーの計算
    cross_entropy = -tf.reduce_sum(labels*tf.log(logits))
    # TensorBoardで表示するよう指定
    tf.summary.scalar("tmp/cross_entropy", cross_entropy)
    return cross_entropy

def training(loss, learning_rate):
    """ 訓練のOpを定義する関数

    引数:
      loss: 損失のtensor, loss()の結果
      learning_rate: 学習係数

    返り値:
      train_step: 訓練のOp

    """

    train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)
    return train_step

def accuracy(logits, labels):
    """ 正解率(accuracy)を計算する関数

    引数: 
      logits: inference()の結果
      labels: ラベルのtensor, int32 - [batch_size, NUM_CLASSES]

    返り値:
      accuracy: 正解率(float)

    """
    correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(labels, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
    tf.summary.scalar("tmp/accuracy", accuracy)
    return accuracy

if __name__ == '__main__':
    tf.reset_default_graph()
    # ファイルを開く
    f = open(FLAGS.train, 'r')
    # データを入れる配列
    train_image = []
    train_label = []
    for line in f:
        # 改行を除いてスペース区切りにする
        line = line.rstrip()
        l = line.split()
        # データを読み込んで28x28に縮小
        img = cv2.imread(l[0])
        if(img is None):
            print('画像を開けません。')
            quit()
        # print(l[0])
        #表示
        img = cv2.resize(img, (28, 28))
        # cv2.imshow('image', img)
        # cv2.waitKey(0)
        # 一列にした後、0-1のfloat値にする
        train_image.append(img.flatten().astype(np.float32)/255.0)
        # ラベルを1-of-k方式で用意する
        tmp = np.zeros(NUM_CLASSES)
        tmp[int(l[1])] = 1
        train_label.append(tmp)
    # numpy形式に変換
    train_image = np.asarray(train_image)
    train_label = np.asarray(train_label)
    f.close()

    f = open(FLAGS.test, 'r')
    test_image = []
    test_label = []
    for line in f:
        line = line.rstrip()
        l = line.split()
        img = cv2.imread(l[0])
        img = cv2.resize(img, (28, 28))
        test_image.append(img.flatten().astype(np.float32)/255.0)
        tmp = np.zeros(NUM_CLASSES)
        tmp[int(l[1])] = 1
        test_label.append(tmp)
    test_image = np.asarray(test_image)
    test_label = np.asarray(test_label)
    f.close()
    
    with tf.Graph().as_default():
        # 画像を入れる仮のTensor
        images_placeholder = tf.placeholder("float", shape=(None, IMAGE_PIXELS))
        # ラベルを入れる仮のTensor
        labels_placeholder = tf.placeholder("float", shape=(None, NUM_CLASSES))
        # dropout率を入れる仮のTensor
        keep_prob = tf.placeholder("float")

        # inference()を呼び出してモデルを作る
        logits = inference(images_placeholder, keep_prob)
        # loss()を呼び出して損失を計算
        loss_value = loss(logits, labels_placeholder)
        # training()を呼び出して訓練
        train_op = training(loss_value, FLAGS.learning_rate)
        # 精度の計算
        acc = accuracy(logits, labels_placeholder)

        # 保存の準備
        saver = tf.train.Saver()
        # Sessionの作成
        sess = tf.Session()
        # 変数の初期化
        sess.run(tf.global_variables_initializer())
        # TensorBoardで表示する値の設定
        summary_op = tf.summary.merge_all()
        summary_writer = tf.summary.FileWriter(FLAGS.train_dir, sess.graph)
        
        # 訓練の実行
        for step in range(FLAGS.max_steps):
            #追記
            for i in range(int(len(train_image)/FLAGS.batch_size)):
                # batch_size分の画像に対して訓練の実行
                batch = FLAGS.batch_size*i
                # feed_dictでplaceholderに入れるデータを指定する
                sess.run(train_op, feed_dict={
                  images_placeholder: train_image[batch:batch+FLAGS.batch_size],
                  labels_placeholder: train_label[batch:batch+FLAGS.batch_size],
                  keep_prob: 0.5})

            # 1 step終わるたびに精度を計算する
            train_accuracy = sess.run(acc, feed_dict={
                images_placeholder: train_image,
                labels_placeholder: train_label,
                keep_prob: 1.0})
            print ("step %d, training accuracy %g"%(step, train_accuracy))

            # 1 step終わるたびにTensorBoardに表示する値を追加する
            summary_str = sess.run(summary_op, feed_dict={
                images_placeholder: train_image,
                labels_placeholder: train_label,
                keep_prob: 1.0})
            summary_writer.add_summary(summary_str, step)

    # 訓練が終了したらテストデータに対する精度を表示
    print ("test accuracy %g"%sess.run(acc, feed_dict={
        images_placeholder: test_image,
        labels_placeholder: test_label,
        keep_prob: 1.0}))

    # 最終的なモデルを保存
    save_path = saver.save(sess, "model.ckpt")
```

##結果

```
$ python3 testFaceType.py
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE3 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
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.
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.
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.
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.
step 0, training accuracy 0.23875
step 1, training accuracy 0.255417
step 2, training accuracy 0.27125
step 3, training accuracy 0.294167
step 4, training accuracy 0.314583
　　　　　　　　　　　　　　　　　　　 　　　　　　　　　　　　　・
　　　　　　　　　　　　　　　　　　　 　　　　　　　　　　　　　・
　　　　　　　　　　　　　　　　　　　 　　　　　　　　　　　　　・
step 1490, training accuracy 0.990833
step 1491, training accuracy 0.990833
step 1492, training accuracy 0.99125
step 1493, training accuracy 0.99125
step 1494, training accuracy 0.99125
step 1495, training accuracy 0.99125
step 1496, training accuracy 0.991667
step 1497, training accuracy 0.991667
step 1498, training accuracy 0.990833
step 1499, training accuracy 0.992083
test accuracy 0.728333
```
やっぱり終わらないw
ただ、3時間30分以内に終わりました。（終わる時間見逃して正確な時間がわかりません。）
はやい！！

##検証
学習終わってませんが、まあまあ、とりあえずということで、この学習済みモデル(精度72.8%)を使って検証してみます。
trainデータにもtestデータにも使っていない画像を、学習済みモデルに適用します。
検証した枚数はこちら。

|顔タイプ|名前|画像(枚)|ラベル|
|:--------------:|:---------------:|:---------------:|:---------------:|
|フレッシュ|吉高由里子<br>小西真奈美<br>広末涼子|3<br>3<br>3|0|
|キュート|宮崎あおい<br>小倉優子<br>中川翔子|3<br>3<br>3|1|
|クール|長谷川潤<br>松下奈緒<br>黒木メイサ|3<br>3<br>3|2|
|フェミニン|滝川クリステル<br>武井咲<br>蛯原友里|3<br>3<br>3|3|

####ラベル０（顔タイプ：フレッシュ）
0が返ってくれば正解まる。
10/15枚正解でした。

```
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/e89e0455b4770992837371565858644a5c0d51b951664415418722b2c557fc0f.jpg
[[0.7972151  0.02281985 0.16904324 0.01092182]]
0
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/e9242947ee64ca0b5f77b2bbccec9a66197ba0f4843bb252fb1986696ab87134.jpg
[[0.4344457  0.06505562 0.1909447  0.3095539 ]]
0
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/ea8dc237ac073ebda81be5d3d69353c3b49e515230e26d6fc862859a34e7dc5c.jpg
[[0.42519814 0.00297299 0.56133115 0.01049775]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/eb9340aecd9d00c94f004c1eb089ff93a10d0365bd02e5b72984690f8de3ab94.jpg
[[0.32905388 0.00297451 0.6627905  0.00518108]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/ec7cdc280a429fcb40fef1bbd8d08a22c380f4410691ad6f086a76e905228cf5.jpg
[[0.38200086 0.28215462 0.05743495 0.27840957]]
0
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/f637eaaf5b308789bd443514751d4de4373abe6509b67aae08ee9ba85cdda956.jpg
[[0.14737055 0.3374524  0.08405069 0.43112633]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/f7da6ac76a10daff2d639da209c11187592bc3122b56be514161a187b4ae9e1a.jpg
[[0.7384373  0.14389734 0.00898053 0.10868485]]
0
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/f8ba7263b1e58be1c3d232fe0db9ce486d93752935ac6611fd55854cfdfd5582.jpg
[[0.44107375 0.00703576 0.548871   0.00301952]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fa5a370f74fbdeafd412dfc7a8e57b85812146fc16781ea71842a60186961519.jpg
[[0.7401666  0.07165182 0.16644727 0.0217343 ]]
0
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fa916f39c2270811976db38580cb99237bd730a281fee99088feec71983cd69c.jpg
[[0.87707186 0.02479758 0.02592964 0.07220087]]
0
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/db18670277f9653dfdc8012d9be5dba2b9fd1aedacde70feaed8a057cad6ab94.jpg
[[0.0052104  0.08780169 0.03020056 0.87678736]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/dca2e986e46ec3e3eb2eab143a5253952ecfafd0600c1738245017bb2c22cd8f.png
[[0.97833586 0.00886644 0.00517666 0.00762098]]
0
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/dd82b75d973f4025c9872759c490a13ddb1e871223e172dac4a3ca5750f85e9a.jpg
[[0.72874916 0.06400916 0.06546148 0.14178021]]
0
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/dda11693609e61a8476e8577fc9d8af86085ae79e93d459008333a33a5d7a496.jpeg
[[0.8756066  0.06842738 0.01441155 0.04155444]]
0
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/ddfe6dc57550dc2c22043832e9e0ff0400453807b8d25b5c359ad7122290aa2f.jpg
[[0.5665896  0.01904523 0.41002795 0.0043372 ]]
0
```


####ラベル1（顔タイプ：キュート）
1が返ってくれば正解まる。
13/15枚正解でした。

```
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/da5e7ed2266ba56031afc0a7c54b33bb500c543cd6e2fc1e97b4f08a31274fad.jpg
[[5.3047237e-04 9.9906355e-01 4.7054605e-06 4.0121833e-04]]
1
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/db0f55641280f0b90cc4dd83d181957b8c595cf971c02c3884748bdbbdcb48ef.jpg
[[0.05860326 0.832879   0.01650462 0.09201312]]
1
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/db44e42cd65270bd9a0aae41c16ff4a939b886ef9cb97f8cc06599afebef51fa.jpg
[[1.0023074e-03 9.7669137e-01 4.4417183e-04 2.1862091e-02]]
1
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/db6a1aa5f5f72b1d130f927235cf082f6e683722674cb14a5952f44309954171.jpg
[[0.00957849 0.9829972  0.00391021 0.00351411]]
1
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/dbaa844a1b93242f998698b8701d530fa21ea3284d520993c6d4418c93cd628f.jpg
[[0.0300629  0.86771625 0.00606188 0.09615894]]
1
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fc17443d23f38cbb4edf3ba696bc8ed8136ddd5038decaf34c685582538b3e45.jpg
[[7.1737445e-03 9.8898739e-01 1.2404963e-04 3.7147573e-03]]
1
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fcff85ceeac88629c432931c9f0148379037145e25fa4c0ec0c3b736d90d3f4c.jpg
[[9.3223024e-03 9.8743093e-01 2.5002165e-03 7.4657233e-04]]
1
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fd3f2bf935207a80090abe08d35b1b89c3178ba9854590fd502fdf2f6da272ee.jpg
[[0.00087291 0.1859091  0.02547415 0.78774387]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fe6be3d3f03b8e5b3a9587e0e7dfe3e7497282d4c0f32d306ad6dfdc7815a129.jpg
[[0.0116815  0.9719273  0.00102818 0.01536305]]
1
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/ff2cbe1fb6ecd7742f6698a7c6603b8694a1d546a430bcdc659edb9a473e5e39.jpg
[[0.02943814 0.9245027  0.02535802 0.02070112]]
1
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fb34ca06b09024d7f5cf0d3f87628c0fc18afaeeed73cbc822685a88c50234b6.png
[[0.14906655 0.2801779  0.00384871 0.5669068 ]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fbd76b727e152714b454297e88aab32d37c5a85c9fa9323ea177c3182fa91e16.jpeg
[[0.00158417 0.9799604  0.00360707 0.01484839]]
1
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fcbd13a00c9c859a5e0968d2ca9609cdb2d3499cb4fa58f690927b2b2e9c4241.jpg
[[4.1454607e-03 9.9075353e-01 1.9450610e-05 5.0815595e-03]]
1
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fcdb15e26ad1eba01001d9dfc3c5e0f18aa8669ca315fc89124632db87a1c990.jpg
[[2.8090272e-03 9.8519474e-01 4.2077061e-04 1.1575459e-02]]
1
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fd900be7f64a8e6693db61debfcde2d5c840000855e9aedea043683c243f34a0.jpg
[[0.16448732 0.69734716 0.03743203 0.10073349]]
1
```


####ラベル2（顔タイプ：クール）
2が返ってくれば正解まる。
15/15枚正解でした。
１００パーわ〜い。

```
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/c7683a02750370f4ed669b3256850aa5cb3cb01557512988f4b3eaa1d89a0b6e.png
[[0.14525862 0.1616998  0.6551955  0.03784616]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/c77568e1ac1d5ecf99486a7d247fa5719309099377d6e4cbf23fd329dbe29ae9.jpg
[[0.01165934 0.08203536 0.86261034 0.04369492]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/c7c38fcf041aac0912852c5fbbbc0bc081615f71d5deaf46074fb2d1f0a2b7f9.jpg
[[0.02831547 0.02771909 0.7390826  0.20488289]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/c8b3b76971e93c9b5b7554ef334aa9a2cfbb44da67d17d053321762991b06078.jpg
[[0.0399488  0.01082118 0.9117834  0.03744655]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/c8c4cba51b202170f9d521badce25f599d02f878367df871eb3c7b8091d05f40.jpg
[[0.00465948 0.00543604 0.904383   0.08552153]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/f7e55f15fcc701ccfabb46a1414a118ab78be263db1fa66d8a7604063c5e5e89.jpg
[[0.10075548 0.01467406 0.7802302  0.10434015]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/f806fccdae3fcb442d50f742f0179c9f3b24f871412dfd3dd6f4180e7d23af51.jpg
[[2.4533211e-03 7.3510368e-04 8.8626558e-01 1.1054605e-01]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fa417581c77c8e8e47b02af7193e807e74622e4e8c57ec9be9429214f5cd15f6.jpg
[[1.09215645e-04 7.53702625e-05 6.99294925e-01 3.00520420e-01]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fa5301537f01925ad3e1eb518b44a4faeb84ea5b95228ff590123598b7dda8c3.jpg
[[0.01412593 0.01820217 0.9341424  0.03352949]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/faaf0d46d9930148c77e0bfcdc315580f8e19ea08477236a3958ecd596826154.jpg
[[0.01354408 0.0082192  0.5113964  0.4668403 ]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/eb1888a1e51554f1118cdd2edc9ea47b44b043fab6822ea17ac353eb5c72f5cd.jpg
[[0.02011859 0.0593182  0.889058   0.03150515]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/ed1863449dcabb233bbb946eb9ad1e5376e3f0f3c5b382f646385203caa31892.jpg
[[0.18945947 0.29010442 0.5059359  0.0145002 ]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/ed8c5b46dcf2742e3e2db10b20d31b780de6458c70d72565febf830bcb41bc68.jpg
[[0.01474821 0.00439051 0.95532703 0.02553428]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/ee063396f465173728ac379a6c32b053149df8202a996e250dc4815bbe3088f5.jpg
[[1.4430985e-02 5.2106282e-04 9.7934788e-01 5.6999959e-03]]
2
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/ee55490f2289515e1d812276bdb2445eba79c840a9c96b19f9f206b19254d99b.jpg
[[0.06445436 0.17300814 0.66403306 0.09850445]]
2
```



####ラベル3（顔タイプ：フェミニン）
3が返ってくれば正解まる。
13/15枚正解でした。

```
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/e680df8fd32325d2436bdedb8f11342798116f9fea5f2a95e4cd44d85ce83880.jpg
[[2.9901803e-02 9.8809239e-04 3.7610745e-05 9.6907258e-01]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/e7d5ead6e144d4f07463b41e0c0fecefa84761584577b85dc791761e7ac0619c.jpg
[[4.8899446e-02 6.9248345e-04 1.5632400e-02 9.3477571e-01]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/ea1fda25dc38e9ea9142da4251a8b6bd2a211b3b4556e6ff2a58aa4f1f51541d.jpg
[[3.0192485e-04 1.7407356e-04 1.7212235e-06 9.9952233e-01]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/ea57412d4e7c4c6a4d5458809e8aa6678dafae1b17ffba381740ebf15a16a831.jpg
[[0.03854504 0.00721118 0.00216782 0.95207596]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/edc22a0627aa9af9e23a8a7bd7e28759a6bae22d62d49a27dbc45b8449b0905a.jpg
[[4.9802661e-03 1.8555546e-02 7.9959055e-04 9.7566456e-01]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/e95c71a35ceb33b4e284c8f7c1afabf9e791f45a2692db64fb003b887ac6d2bd.jpg
[[1.0897298e-02 8.4430812e-04 2.3743458e-02 9.6451491e-01]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/e97c0c5bbd0e7c171c1e9c8d5f9deaf108dda767eea920281881625c3e2b3755.jpg
[[0.0642083  0.07909119 0.0675816  0.78911895]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/e9836b8ee86cc40ba49c6cb4a95c1329dbf28ce92d8594fc47725734b93a2893.jpg
[[0.06005954 0.13349998 0.13091178 0.67552876]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/ea09beccd7dce804762f6513f2bea518c33cba58b26d754d6bed72eb69e7bee8.jpeg
[[0.02819177 0.05973504 0.11120924 0.8008639 ]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/ea74c9493cc9c91152f04732c21d2ef401c2067f5f6381a31d5230a6112abf9b.jpg
[[0.23084734 0.02474436 0.02099594 0.7234123 ]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/f8c76f04767ada343339ce5bdebb1fa1819d13d5883e6072abf5b0c32826e99a.jpg
[[0.04866693 0.37475878 0.23767938 0.33889493]]
1
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/f8fb20dc5b2569b88d0a1f93cf9ebc2d665c0ef3518d7df98220ee1987c43fe2.jpg
[[0.09811469 0.49254274 0.1189096  0.290433  ]]
1
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/f9ab8e8a23c48e24edef83ffc6b587770092929f993eff22132a0f4707dea395.jpg
[[5.3011748e-04 2.4509680e-02 6.6915392e-03 9.6826863e-01]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fa92ac362e530f0f9b516d591a0ac979eb1890f23c13c198abcaab7b5cee41fc.jpg
[[0.0075642  0.24404843 0.08762402 0.66076326]]
3
[yuni@machinelearningvm no9]$ python3 FaceType.py /home/yuni/no9/data/fd351bd0a19af72737be8d1ce81817063ca3a94c8b3139fa2bd95262ac62d3b2.jpg
[[2.37930130e-04 1.00661395e-02 5.32252993e-03 9.84373450e-01]]
3
```

###誤った画像見てみる

#####ラベル0（フレッシュ）が正解
ea8dc237ac073ebda81be5d3d69353c3b49e515230e26d6fc862859a34e7dc5c.jpg

|フレッシュ|キュート|<b>クール<b>|フェミニン|
|--:|--:|--:|--:|
|42.5%|0.3%|<b>56.1%<b>|1.0%|
![ea8dc237ac073ebda81be5d3d69353c3b49e515230e26d6fc862859a34e7dc5c.jpg](https://qiita-image-store.s3.amazonaws.com/0/223989/dc825a24-65f6-3536-b946-536486e820dc.jpeg)




eb9340aecd9d00c94f004c1eb089ff93a10d0365bd02e5b72984690f8de3ab94.jpg

|フレッシュ|キュート|クール|フェミニン|
|--:|--:|--:|--:|
|33.0%|29.7%|<b>66.3%<b>|0.5%|
![eb9340aecd9d00c94f004c1eb089ff93a10d0365bd02e5b72984690f8de3ab94.jpg](https://qiita-image-store.s3.amazonaws.com/0/223989/6aec8101-f07d-1240-4a0c-48d095ef2451.jpeg)



f637eaaf5b308789bd443514751d4de4373abe6509b67aae08ee9ba85cdda956.jpg

|フレッシュ|キュート|クール|フェミニン|
|--:|--:|--:|--:|
|14.7%|33.7%|8.4%|<b>43.1%<b>|
![f637eaaf5b308789bd443514751d4de4373abe6509b67aae08ee9ba85cdda956.jpg](https://qiita-image-store.s3.amazonaws.com/0/223989/9a082dd1-f9ea-80a7-1fa2-ff01cb688a6b.jpeg)

f8ba7263b1e58be1c3d232fe0db9ce486d93752935ac6611fd55854cfdfd5582.jpg

|フレッシュ|キュート|クール|フェミニン|
|--:|--:|--:|--:|
|44.1%|0.7%|<b>54.9%<b>|0.3%|
![f8ba7263b1e58be1c3d232fe0db9ce486d93752935ac6611fd55854cfdfd5582.jpg](https://qiita-image-store.s3.amazonaws.com/0/223989/bac16869-5aa7-e7fc-30e5-d26611c5479f.jpeg)

db18670277f9653dfdc8012d9be5dba2b9fd1aedacde70feaed8a057cad6ab94.jpg

|フレッシュ|キュート|クール|フェミニン|
|--:|--:|--:|--:|
|0.5%|8.8%|3.0%|<b>87.7%<b>|
![db18670277f9653dfdc8012d9be5dba2b9fd1aedacde70feaed8a057cad6ab94.jpg](https://qiita-image-store.s3.amazonaws.com/0/223989/5ef7a64d-2409-d033-0ad3-189842d32d1a.jpeg)


#####ラベル1（キュート）が正解
fd3f2bf935207a80090abe08d35b1b89c3178ba9854590fd502fdf2f6da272ee.jpg

|フレッシュ|キュート|クール|フェミニン|
|--:|--:|--:|--:|
|0.0%|18.6%|2.5%|<b>78.8%<b>|
![fd3f2bf935207a80090abe08d35b1b89c3178ba9854590fd502fdf2f6da272ee.jpg](https://qiita-image-store.s3.amazonaws.com/0/223989/a266f798-026b-e275-8da0-ff160afef43a.jpeg)

fb34ca06b09024d7f5cf0d3f87628c0fc18afaeeed73cbc822685a88c50234b6.png

|フレッシュ|キュート|クール|フェミニン|
|--:|--:|--:|--:|
|14.9%|28.0%|0.4%|<b>56.7%<b>|
![fb34ca06b09024d7f5cf0d3f87628c0fc18afaeeed73cbc822685a88c50234b6.png](https://qiita-image-store.s3.amazonaws.com/0/223989/c5bf335f-2ba8-7df9-68b9-f2782d9ff373.png)


#####ラベル3（フェミニン）が正解

f8c76f04767ada343339ce5bdebb1fa1819d13d5883e6072abf5b0c32826e99a.jpg

|フレッシュ|キュート|クール|フェミニン|
|--:|--:|--:|--:|
|4.9%|<b>37.5%<b>|23.8%|33.9%|
![f8c76f04767ada343339ce5bdebb1fa1819d13d5883e6072abf5b0c32826e99a.jpg](https://qiita-image-store.s3.amazonaws.com/0/223989/ca8dd539-eb05-05e3-fd59-aa381d0c402d.jpeg)

f8fb20dc5b2569b88d0a1f93cf9ebc2d665c0ef3518d7df98220ee1987c43fe2.jpg

|フレッシュ|キュート|クール|フェミニン|
|--:|--:|--:|--:|
|0.1%|<b>49.3%<b>|11.9%|29.0%|
![f8fb20dc5b2569b88d0a1f93cf9ebc2d665c0ef3518d7df98220ee1987c43fe2.jpg](https://qiita-image-store.s3.amazonaws.com/0/223989/a06dcfd2-423b-f2b0-dcbc-53846324e62a.jpeg)

###まとめ
72.8%の学習モデルを使ったら、未知の画像データが27/36枚正解できました。

ぜひなにか、精度を上げられるヒントをください。