def trainCNN(x,y,solverDir,cellIdx): # parse Caffe's param prototxt netDir,solverFn = os.path.split(solverDir) projDir = os.getcwd() if len(netDir)>0: os.chdir(netDir) solverParam = caffe_pb2.SolverParameter() text_format.Merge(open(solverFn).read(),solverParam) netFn = solverParam.net netParam = caffe_pb2.NetParameter() text_format.Merge(open(netFn).read(),netParam) batchDim = utils.infer_data_dimensions(netFn) print('[train]: batch shape: %s' %str(batchDim)) preDir = str(solverParam.snapshot_prefix) # unicode ---> str outDir = os.path.join(projDir,preDir) if os.path.isdir(outDir): os.mkdir(outDir) print('[train]: training data shape: %s' %(str(x.shape)) ) # Create the caffe solover solver = caffe.SGDSolver(solverFn) for name, blobs in solver.net.params.iteritems(): for bIdx, b in enumerate(blobs): print("%s[%d] : %s" %( name,bIdx,b.data.shape)) GPU = solverParam.solver_mode # cpu 0 , gpu 1 if GPU : isModeCPU = 0 gpuId = 0 else: isModeCPU = (solverParam.solver_mode == solverParam.SolverMode.Value('CPU')) gpuId = 0 # different edition has different caffe API try: if not isModeCPU: caffe.set_mode_gpu() caffe.set_device(gpuId) else: caffe.set_mode_cpu() # caffe.set_phase_train() # Needn't set phase as Train except AttributeError: if not isModeCPU: caffe.set_mode_gpu() # caffe.set_device(gpuId) solver.net.set_device(gpuId) else: solver.net.set_mode_cpu() solver.net.set_phase_train() losses, acc = train_loop(solver, x, y, solverParam, batchDim, outDir) solver.net.save('%d_final.caffemodel'%(cellIdx)) # np.save(os.path.join(outDir, '%s_losses' % outDir), losses) # np.save(os.path.join(outDir, '%s_acc' % outDir), acc) print('[train]: ID %d done pretrain!' %(cellIdx)) # change to projDir if len(projDir) >0 : os.chdir(projDir) return losses, acc
def testCNN(x, solverDir,cellId): curDir = os.getcwd() netDir, solverFn = os.path.split(solverDir) # change to prototext Dirs if len(netDir)>0: os.chdir(netDir) solverParam = caffe_pb2.SolverParameter() text_format.Merge(open(solverFn).read(),solverParam) netFn = str(solverParam.net) netParam = caffe_pb2.NetParameter() text_format.Merge(open(netFn).read(),netParam) modelDir = str(cellId)+'_final.caffemodel' print( modelDir ) net = caffe.Net(netFn,modelDir, caffe.TEST) for name, blobs in net.params.iteritems(): print("%s:%s" %(name,blobs[0].data.shape)) GPU = solverParam.solver_mode # cpu 0 , gpu 1 if GPU : isModeCPU = 0 gpuId = 0 else: isModeCPU = (solverParam.solver_mode == solverParam.SolverMode.Value('CPU')) gpuId = 0 # different edition has different caffe API try: if not isModeCPU: caffe.set_mode_gpu() caffe.set_device(gpuId) else: caffe.set_mode_cpu() # caffe.set_phase_train() except AttributeError: if not isModeCPU: net.set_mode_gpu() net.set_device(gpuId) else: net.set_mode_cpu() net.set_phase_train() print("[test:] GPU mode: %s" % GPU ) batchDim = utils.infer_data_dimensions(netFn) print("[test:] batch shape:%s" %(batchDim)) Xi = np.zeros((batchDim[0],1,28,28),dtype=np.float32) Yi = np.zeros((batchDim[0],),dtype=np.float32) xmean = np.mean(x) x = x - xmean maxValue = -1 for idx in utils.testDataGenerator(x,batchDim[0]): # resize for ii in range( 0, min(batchDim[0]-1, np.max(idx)+1) ): temp = symc.imresize(Xi[ii,0,:,:],[28,28]) Xi[ii,0,:,:] = np.float32(temp) if np.max(idx)<(batchDim[0]-1): Xi[idx::,:,:,:] = x[idx::,:,:,:] # work ? or not net.set_input_arrays(Xi,Yi) rv = net.forward() out = rv['prob'] out = np.squeeze(out) ymax = np.max(out[:,0]) # 0 ???????????????? is positive??? yidx = np.argmax(out[:,0]) if ymax>maxValue: maxValue = ymax yidx = yidx # yidx in appended data if yidx > batchDim[0]-1: yidx = batchDim[0]-1 if len(curDir)>0: os.chdir(curDir) return yidx,maxValue
def updateTrain(x,y,solverDir,cellIdx): # finetune projDir = os.getcwd() netDir, solverFn = os.path.split(solverDir) # change to prototext Dirs if len(netDir)>0: os.chdir(netDir) solverParam = caffe_pb2.SolverParameter() text_format.Merge(open(solverFn).read(),solverParam) netFn = str(solverParam.net) netParam = caffe_pb2.NetParameter() text_format.Merge(open(netFn).read(),netParam) modelDir = str(cellIdx)+'_final.caffemodel' solverParam.max_iter = 10 print( modelDir ) solver = caffe.SGDSolver(solverDir) solver.net.copy_from(modelDir) batchDim = utils.infer_data_dimensions(netFn) print('[train]: batch shape: %s' %str(batchDim)) preDir = str(solverParam.snapshot_prefix) # unicode ---> str outDir = os.path.join(projDir,preDir) if os.path.isdir(outDir): os.mkdir(outDir) print('[train]: training data shape: %s' %(str(x.shape)) ) # Create the caffe solover # solver = caffe.SGDSolver(solverFn) for name, blobs in solver.net.params.iteritems(): for bIdx, b in enumerate(blobs): print("%s[%d] : %s" %( name,bIdx,b.data.shape)) GPU = solverParam.solver_mode # cpu 0 , gpu 1 if GPU : isModeCPU = 0 gpuId = 0 else: isModeCPU = (solverParam.solver_mode == solverParam.SolverMode.Value('CPU')) # different edition has different caffe API try: if not isModeCPU: caffe.set_mode_gpu() caffe.set_device(gpuId) # solver.net.set_phase_train() else: caffe.set_mode_cpu() # solver.net.set_phase_train() # Needn't set phase as Train except AttributeError: if not isModeCPU: solver.net.set_mode_gpu() # solver.net.set_phase_train() # caffe.set_device(gpuId) else: solver.net.set_mode_cpu() solver.net.set_phase_train() losses, acc = train_loop(solver, x, y, solverParam, batchDim, outDir) solver.net.save('%d_final.caffemodel'%(cellIdx)) print('[train]: ID %d done pretrain!' %(cellIdx)) # change to projDir if len(projDir) >0 : os.chdir(projDir) # niter = 10 # train_loss = np.zeros(niter) # for it in range(niter): # solver.step(1) # SGD by Caffe # # store the train loss # train_loss[it] = solver.net.blobs['loss'].data # if it % 10 == 0: # print 'iter %d, finetune_loss=%f' % (it, train_loss[it]) # print 'done' return