無能学生の作業ログ

せっかく新しいことやっても作業ログがないと身にならないので.

CNNを用いた顔画像による回帰をやってみた.

動いたやつ保存用.

import numpy as np
np.random.seed(20160715) # シード値を固定
from keras.layers.convolutional import Convolution2D,Conv2D
from keras.layers import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Dense,Dropout,Flatten
from keras.models import Sequential
from keras.callbacks import EarlyStopping
from keras.callbacks import LearningRateScheduler
from keras.optimizers import Adam
from keras.optimizers import SGD
import sklearn.cross_validation

#.npyに落とし込んだデータの読み込み
X_data=np.load('face_data.npy')
Y_data=np.load('face_rec.npy')

#channel_lastに変更
X_data=X_data.transpose((0,2,3,1))

#X_data.shape
#で確認推奨

#モデルの定義
model =Sequential()
#カーネル数は代表的なものを使い,層を増やすと良い?
# model.add(Conv2D(128,(3, 3), padding='same',activation='relu', input_shape=(3, 128, 128)))
#model.add(Conv2D(128,(3, 3),activation='relu', input_shape=(3, 128, 128)))
model.add(Convolution2D(16,3,3,border_mode='same',activation='relu',input_shape=(128,128,3)))

#model.add(Conv2D(32, (3, 3),activation='relu',padding='same'))
#上の層でpaddingしないとMaxpoolingのサイズの関係でエラーになる
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),dim_ordering='th'))
#model.add(Conv2D(64,(3, 3), padding='same',activation='relu'))
model.add(Convolution2D(16,3,3,border_mode='same',activation='relu'))

model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),dim_ordering='th'))

# model.add(Conv2D(32,(3, 3), padding='same',activation='relu'))
# model.add(Conv2D(32,(3, 3), activation='relu'))
model.add(Convolution2D(32,3,3,border_mode='same',activation='relu'))

model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),dim_ordering='th'))

#全結合層の前にflatten()
model.add(Flatten())
model.add(Dense(1024,activation='relu'))
model.add(Dropout(0.5))

# model.add(Dense(1024,activation='relu'))
# model.add(Dropout(0.5))

model.add(Dense(1,activation='linear'))

#おそらく8:2に分割
a_train, a_test, b_train, b_test = sklearn.cross_validation.train_test_split(X_data,Y_data)

init_learning_rate = 1e-2
#opt = SGD(lr=init_learning_rate, decay=0.0, momentum=0.9, nesterov=False)
#二乗誤差の場合の設定
model.compile(loss='mean_squared_error', optimizer='rmsprop', metrics=["acc"])
#early_stopping = EarlyStopping(monitor='val_loss', patience=3, verbose=0, mode='auto')
lrs = LearningRateScheduler(0.01)

#コンパイル
hist = model.fit(a_train,b_train, 
                batch_size=30, 
                epochs=100, 
                validation_split=0.1, 
                verbose=1)

#modelの保存をお忘れなく
model_json_str = model.to_json()
open('spec_face_model.json', 'w').write(model_json_str)
model.save_weights('spec_face_model.h5')

です。theano記法なのか,tensorflow記法なのかその辺でエラーが出るの謎. 闇が深いンゴ。

f:id:sakamoto-ryoma0930:20170723174850p:plain こんな感じにはなったが,val_lossは1000以上になっている. まあランダムに作ったデータなので. ランダムなデータからも学習できてしまうDCNNはまさにブラックマジック

成績を顔画像から学習するっていうタスク,精度どれくらい出るのか楽しみではありますね.