isTheanoShape=parIsTheanoShape) batcherVal = BatcherOnImageCT3D(pathDataIdx=fidxVal, pathMeanData=batcherTrain.pathMeanData, isTheanoShape=parIsTheanoShape) print (':: Train data: %s' % batcherTrain) print (':: Val data: %s' % batcherVal) # wdir = os.path.dirname(fidxTrain) # modelTrained = BatcherOnImageCT3D.loadModelFromDir(wdir, paramFilter='950') # modelTrained = BatcherOnImageCT3D.loadModelFromDir(wdir) # modelTrained = BatcherOnImageCT3D.loadModelFromDir(wdir, paramFilter='adagrad') modelTrained = BatcherOnImageCT3D().loadModelFromDir(wdir, paramFilter='adam') modelTrained.summary() # t0 = time.time() lstIdxSplit = split_list_by_blocks(range(batcherVal.numImg), parBatchSizeVal) numSplit = len(lstIdxSplit) for ii,ll in enumerate(lstIdxSplit): print ('[%d/%d] process batch size [%d]' % (ii, numSplit, len(ll))) dataX, dataY = batcherVal.getBatchDataByIdx(parBatchIdx=ll) tret = modelTrained.predict_on_batch(dataX) # convert to 3D-data if batcherVal.isTheanoShape: tshape3D = list(dataX.shape[2:]) tret3D = tret.reshape([dataX.shape[0]] + tshape3D + [tret.shape[-1]]) dataY3D = dataY.reshape([dataX.shape[0]] + tshape3D + [tret.shape[-1]]) else: tret3D = tret dataY3D = dataY sizSplit = len(ll) for iidx,idx in enumerate(ll):
dataX, dataY = batcherTrn.getBatchDataSliced( parNumImages=parBatchNumImgTrn, parNumSlices=parBatchNumSlcTrn, isReturnDict=False) tret = model.train_on_batch(dataX, dataY) if (ii % stepPrintTrn) == 0: print( '\t[train] epoch [%d/%d], iter = [%d/%d] : loss[iter]/acc[iter] = %0.3f/%0.2f%%' % (eei, parNumEpoch, ii, parNumIterPerEpochTrn, tret[0], 100. * tret[1])) tmpDT = time.time() - tmpT1 print('\t*** train-time for epoch #%d is %0.2fs' % (eei, tmpDT)) # (2) model validation step if ((eei + 1) % 3) == 0: tmpIdxListSclices = split_list_by_blocks( range(batcherTrn.numSlices, batcherTrn.sizeZ - batcherTrn.numSlices), parBatchNumSlcVal) tmpIdxList = range(batcherVal.numImg) # lstIdxSplit = split_list_by_blocks(tmpIdxList, parBatchSizeVal) tmpVal = [] for imgIdx in tmpIdxList: for tlistSliceIdx in tmpIdxListSclices: dataX, dataY = batcherTrn.getBatchDataSlicedByIdx( dictImg2SliceIdx={imgIdx: tlistSliceIdx}, isReturnDict=False) tret = model.evaluate(dataX, dataY, verbose=False) tmpVal.append(tret) if (imgIdx % stepPrintVal) == 0: print( '\t\t[val] epoch [%d/%d], iter = [%d/%d] : loss[iter]/acc[iter] = %0.3f/%0.2f%%' % (eei, parNumEpoch, imgIdx, parNumIterPerEpochVal,
numSlicesProc) / parBatchSizeVal stepPrintVal = int(parNumIterPerEpochVal / 5) # model = batcherTrn.loadModelFromDir(dir_with_models=batcherTrn.wdir, paramFilter=parExportInfo) # model.compile(loss='categorical_crossentropy', optimizer=parOptimizer, metrics=['accuracy']) # model.summary() for ii in range(batcherVal.numImg): tpathMsk = batcherVal.arrPathDataMsk[ii] if K.image_dim_ordering() == 'th': raise NotImplementedError else: tsegm3D = np.zeros(batcherVal.shapeImg[:-1], np.float) lstIdxScl = range(batcherVal.numSlices, batcherVal.sizeZ - batcherVal.numSlices) lstIdxScl = split_list_by_blocks(lstIdxScl, parBatchNumSlcVal) for ss, sslst in enumerate(lstIdxScl): dataX, dataY = batcherVal.getBatchDataSlicedByIdx( {ii: sslst}, isReturnDict=False) tret = model.predict_on_batch(dataX) if K.image_dim_ordering() == 'th': raise NotImplementedError else: sizXY = batcherVal.shapeImg[:2] tret = tret.transpose((1, 0, 2)) tret = tret.reshape(list(sizXY) + list(tret.shape[1:])) tmskSlc = (tret[:, :, :, 1] > 0.5).astype(np.float) tsegm3D[:, :, sslst] = tmskSlc tmsk = nib.load(tpathMsk) tsegm = nib.Nifti1Image(tsegm3D.copy().astype(np.float16), tmsk.affine,
tmpT1 = time.time() for ii in range(parNumIterPerEpochTrn): dataX, dataY = batcherTrn.getBatchData( parBatchSize=parBatchSizeTrn, isRemoveMean=True) tret = model.train_on_batch(dataX, dataY) if (ii % stepPrintTrn) == 0: print( '\t[train] epoch [%d/%d], iter = [%d/%d] : loss[iter]/acc[iter] = %0.3f/%0.2f%%' % (eei, parNumEpoch, ii, parNumIterPerEpochTrn, tret[0], 100. * tret[1])) tmpDT = time.time() - tmpT1 print('\t*** train-time for epoch #%d is %0.2fs' % (eei, tmpDT)) # (2) model validation step if ((eei + 1) % 3) == 0: tmpIdxList = range(batcherVal.numImg) lstIdxSplit = split_list_by_blocks(tmpIdxList, parBatchSizeVal) tmpVal = [] for ii, ll in enumerate(lstIdxSplit): dataX, dataY = batcherVal.getBatchDataByIdx(parBatchIdx=ll, isRemoveMean=True) tret = model.evaluate(dataX, dataY, verbose=False) tmpVal.append(tret) if (ii % stepPrintVal) == 0: print( '\t\t[val] epoch [%d/%d], iter = [%d/%d] : loss[iter]/acc[iter] = %0.3f/%0.2f%%' % (eei, parNumEpoch, ii, parNumIterPerEpochVal, tret[0], 100. * tret[1])) tmpVal = np.array(tmpVal) tmeanValLoss = float(np.mean(tmpVal[:, 0])) tmeanValAcc = float(np.mean(tmpVal[:, 1])) print('\t::validation: mean-losss/mean-acc = %0.3f/%0.3f' %