测试代码
#coding:utf-8 #http://blog.csdn.net/zhuiqiuk/article/details/53376283 #http://blog.csdn.net/gan_player/article/details/77586489 # from __future__ import absolute_import, unicode_literals # from tensorflow.examples.tutorials.mnist import input_data # import tensorflow as tf # import shutil # import os.path # from tensorflow.python.framework import graph_util #import mxnet as mx # import numpy as np # import random # import cv2 # from time import sleep # from easydict import EasyDict as edict # import logging # import pdb # import math # import re import tensorflow as tf import numpy as np #import getmxnetmodel # def load_checkpoint(): # """ # Load model checkpoint from file. # :param prefix: Prefix of model name. # :param epoch: Epoch number of model we would like to load. # :return: (arg_params, aux_params) # arg_params : dict of str to NDArray # Model parameter, dict of name to NDArray of net's weights. # aux_params : dict of str to NDArray # Model parameter, dict of name to NDArray of net's auxiliary states. # """ # save_dict = mx.nd.load('model-0000.params') # arg_params = {} # aux_params = {} # for k, v in save_dict.items(): # tp, name = k.split(':', 1) # if tp == 'arg': # arg_params[name] = v # if tp == 'aux': # aux_params[name] = v # return arg_params, aux_params # def convert_context(params, ctx): # """ # :param params: dict of str to NDArray # :param ctx: the context to convert to # :return: dict of str of NDArray with context ctx # """ # new_params = dict() # for k, v in params.items(): # new_params[k] = v.as_in_context(ctx) # #print new_params[0] # return new_params # def load_param(convert=False, ctx=None): # """ # wrapper for load checkpoint # :param prefix: Prefix of model name. # :param epoch: Epoch number of model we would like to load. # :param convert: reference model should be converted to GPU NDArray first # :param ctx: if convert then ctx must be designated. # :return: (arg_params, aux_params) # """ # arg_params, aux_params = load_checkpoint() # if convert: # if ctx is None: # ctx = mx.cpu() # arg_params = convert_context(arg_params, ctx) # aux_params = convert_context(aux_params, ctx) # return arg_params, aux_params def conv_weight_variable(params, name): #def conv_weight_variable(): #conv_weight = params[0][name + "_weight"].asnumpy() #tf height * width * in_channels * output_channels #mxnet output_channels * in_channels * height * width height = 5 width = 5 inchannel = 1 outchannel = 2 #conv0 (64, 112, 112) kernel (3, 3) stride (1, 1) pad (1, 1) wkernel = 3 stride = 1 pad = 1 dilate = 1 conv_weight = np.arange(wkernel * wkernel * inchannel * outchannel).reshape((outchannel,inchannel,wkernel,wkernel)) conv_weight =conv_weight.transpose(3,2,1,0) print(conv_weight.shape) print('input:',conv_weight) conv_weight = tf.Variable(conv_weight, dtype=np.float32, name = "weight") return conv_weight # def bias_variable(shape, params): # initial = tf.constant(0.1, shape=shape) # return tf.Variable(initial) # def bn_variable(params, name): # bn_beta = params[0][name + "_beta"].asnumpy() # bn_gamma = params[0][name + "_gamma"].asnumpy() # bn_moving_mean = params[1][name + "_moving_mean"].asnumpy() # bn_moving_var = params[1][name + "_moving_var"].asnumpy() # mean = tf.Variable(bn_moving_mean, dtype=np.float32, name = name + "_moving_mean") # variance = tf.Variable(bn_moving_var, dtype=np.float32, name = name + "_moving_var") # offset = tf.Variable(bn_beta, dtype=np.float32, name = name + "_beta") # scale = tf.Variable(bn_gamma, dtype=np.float32, name = name + "_gamma") # return mean, variance, offset, scale # def fc_variable(params, name): # fc_weight = params[0][name + "_weight"].asnumpy() # fc_weight = fc_weight.transpose(1,0) # fc_bias = params[0][name + "_bias"].asnumpy() # fc_weight = tf.Variable(fc_weight, dtype=np.float32, name = name + "_weight") # fc_bias = tf.Variable(fc_bias, dtype=np.float32, name = name + "_bias") # return fc_weight, fc_bias # def act_variable(params, name): # relu_gamma = params[0][name + "_gamma"].asnumpy() # print(relu_gamma) # #tf_gamma_data = tf.Variable(relu_gamma, dtype=np.float32) # tf_gamma_data = tf.Variable(relu_gamma, dtype=np.float32, name = name + "_gamma") # return tf_gamma_data # def conv2d(input, filter, stride, padding, name): # kernel = filter.get_shape()[0] # if padding == 0: # conv = tf.nn.conv2d(input, filter, strides=[1, stride, stride, 1], padding='VALID') # elif stride == 2: # kernel_size = kernel # kernel_size_effective = kernel_size # pad_total = kernel_size_effective - 1 # pad_beg = pad_total // 2 # pad_end = pad_total - pad_beg # #print(pad_beg, pad_end) # input_PadLayer = tf.pad(input, [[0, 0], [pad_beg, pad_end], [pad_beg, pad_end], [0, 0]], name=name) # conv = tf.nn.conv2d(input_PadLayer, filter, strides=[1, stride, stride, 1], padding='VALID') # else: # conv = tf.nn.conv2d(input, filter, strides=[1, stride, stride, 1], padding='SAME') # return conv # def BatchNorm(input, mean, variance, offset, scale, variance_epsilon, name): # # x = tf_prelu # # mean = tf.Variable(bn_moving_mean, dtype=np.float32) # # variance = tf.Variable(bn_moving_var, dtype=np.float32) # # offset = tf.Variable(bn_beta, dtype=np.float32) # # scale = tf.Variable(bn_gamma, dtype=np.float32) # # variance_epsilon = 2e-5 # tf_bn = tf.nn.batch_normalization(input, mean,variance,offset,scale,variance_epsilon,name=name) # return tf_bn # def Act(data, act_type, tf_gamma_data, name): # if act_type=='prelu': # actdata = tf.nn.leaky_relu(data, alpha=tf_gamma_data,name=name) # else: # #acydaya = tf.nn.relu(data = data, act_type=act_type, name=name) # actdata = data # return actdata # def FullyConnected(input, fc_weight, fc_bias, name): # fc = tf.matmul(input, fc_weight) + fc_bias # return fc # def max_pool_2x2(x): # return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], # strides=[1, 2, 2, 1], padding='SAME') # def inference(input_image, params): # x_image = tf.reshape(input_image, [1, 5, 5, 1]) # stride = 1; pad = 1; name = "conv0" # W_conv0 = conv_weight_variable(params, name) # body = conv2d(x_image, W_conv0, stride, pad, name) # # variance_epsilon = 2e-5;name = "bn0" # # mean, variance, offset, scale = bn_variable(params, name) # # body = BatchNorm(body, mean, variance, offset, scale, variance_epsilon, name) # # act_type = 'prelu'; name = "relu0" # # tf_gamma_data = act_variable(params, name) # # body = Act(body, act_type, tf_gamma_data, name) # # name = "fc0" # # weight_fc, bias_fc = fc_variable(params, name) # # body = tf.reshape(body, [-1, body.get_shape()[1] * body.get_shape()[2] * body.get_shape()[3]]) # # body = FullyConnected(body, weight_fc, bias_fc, name) # return body # def train(export_dir): # mnist = input_data.read_data_sets("datasets", one_hot=True) # g = tf.Graph() # with g.as_default(): # x = tf.placeholder("float", shape=[None, 784]) # y_ = tf.placeholder("float", shape=[None, 10]) # keep_prob = tf.placeholder("float") # logits = inference(x, keep_prob) # y_conv = tf.nn.softmax(logits) # cross_entropy = -tf.reduce_sum(y_ * tf.log(y_conv)) # train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) # correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1)) # accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) # sess = tf.Session() # sess.run(tf.initialize_all_variables()) # step = 200 # batch_size = 50 # for i in range(step+1): # batch = mnist.train.next_batch(batch_size) # if i % 10 == 0: # train_accuracy = accuracy.eval( # {x: batch[0], y_: batch[1], keep_prob: 1.0}, sess) # print "step %d, training accuracy %g" % (i, train_accuracy) # train_step.run( # {x: batch[0], y_: batch[1], keep_prob: 0.5}, sess) # print "test accuracy %g" % accuracy.eval( # {x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}, sess) # saver = tf.train.Saver() # checkpoint_file = os.path.join(export_dir, 'model.ckpt') # saver.save(sess, checkpoint_file, global_step=step) # checkpoint_file = os.path.join(export_dir, 'model.ckpt') # def export_pb_model(model_name): # graph = tf.Graph() # with graph.as_default(): # input_image = tf.placeholder("float", shape=[None,28*28], name='inputdata') # keep_prob = tf.placeholder("float", name = 'keep_probdata') # logits = inference(input_image, keep_prob) # y_conv = tf.nn.softmax(logits,name='outputdata') # restore_saver = tf.train.Saver() # with tf.Session(graph=graph) as sess: # sess.run(tf.global_variables_initializer()) # latest_ckpt = tf.train.latest_checkpoint('log') # restore_saver.restore(sess, latest_ckpt) # output_graph_def = tf.graph_util.convert_variables_to_constants( # sess, graph.as_graph_def(), ['outputdata']) # # tf.train.write_graph(output_graph_def, 'log', model_name, as_text=False) # with tf.gfile.GFile(model_name, "wb") as f: # f.write(output_graph_def.SerializeToString()) # def test_pb_model(model_name): # mnist = input_data.read_data_sets("datasets", one_hot=True) # with tf.Graph().as_default(): # output_graph_def = tf.GraphDef() # output_graph_path = model_name # # sess.graph.add_to_collection("input", mnist.test.images) # with open(output_graph_path, "rb") as f: # output_graph_def.ParseFromString(f.read()) # tf.import_graph_def(output_graph_def, name="") # with tf.Session() as sess: # tf.initialize_all_variables().run() # input_x = sess.graph.get_tensor_by_name("inputdata:0") # output = sess.graph.get_tensor_by_name("outputdata:0") # keep_prob = sess.graph.get_tensor_by_name("keep_probdata:0") # y_conv_2 = sess.run(output,{input_x:mnist.test.images, keep_prob: 1.0}) # print( "y_conv_2", y_conv_2) # # Test trained model # #y__2 = tf.placeholder("float", [None, 10]) # y__2 = mnist.test.labels # correct_prediction_2 = tf.equal(tf.argmax(y_conv_2, 1), tf.argmax(y__2, 1)) # print ("correct_prediction_2", correct_prediction_2 ) # accuracy_2 = tf.reduce_mean(tf.cast(correct_prediction_2, "float")) # print ("accuracy_2", accuracy_2) # print ("check accuracy %g" % accuracy_2.eval()) # def showmodel(): # result = load_param() # #pdb.set_trace() # print('result is', result) # #print result # for dic in result: # #dic = sorted(dic.keys()) # for key in sorted(dic.keys()): # print(key, dic[key].shape) # #print(key,dic[key]) # print('one of results conv0_weight is:') # conv0_weight = result[0]['conv0_weight'].asnumpy() # print('name:',conv0_weight.shape) # print('value:',result[0]['conv0_weight'].asnumpy()) # def get_netpoint_params(params, name): # # (u'bn0_beta', (2L,)) # # (u'bn0_gamma', (2L,)) # # (u'conv0_weight', (2L, 1L, 3L, 3L)) # # (u'fc2_bias', (10L,)) # # (u'fc2_weight', (10L, 1568L)) # # (u'relu0_gamma', (2L,)) # # (u'bn0_moving_mean', (2L,)) # # (u'bn0_moving_var3 (2L,)) # name_split = name.strip().split('_') # train_variable = ['conv','bn','relu','fc'] # for var in train_variable: # index = var.find('a',0) # if index != -1: # continue # if index == -1: # print("netpoint name is error") # else: # if index == 0: # conv_weight = params[0][name + "_weight"].asnumpy() # elif index == 1: # bn_beta = params[0][name + "_beta"].asnumpy() # bn_gamma = params[0][name + "_gamma"].asnumpy() # bn__moving_mean = params[0][name + "__moving_mean"].asnumpy() # bn_moving_var = params[0][name + "_moving_var"].asnumpy() # elif index == 2: # relu_gamma = params[0][name + "_gamma"].asnumpy() # elif index == 3: # fc_weight = params[0][name + "_weight"].asnumpy() # fc_bias = params[0][name + "_bias"].asnumpy() # def softmax(x): # """ # Compute the softmax function for each row of the input x. # Arguments: # x -- A N dimensional vector or M x N dimensional numpy matrix. # Return: # x -- You are allowed to modify x in-place # """ # orig_shape = x.shape # if len(x.shape) > 1: # # Matrix # exp_minmax = lambda x: np.exp(x - np.max(x)) # denom = lambda x: 1.0 / np.sum(x) # x = np.apply_along_axis(exp_minmax,1,x) # denominator = np.apply_along_axis(denom,1,x) # if len(denominator.shape) == 1: # denominator = denominator.reshape((denominator.shape[0],1)) # x = x * denominator # else: # # Vector # x_max = np.max(x) # x = x - x_max # numerator = np.exp(x) # denominator = 1.0 / np.sum(numerator) # x = numerator.dot(denominator) # assert x.shape == orig_shape # return x def eval(): #mxnet_params = load_param() # label = 9 # img = cv2.imread('./mnist_img/mnist_train_8.jpg',0) # img = cv2.resize(img,(5,5)) # img = np.expand_dims(img, axis=0) # img = np.expand_dims(img, axis=0) # data = np.arange(5 * 5 * 1).reshape((1,1,5,5)) # data = data.transpose(0,3,2,1) # input_image = tf.Variable(data, dtype=np.float32) # print('img',img) # #logdit = inference(input_image, mxnet_params) # #x_image = tf.reshape(input_image, [1, 5, 5, 1]) # stride = 1; pad = 1; name = "conv0" # W_conv0 = conv_weight_variable(mxnet_params, name) # body = conv2d(input_image, W_conv0, stride, pad, name) # init = tf.global_variables_initializer() # with tf.Session() as sess: # sess.run(init) # fc = sess.run(body) # print(fc) # with tf.Graph().as_default(): # #with tf.Session() as sess: # input_image = tf.placeholder("float", [1, 1, 28, 28]) # logdit = inference(input_image, mxnet_params) # init = tf.global_variables_initializer() # with tf.Session() as sess: # sess.run(init) # # gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.8) # # sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) # sess.run(tf.initialize_all_variables()) # fc = sess.run(logdit,{input_image:img}) # print( "fc", fc) # softmax_fc = softmax(fc) # print(softmax_fc) # max_index = np.argmax(softmax_fc, axis=1) # print("label ", label) # print("predit ", max_index) # print(max_index == label) height = 5 width = 5 inchannel = 1 outchannel = 2 #conv0 (64, 112, 112) kernel (3, 3) stride (1, 1) pad (1, 1) wkernel = 3 stride = 1 pad = 1 dilate = 1 # w = np.arange(wkernel * wkernel * inchannel * outchannel).reshape((outchannel,inchannel,wkernel,wkernel)) # b = np.array([0]) mxnet_params = 1 w = conv_weight_variable(mxnet_params,"conv0") data = np.arange(height * width * inchannel).reshape((1,inchannel,height,width)) print('input:',data) print('weight:',w) data = data.transpose(0,3,2,1) #w = w.transpose(3,2,1,0) # print('input:',data) # print('inputshape:',data.shape) # print('weight:',w) # print('weight:',w.shape) input = tf.Variable(data, dtype=np.float32) #input_reshape = tf.reshape(input, [1,inchannel,height,width]) filter = tf.Variable(w, dtype=np.float32) conv = tf.nn.conv2d(input, filter, strides=[1, stride, stride, 1], padding='SAME') init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) #print("input: \n", sess.run(input)) input_reshape = sess.run(input).transpose(0,3,2,1) #print("input_reshape: \n", input_reshape) #print("filter: \n", sess.run(filter)) filter_reshape = sess.run(filter).transpose(3,2,1,0) #print("filter_reshape: \n", filter_reshape) #print("conv ", sess.run(conv)) conv_reshape = sess.run(conv).transpose(0,3,2,1) print("conv_reshape: \n", conv_reshape) # tf_prelu_reshape = sess.run(tf_prelu).transpose(0,3,2,1) # print("tf_prelu_reshape: \n", tf_prelu_reshape) # tf_bn_reshape = sess.run(tf_bn).transpose(0,3,2,1) # print("tf_bn_reshape: \n", tf_bn_reshape) if __name__ == '__main__': eval() #showmodel() #load mxnet model #mxnet_params = load_param() # import re # print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配 # print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配 # info = 'abca' # print info.find('a')##从下标0开始,查找在字符串里第一个出现的子串,返回结果:0 # info = 'abca' # print info.find('a',1)##从下标1开始,查找在字符串里第一个出现的子串:返回结果3 # info = 'abca' # print info.find('333')##返回-1,查找不到返回-1 # export_dir = './log' # if os.path.exists(export_dir): # shutil.rmtree(export_dir) #训练并保存模型ckpt #train(export_dir) #model_name = os.path.join(export_dir, 'mnist.pb') # #ckpt模型转换为pb模型 # export_pb_model(model_name) # #测试pb模型 # test_pb_model(model_name)
from __future__ import absolute_import from __future__ import division from __future__ import print_function from scipy import misc import sys import os import argparse import tensorflow as tf import numpy as np import mxnet as mx import random import cv2 from time import sleep from easydict import EasyDict as edict import logging import pdb import math def load_checkpoint(): """ Load model checkpoint from file. :param prefix: Prefix of model name. :param epoch: Epoch number of model we would like to load. :return: (arg_params, aux_params) arg_params : dict of str to NDArray Model parameter, dict of name to NDArray of net's weights. aux_params : dict of str to NDArray Model parameter, dict of name to NDArray of net's auxiliary states. """ save_dict = mx.nd.load('model-0000.params') arg_params = {} aux_params = {} for k, v in save_dict.items(): tp, name = k.split(':', 1) if tp == 'arg': arg_params[name] = v if tp == 'aux': aux_params[name] = v return arg_params, aux_params def convert_context(params, ctx): """ :param params: dict of str to NDArray :param ctx: the context to convert to :return: dict of str of NDArray with context ctx """ new_params = dict() for k, v in params.items(): new_params[k] = v.as_in_context(ctx) #print new_params[0] return new_params def load_param(convert=False, ctx=None): """ wrapper for load checkpoint :param prefix: Prefix of model name. :param epoch: Epoch number of model we would like to load. :param convert: reference model should be converted to GPU NDArray first :param ctx: if convert then ctx must be designated. :return: (arg_params, aux_params) """ arg_params, aux_params = load_checkpoint() if convert: if ctx is None: ctx = mx.cpu() arg_params = convert_context(arg_params, ctx) aux_params = convert_context(aux_params, ctx) return arg_params, aux_params def srctrain(): logging.getLogger().setLevel(logging.DEBUG) batch_size = 100 mnist = mx.test_utils.get_mnist() train_iter = mx.io.NDArrayIter(mnist['train_data'], mnist['train_label'], batch_size, shuffle=True) val_iter = mx.io.NDArrayIter(mnist['test_data'], mnist['test_label'], batch_size) data = mx.sym.var('data') # first conv layer conv1= mx.sym.Convolution(data=data, kernel=(5,5), num_filter=20) tanh1= mx.sym.Activation(data=conv1, act_type="tanh") pool1= mx.sym.Pooling(data=tanh1, pool_type="max", kernel=(2,2), stride=(2,2)) # second conv layer conv2= mx.sym.Convolution(data=pool1, kernel=(5,5), num_filter=50) tanh2= mx.sym.Activation(data=conv2, act_type="tanh") pool2= mx.sym.Pooling(data=tanh2, pool_type="max", kernel=(2,2), stride=(2,2)) # first fullc layer flatten= mx.sym.Flatten(data=pool2) fc1= mx.symbol.FullyConnected(data=flatten, num_hidden=500) tanh3= mx.sym.Activation(data=fc1, act_type="tanh") # second fullc fc2= mx.sym.FullyConnected(data=tanh3, num_hidden=10) # softmax loss lenet= mx.sym.SoftmaxOutput(data=fc2, name='softmax') # create a trainable module on GPU 0 lenet_model = mx.mod.Module( symbol=lenet, context=mx.cpu()) # train with the same lenet_model.fit(train_iter, eval_data=val_iter, optimizer='sgd', optimizer_params={'learning_rate':0.1}, eval_metric='acc', batch_end_callback = mx.callback.Speedometer(batch_size, 100), num_epoch=2) #save model msave = 0 print('saving', msave) arg, aux = lenet_model.get_params() prefix = "./model" mx.model.save_checkpoint(prefix, msave, lenet_model.symbol, arg, aux) def Act(data, act_type, name): if act_type=='prelu': body = mx.sym.LeakyReLU(data = data, act_type='prelu', name = name) else: body = mx.symbol.Activation(data=data, act_type=act_type, name=name) return body global input_size def out_dim(input = (3,112,112), num_filter = 64, kernel = (3,3), stride = (1,1), pad = (1,1), dilate = (1,1), name="point", isconv=True): if isconv==True: if pad == None: pad=(0,0) channels = input[0] height = input[1] width = input[2] x = height p = pad[0] s = stride[0] d = dilate[0] k = kernel[0] output_height = (int)(math.floor((x + 2 * p - d * (k - 1) - 1) / s) + 1) y = width p = pad[1] s = stride[1] d = dilate[1] k = kernel[1] output_width = (int)(math.floor((x + 2 * p - d * (k - 1) - 1) / s) + 1) output = (num_filter, output_height, output_width) else: output = input print(name, output, "kernel",kernel, "stride", stride, "pad", pad) return output def Conv(**kwargs): #name = kwargs.get('name') #_weight = mx.symbol.Variable(name+'_weight') #_bias = mx.symbol.Variable(name+'_bias', lr_mult=2.0, wd_mult=0.0) #body = mx.sym.Convolution(weight = _weight, bias = _bias, **kwargs) name = kwargs.get('name') num_filter = kwargs.get('num_filter') kernel = kwargs.get('kernel') stride = kwargs.get('stride') pad = kwargs.get('pad') global input_size input_size = out_dim(input = input_size, num_filter = num_filter, kernel=kernel, stride=stride, pad=pad, dilate = (1,1), name=name, isconv=True) body = mx.sym.Convolution(**kwargs) return body def resnettrain(): logging.getLogger().setLevel(logging.DEBUG) batch_size = 100 bn_mom = 0.9 act_type = 'prelu' global input_size input_size = (1,28,28) mnist = mx.test_utils.get_mnist() train_iter = mx.io.NDArrayIter(mnist['train_data'], mnist['train_label'], batch_size, shuffle=True) val_iter = mx.io.NDArrayIter(mnist['test_data'], mnist['test_label'], batch_size) #label = mx.sym.var('softmax_label') data = mx.sym.var('data') # first conv layer body = Conv(data=data, num_filter=2, kernel=(3,3), stride=(1,1), pad=(1, 1), no_bias=True, name="conv0") body = mx.sym.BatchNorm(data=body, fix_gamma=False, eps=2e-5, momentum=bn_mom, name='bn0') print('bn0', input_size) body = Act(data=body, act_type=act_type, name='relu0') print('relu0', input_size) # # second conv layer # body = Conv(data=body, num_filter=4, kernel=(3,3), stride=(2,2), pad=(1, 1), # no_bias=True, name="conv1") # body = mx.sym.BatchNorm(data=body, fix_gamma=False, eps=2e-5, momentum=bn_mom, name='bn1') # print('bn1', input_size) # body = Act(data=body, act_type=act_type, name='relu1') # print('relu1', input_size) # # third conv layer # body = Conv(data=body, num_filter=6, kernel=(1,1), stride=(2,2), pad=(0, 0), # no_bias=True, name="conv2") # body = mx.sym.BatchNorm(data=body, fix_gamma=False, eps=2e-5, momentum=bn_mom, name='bn2') # print('bn2', input_size) # body = Act(data=body, act_type=act_type, name='relu2') # print('relu2', input_size) # first fullc layer #body= mx.sym.Flatten(data=body) #body= mx.symbol.FullyConnected(data=body, num_hidden=20, name='fc1') #body= mx.sym.Activation(data=body, act_type="tanh", name="Act1") #body= Act(data=body, act_type=act_type, name='relu1') # second fullc body= mx.sym.FullyConnected(data=body, num_hidden=10, name='fc0') #softmax loss lenet= mx.sym.SoftmaxOutput(data=body, name='softmax') # create a trainable module on GPU 0 lenet_model = mx.mod.Module( symbol=lenet, context=mx.cpu()) # train with the same lenet_model.fit(train_iter, eval_data=val_iter, optimizer='sgd', optimizer_params={'learning_rate':0.1}, eval_metric='acc', batch_end_callback = mx.callback.Speedometer(batch_size, 100), num_epoch=2) #save model msave = 0 print('saving', msave) arg, aux = lenet_model.get_params() prefix = "./model" mx.model.save_checkpoint(prefix, msave, lenet_model.symbol, arg, aux) def showmodel(): result = load_param() #pdb.set_trace() #rint('result is', result) #print result for dic in result: #dic = sorted(dic.keys()) for key in sorted(dic.keys()): print(key, dic[key].shape) #print(key,dic[key]) print('one of results conv0_weight is:') conv0_weight = result[0]['conv0_weight'].asnumpy() print('name:',conv0_weight.shape) print('value:',result[0]['conv0_weight'].asnumpy()) class MnistModel: def __init__(self, args): self.args = args model = edict() _vec = args.model.split(',') assert len(_vec)==2 prefix = _vec[0] epoch = int(_vec[1]) print('loading',prefix, epoch) ctx = mx.gpu(args.gpu) sym, arg_params, aux_params = mx.model.load_checkpoint(prefix, epoch) all_layers = sym.get_internals() sym = all_layers['fc0_output'] model = mx.mod.Module(symbol=sym, context=ctx, label_names = None) image_size = (28,28) #model.bind(data_shapes=[('data', (1, 1, image_size[0], image_size[1]))], label_shapes=[('softmax_label', (1,))]) model.bind(data_shapes=[('data', (1, 1, image_size[0], image_size[1]))]) model.set_params(arg_params, aux_params) self.model = model def get_feature(self, img): #face_img is bgr image #img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #aligned = np.transpose(img, (2,0,1)) aligned = img #print(nimg.shape) embedding = None input_blob = np.expand_dims(aligned, axis=0) data = mx.nd.array(input_blob) #label = mx.nd.array((1,)) db = mx.io.DataBatch(data=(data,)) self.model.forward(db, is_train=False) _embedding = self.model.get_outputs()[0].asnumpy() #print(_embedding.shape) embedding = _embedding return embedding def softmax(x): """ Compute the softmax function for each row of the input x. Arguments: x -- A N dimensional vector or M x N dimensional numpy matrix. Return: x -- You are allowed to modify x in-place """ orig_shape = x.shape if len(x.shape) > 1: # Matrix exp_minmax = lambda x: np.exp(x - np.max(x)) denom = lambda x: 1.0 / np.sum(x) x = np.apply_along_axis(exp_minmax,1,x) denominator = np.apply_along_axis(denom,1,x) if len(denominator.shape) == 1: denominator = denominator.reshape((denominator.shape[0],1)) x = x * denominator else: # Vector x_max = np.max(x) x = x - x_max numerator = np.exp(x) denominator = 1.0 / np.sum(numerator) x = numerator.dot(denominator) assert x.shape == orig_shape return x def eval(): parser = argparse.ArgumentParser(description='mnist model test') # general parser.add_argument('--image-size', default='28,28', help='') parser.add_argument('--model', default='./model,0', help='path to load model.') parser.add_argument('--gpu', default=0, type=int, help='gpu id') args = parser.parse_args() model = MnistModel(args) label = 9 img = cv2.imread('./mnist_img/mnist_train_8.jpg',0) img = cv2.resize(img,(28,28)) img = np.expand_dims(img, axis=0) f1 = model.get_feature(img) print(f1.shape) print(f1) softmax_f1 = softmax(f1) print(softmax_f1) max_index = np.argmax(softmax_f1, axis=1) print("label ", label) print("predit ", max_index) print(max_index == label) def rgb2gray(rgb): return np.dot(rgb[...,:3], [0.299, 0.587, 0.114]) if __name__ == '__main__': #resnettrain() showmodel() #eval() # a = np.array([[1,2,3,4]]) # print(a.shape) # #a = np.array([[1,2,3,4],[1,2,3,4]]) # print(softmax(a)) # y_hat = a # Y=np.array([[0,0,0,1]]) # max_index = np.argmax(y_hat, axis=1) # print(max_index) # y_hat[np.arange(y_hat.shape[0]), max_index] = 1 # print(y_hat) # accuracy = np.argmax(y_hat, axis=1)==np.argmax(Y, axis=1) # print(accuracy) # img = cv2.imread('./mnist_img/mnist_train_10.jpg',0) # print(img.shape) # #img.reshape((1,28,28)) # #img = rgb2gray(img) # print(img) # img = np.expand_dims(img, axis=0) # #img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # print(img.shape) # print(img)