cuda-covnet 深度学习工具的权值转化为txt 方便cpp源码调用
来源:互联网 发布:淘宝店铺标志尺寸 编辑:程序博客网 时间:2024/06/15 20:28
# Copyright (c) 2011, Alex Krizhevsky (akrizhevsky@gmail.com)# All rights reserved.## Redistribution and use in source and binary forms, with or without modification,# are permitted provided that the following conditions are met:## - Redistributions of source code must retain the above copyright notice,# this list of conditions and the following disclaimer.# # - Redistributions in binary form must reproduce the above copyright notice,# this list of conditions and the following disclaimer in the documentation# and/or other materials provided with the distribution.## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.import numpy as nimport osfrom time import time, asctime, localtime, strftimefrom numpy.random import randn, randfrom numpy import s_, dot, tile, zeros, ones, zeros_like, array, ones_likefrom util import *from data import *from options import *from math import ceil, floor, sqrtfrom data import DataProvider, dp_typesimport sysimport shutilimport platformfrom os import linesep as NLclass ModelStateException(Exception): pass# GPU Model interfaceclass IGPUModel: def __init__(self, model_name, op, load_dic, filename_options=None, dp_params={}): # these are input parameters self.model_name = model_name self.op = op self.options = op.options self.load_dic = load_dic self.filename_options = filename_options self.dp_params = dp_params self.get_gpus() self.fill_excused_options() #assert self.op.all_values_given() for o in op.get_options_list(): setattr(self, o.name, o.value) # these are things that the model must remember but they're not input parameters if load_dic: self.model_state = load_dic["model_state"] self.save_file = self.options["load_file"].value if not os.path.isdir(self.save_file): self.save_file = os.path.dirname(self.save_file) else: self.model_state = {} if filename_options is not None: self.save_file = model_name + "_" + '_'.join(['%s_%s' % (char, self.options[opt].get_str_value()) for opt, char in filename_options]) + '_' + strftime('%Y-%m-%d_%H.%M.%S') self.model_state["train_outputs"] = [] self.model_state["test_outputs"] = [] self.model_state["epoch"] = 1 self.model_state["batchnum"] = self.train_batch_range[0] self.init_data_providers() if load_dic: self.train_data_provider.advance_batch() # model state often requries knowledge of data provider, so it's initialized after try: self.init_model_state() except ModelStateException, e: print e sys.exit(1) for var, val in self.model_state.iteritems(): setattr(self, var, val) self.import_model() self.init_model_lib() def import_model(self): print "=========================" print "Importing %s C++ module" % ('_' + self.model_name) self.libmodel = __import__('_' + self.model_name) def fill_excused_options(self): pass def init_data_providers(self): self.dp_params['convnet'] = self try: self.test_data_provider = DataProvider.get_instance(self.data_path, self.test_batch_range, type=self.dp_type, dp_params=self.dp_params, test=True) self.train_data_provider = DataProvider.get_instance(self.data_path, self.train_batch_range, self.model_state["epoch"], self.model_state["batchnum"], type=self.dp_type, dp_params=self.dp_params, test=False) except DataProviderException, e: print "Unable to create data provider: %s" % e self.print_data_providers() sys.exit() def init_model_state(self): pass def init_model_lib(self): pass def start(self): if self.test_only: self.test_outputs += [self.get_test_error()] self.print_test_results() sys.exit(0) self.train() def train(self): print "=========================" print "Training %s" % self.model_name self.op.print_values() print "=========================" self.print_model_state() print "Running on CUDA device(s) %s" % ", ".join("%d" % d for d in self.device_ids) print "Current time: %s" % asctime(localtime()) print "Saving checkpoints to %s" % os.path.join(self.save_path, self.save_file) print "=========================" next_data = self.get_next_batch() while self.epoch <= self.num_epochs: data = next_data self.epoch, self.batchnum = data[0], data[1] self.print_iteration() sys.stdout.flush() compute_time_py = time() self.start_batch(data) # load the next batch while the current one is computing next_data = self.get_next_batch() batch_output = self.finish_batch() self.train_outputs += [batch_output] self.print_train_results() if self.get_num_batches_done() % self.testing_freq == 0: self.sync_with_host() self.test_outputs += [self.get_test_error()] self.print_test_results() self.print_test_status() self.conditional_save() self.print_train_time(time() - compute_time_py) self.cleanup() def cleanup(self): sys.exit(0) def sync_with_host(self): self.libmodel.syncWithHost() def print_model_state(self): pass def get_num_batches_done(self): return len(self.train_batch_range) * (self.epoch - 1) + self.batchnum - self.train_batch_range[0] + 1 def get_next_batch(self, train=True): dp = self.train_data_provider if not train: dp = self.test_data_provider return self.parse_batch_data(dp.get_next_batch(), train=train) def parse_batch_data(self, batch_data, train=True): return batch_data[0], batch_data[1], batch_data[2]['data'] def start_batch(self, batch_data, train=True): self.libmodel.startBatch(batch_data[2], not train) def finish_batch(self): return self.libmodel.finishBatch() def print_iteration(self): print "\t%d.%d..." % (self.epoch, self.batchnum), def print_train_time(self, compute_time_py): print "(%.3f sec)" % (compute_time_py) def print_train_results(self): batch_error = self.train_outputs[-1][0] if not (batch_error > 0 and batch_error < 2e20): print "Crazy train error: %.6f" % batch_error self.cleanup() print "Train error: %.6f " % (batch_error), def print_test_results(self): batch_error = self.test_outputs[-1][0] print "%s\t\tTest error: %.6f" % (NL, batch_error), def print_test_status(self): status = (len(self.test_outputs) == 1 or self.test_outputs[-1][0] < self.test_outputs[-2][0]) and "ok" or "WORSE" print status, def conditional_save(self): batch_error = self.test_outputs[-1][0] if batch_error > 0 and batch_error < self.max_test_err: self.save_state() else: print "\tTest error > %g, not saving." % self.max_test_err, def aggregate_test_outputs(self, test_outputs): test_error = tuple([sum(t[r] for t in test_outputs) / (1 if self.test_one else len(self.test_batch_range)) for r in range(len(test_outputs[-1]))]) return test_error def get_test_error(self): next_data = self.get_next_batch(train=False) test_outputs = [] while True: data = next_data self.start_batch(data, train=False) load_next = not self.test_one and data[1] < self.test_batch_range[-1] if load_next: # load next batch next_data = self.get_next_batch(train=False) test_outputs += [self.finish_batch()] if self.test_only: # Print the individual batch results for safety print "batch %d: %s" % (data[1], str(test_outputs[-1])) if not load_next: break sys.stdout.flush() return self.aggregate_test_outputs(test_outputs) def set_var(self, var_name, var_val): setattr(self, var_name, var_val) self.model_state[var_name] = var_val return var_val def get_var(self, var_name): return self.model_state[var_name] def has_var(self, var_name): return var_name in self.model_state def save_state(self): for att in self.model_state: if hasattr(self, att): self.model_state[att] = getattr(self, att) dic = {"model_state": self.model_state, "op": self.op} layers = {"layers": self.model_state['layers']} conv = {"conv": self.model_state['layers'][2]} convBiases = {"biases": self.model_state['layers'][2]['biases']} # objectFileName = r'./Data.txt' # f = file(objectFileName, 'w') # # cPickle .dump(dic, f) # # # # cPickle .dump(layers, f) # # # # cPickle .dump(conv, f) # # cPickle .dump(dic, f) # f.close() # # obj2 = cPickle.load(open(objectFileName, "r")) # # # print obj2['biases'] # # print obj2['biases'].size # # print obj2['biases'][0][0] # # print obj2['biases'][1][0] # # # zbfState = obj2["model_state"] # # zbfLayers = zbfState["layers"] # # print obj2["model_state"]["layers"]########################################################################################## # myfile = open('testWeight.txt', 'w') # zbfState = dic["model_state"] # zbfLayers = zbfState["layers"] # # myfile.write("0\n") # myfile.write("32 ") # myfile.write("32 ") # myfile.write("3"+"\n") # # for numLayer in range(2,16): # zbfNum = zbfLayers[numLayer] # type = zbfNum["type"] # print type # # if type == "conv": # myfile.write("1\n") # # filterSize = zbfNum["filterSize"][0] # myfile.write(str(filterSize)+" ") # # filters = zbfNum["filters"] # myfile.write(str(filters)+" ") # # stride = zbfNum["stride"][0] # myfile.write(str(stride)+"\n") # # channels = zbfNum["channels"][0] # # print zbfNum["stride"][0] # # zbfBiases = zbfNum["biases"] # for i in range(filters): # myfile.write(str(zbfBiases[i][0])+" ") # myfile.write("\n") # # zbfWeight = zbfNum["weights"] # # for j in range(filterSize*filterSize*channels): # for i in range(filters): # myfile.write(str(zbfWeight[0][j][i])+" ") # myfile.write("\n") # if type == "neuron": # myfile.write("256\n") # # if type == "pool": # myfile.write("3\n") # sizeX = zbfNum["sizeX"] # myfile.write(str(sizeX)+" ") # # stride = zbfNum["stride"] # myfile.write(str(stride)+"\n") # # if type == "cmrnorm": # myfile.write("4\n") # k = 1 # myfile.write(str(k)+" ") # # size = zbfNum["size"] # myfile.write(str(size)+"\n") # # scale = zbfNum["scale"] # myfile.write(str(scale)+" ") # # pow = zbfNum["pow"] # myfile.write(str(pow)+"\n") # # if type == "local": # myfile.write("2\n") # # filterSize = zbfNum["filterSize"][0] # myfile.write(str(filterSize)+" ") # # # filters = zbfNum["filters"] # myfile.write(str(filters)+" ") # # stride = zbfNum["stride"][0] # myfile.write(str(stride)+"\n") # # channels = zbfNum["channels"][0] # # print zbfNum["stride"][0] # imagePixels = zbfNum["imgPixels"][0] # # filterPixels = zbfNum["filterPixels"][0] # filterChannels = zbfNum["filterChannels"][0] # # biases = zbfNum["biases"] # for i in range(filters*channels): # myfile.write(str(biases[i][0])+" ") # myfile.write("\n") # # zbfWeight = zbfNum["weights"] # # print zbfWeight[0].T # for j in range(channels*filterChannels*filterPixels): # for i in range(filters): # myfile.write(str(zbfWeight[0][j][i])+" ") # myfile.write("\n") # # if type == "fc": # myfile.write("5\n") # # output = zbfNum["outputs"] # myfile.write(str(output)+" ") # # biases = zbfNum["biases"] # for i in range(output): # myfile.write(str(biases[0][i])+" ") # myfile.write("\n") # # zbfWeight = zbfNum["weights"] # # for j in range(8*8*32): # for i in range(output): # myfile.write(str(zbfWeight[0][j][i])+" ") # myfile.write("\n") # # if type == "softmax": # myfile.write("6\n") # # myfile.close();#################################################################################### checkpoint_dir = os.path.join(self.save_path, self.save_file) checkpoint_file = "%d.%d" % (self.epoch, self.batchnum) checkpoint_file_full_path = os.path.join(checkpoint_dir, checkpoint_file) if not os.path.exists(checkpoint_dir): os.makedirs(checkpoint_dir) pickle(checkpoint_file_full_path, dic,compress=self.zip_save) for f in sorted(os.listdir(checkpoint_dir), key=alphanum_key): if sum(os.path.getsize(os.path.join(checkpoint_dir, f2)) for f2 in os.listdir(checkpoint_dir)) > self.max_filesize_mb*1024*1024 and f != checkpoint_file: os.remove(os.path.join(checkpoint_dir, f)) else: break @staticmethod def load_checkpoint(load_dir): if os.path.isdir(load_dir): return unpickle(os.path.join(load_dir, sorted(os.listdir(load_dir), key=alphanum_key)[-1])) return unpickle(load_dir) @staticmethod def get_options_parser(): op = OptionsParser() op.add_option("f", "load_file", StringOptionParser, "Load file", default="", excuses=OptionsParser.EXCLUDE_ALL) op.add_option("train-range", "train_batch_range", RangeOptionParser, "Data batch range: training") op.add_option("test-range", "test_batch_range", RangeOptionParser, "Data batch range: testing") op.add_option("data-provider", "dp_type", StringOptionParser, "Data provider", default="default") op.add_option("test-freq", "testing_freq", IntegerOptionParser, "Testing frequency", default=25) op.add_option("epochs", "num_epochs", IntegerOptionParser, "Number of epochs", default=500) op.add_option("data-path", "data_path", StringOptionParser, "Data path") op.add_option("save-path", "save_path", StringOptionParser, "Save path") op.add_option("max-filesize", "max_filesize_mb", IntegerOptionParser, "Maximum save file size (MB)", default=5000) op.add_option("max-test-err", "max_test_err", FloatOptionParser, "Maximum test error for saving") op.add_option("num-gpus", "num_gpus", IntegerOptionParser, "Number of GPUs", default=1) op.add_option("test-only", "test_only", BooleanOptionParser, "Test and quit?", default=0) op.add_option("zip-save", "zip_save", BooleanOptionParser, "Compress checkpoints?", default=0) op.add_option("test-one", "test_one", BooleanOptionParser, "Test on one batch at a time?", default=1) op.add_option("gpu", "gpu", ListOptionParser(IntegerOptionParser), "GPU override", default=OptionExpression("[-1] * num_gpus")) return op @staticmethod def print_data_providers(): print "Available data providers:" for dp, desc in dp_types.iteritems(): print " %s: %s" % (dp, desc) def get_gpus(self): self.device_ids = [get_gpu_lock(g) for g in self.op.get_value('gpu')] if GPU_LOCK_NO_LOCK in self.device_ids: print "Not enough free GPUs!" sys.exit() @staticmethod def parse_options(op): try: load_dic = None options = op.parse() if options["load_file"].value_given: load_dic = IGPUModel.load_checkpoint(options["load_file"].value)########################################################################################## if 0 : myfile = open('testWeight.txt', 'w') zbfState = load_dic["model_state"] zbfLayers = zbfState["layers"] myfile.write("0\n") myfile.write("32 ") myfile.write("32 ") myfile.write("3"+"\n") datapath = 'F:/convnet-RGBRGB/cuda-convnet/data/cifar-10-py-colmajor/batches.meta' dictionary = unpickle(datapath) data_mean = dictionary.get('data_mean') for i in range(3072): myfile.write(str(data_mean[i][0])+" ") print data_mean[i][0] myfile.write("\n") for numLayer in range(2,16): zbfNum = zbfLayers[numLayer] type = zbfNum["type"] print type if type == "conv": myfile.write("1\n") filterSize = zbfNum["filterSize"][0] myfile.write(str(filterSize)+" ") filters = zbfNum["filters"] myfile.write(str(filters)+" ") stride = zbfNum["stride"][0] myfile.write(str(stride)+"\n") channels = zbfNum["channels"][0] # print zbfNum["stride"][0] zbfBiases = zbfNum["biases"] for i in range(filters): myfile.write(str(zbfBiases[i][0])+" ") myfile.write("\n") zbfWeight = zbfNum["weights"] for j in range(filterSize*filterSize*channels): for i in range(filters): myfile.write(str(zbfWeight[0][j][i])+" ") myfile.write("\n") if type == "neuron": myfile.write("256\n") if type == "pool": myfile.write("3\n") sizeX = zbfNum["sizeX"] myfile.write(str(sizeX)+" ") stride = zbfNum["stride"] myfile.write(str(stride)+"\n") if type == "cmrnorm": myfile.write("4\n") k = 1 myfile.write(str(k)+" ") size = zbfNum["size"] myfile.write(str(size)+"\n") scale = zbfNum["scale"] myfile.write(str(scale)+" ") pow = zbfNum["pow"] myfile.write(str(pow)+"\n") if type == "local": myfile.write("2\n") filterSize = zbfNum["filterSize"][0] myfile.write(str(filterSize)+" ") filters = zbfNum["filters"] myfile.write(str(filters)+" ") stride = zbfNum["stride"][0] myfile.write(str(stride)+"\n") channels = zbfNum["channels"][0] # print zbfNum["stride"][0] imagePixels = zbfNum["imgPixels"][0] filterPixels = zbfNum["filterPixels"][0] filterChannels = zbfNum["filterChannels"][0] biases = zbfNum["biases"] for i in range(filters*channels): myfile.write(str(biases[i][0])+" ") myfile.write("\n") zbfWeight = zbfNum["weights"] # print zbfWeight[0].T for j in range(channels*filterChannels*filterPixels): for i in range(filters): myfile.write(str(zbfWeight[0][j][i])+" ") myfile.write("\n") if type == "fc": myfile.write("5\n") output = zbfNum["outputs"] myfile.write(str(output)+" ") biases = zbfNum["biases"] for i in range(output): myfile.write(str(biases[0][i])+" ") myfile.write("\n") zbfWeight = zbfNum["weights"] for j in range(8*8*32): for i in range(output): myfile.write(str(zbfWeight[0][j][i])+" ") myfile.write("\n") if type == "softmax": myfile.write("6\n") myfile.close(); #################################################################################### old_op = load_dic["op"] old_op.merge_from(op) op = old_op op.eval_expr_defaults() return op, load_dic except OptionMissingException, e: print e op.print_usage() except OptionException, e: print e except UnpickleError, e: print "Error loading checkpoint:" print e sys.exit()
阅读全文
0 0
- cuda-covnet 深度学习工具的权值转化为txt 方便cpp源码调用
- 深度学习GPU计算工具CUDA安装
- 深度学习工具1.2 CUDA安装
- 方便测试和调用webservice的工具:
- 安装用于深度学习的CUDA环境
- keras:保存keras学习好的深度神经网络模型参数为二进制和txt文件
- Python源码学习 番外-为方便调试和查看变量而自己写的autoexp.dat
- pdf转化为txt (PDFBox)
- visio转化为txt信息
- pdf的换行转化为不换行的txt
- 把C#转化为Javascript的工具
- Dynamics CRM SQL转化为FetchXML的在线转化工具
- 读取Z Buffer深度值将屏幕2D坐标转化为场景3D坐标源码
- 调研内核调用栈方便的工具 kmalloc-top
- 比soap ui方便的webservice调用工具
- Android底部/顶部滑动菜单,方便调用的工具类
- cuda, cudnn的升级,各种深度学习库的安装
- Mavlink_main.cpp源码学习
- H2数据库入门Demo(一)
- OOP,重写与重载,异常处理机制,多线程,集合框架,IO流 -- Java基础复习
- hdu 1272 小希的迷宫
- 生成对抗网络DCGAN+Tensorflow代码学习笔记(二)----utils.py
- VS项目迁移到linux环境中Makefile相关小问题集锦
- cuda-covnet 深度学习工具的权值转化为txt 方便cpp源码调用
- 吴恩达Coursera机器学习课程笔记-定义分类
- QT中使用webView控件时报错
- 最大似然估计(MLE)和最大后验概率(MAP)
- QQ聊天气泡拖动效果实现
- 不想去读spring庞大源码,欲了解其内部原理来读此文
- RabbitMQ入门教程(四):工作队列(Work Queues)
- Makefile的规则
- hash 图像检索方法汇总