import os from time import time import argparse import logging as log import numpy as np from keras.layers import Conv2D,Dropout,Dense,Flatten,MaxPooling2D,BatchNormalization,GlobalAveragePooling2D from keras.models import Sequential,load_model from keras.callbacks import TensorBoard import config as cfg import ftp parser=argparse.ArgumentParser() parser.add_argument("data") parser.add_argument("--load_model") parser.add_argument("--save_model",default="/tmp/gogo-{0:03}.h5") parser.add_argument("--epochs",type=int,default=100) parser.add_argument("--initial_epoch",type=int,default=0) parser.add_argument("--log_dir",default="/tmp/tflogs") args=parser.parse_args() def createFullyConnected(): model=Sequential([ Flatten(input_shape=(224,224)), Dense(128, activation="relu"), Dropout(0.1), Dense(64, activation="relu"), Dense(8) ]) model.compile( optimizer='adam', loss='mse', metrics=['mae','accuracy'] ) return model def createCNN(): model=Sequential() model.add(BatchNormalization(input_shape=(224,224,1))) model.add(Conv2D(24,(5,5),border_mode="same",init="he_normal",activation="relu",input_shape=(224,224,1),dim_ordering="tf")) model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),border_mode="valid")) model.add(Conv2D(36,(5,5),activation="relu")) model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),border_mode="valid")) model.add(Conv2D(48,(5,5),activation="relu")) model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),border_mode="valid")) model.add(Conv2D(64,(3,3),activation="relu")) model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2),border_mode="valid")) model.add(Conv2D(64,(3,3),activation="relu")) model.add(GlobalAveragePooling2D()) model.add(Dense(500,activation="relu")) model.add(Dense(90,activation="relu")) model.add(Dense(8)) model.compile(optimizer="rmsprop",loss="mse",metrics=["mae","accuracy"]) return model model=createCNN() if args.load_model: model=load_model(args.load_model) log.info("loading data...") with np.load(args.data) as data: trainImages=data["trainImages"] trainLabels=data["trainLabels"] testImages=data["testImages"] testLabels=data["testLabels"] log.info("done") tensorboard = TensorBoard(log_dir=os.path.join(cfg.thisDir,"../logs","{}".format(time()))) BIG_STEP=20 for i in range(args.initial_epoch//BIG_STEP,args.epochs//BIG_STEP): model.fit(trainImages.reshape((-1,224,224,1)),trainLabels,epochs=(i+1)*BIG_STEP,initial_epoch=i*BIG_STEP,batch_size=20,validation_split=0.2,callbacks=[tensorboard]) path=args.save_model.format((i+1)*BIG_STEP) log.info("saving model...") model.save(path) # ftp.push(path) log.info(model.evaluate(testImages.reshape((-1,224,224,1)),testLabels))