80 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import paddle
 | |
| import paddle.fluid as fluid
 | |
| from .operations import OPS
 | |
| 
 | |
| 
 | |
| def AuxiliaryHeadCIFAR(inputs, C, class_num):
 | |
|   print ('AuxiliaryHeadCIFAR : inputs-shape : {:}'.format(inputs.shape))
 | |
|   temp = fluid.layers.relu(inputs)
 | |
|   temp = fluid.layers.pool2d(temp, pool_size=5, pool_stride=3, pool_padding=0, pool_type='avg')
 | |
|   temp = fluid.layers.conv2d(temp, filter_size=1, num_filters=128, stride=1, padding=0, act=None, bias_attr=False)
 | |
|   temp = fluid.layers.batch_norm(input=temp, act='relu', bias_attr=None)
 | |
|   temp = fluid.layers.conv2d(temp, filter_size=1, num_filters=768, stride=2, padding=0, act=None, bias_attr=False)
 | |
|   temp = fluid.layers.batch_norm(input=temp, act='relu', bias_attr=None)
 | |
|   print ('AuxiliaryHeadCIFAR : last---shape : {:}'.format(temp.shape))
 | |
|   predict = fluid.layers.fc(input=temp, size=class_num, act='softmax')
 | |
|   return predict
 | |
| 
 | |
| 
 | |
| def InferCell(name, inputs_prev_prev, inputs_prev, genotype, C_prev_prev, C_prev, C, reduction, reduction_prev):
 | |
|   print ('[{:}] C_prev_prev={:} C_prev={:}, C={:}, reduction_prev={:}, reduction={:}'.format(name, C_prev_prev, C_prev, C, reduction_prev, reduction))
 | |
|   print ('inputs_prev_prev : {:}'.format(inputs_prev_prev.shape))
 | |
|   print ('inputs_prev      : {:}'.format(inputs_prev.shape))
 | |
|   inputs_prev_prev = OPS['skip_connect'](inputs_prev_prev, C_prev_prev, C, 2 if reduction_prev else 1)
 | |
|   inputs_prev      = OPS['skip_connect'](inputs_prev, C_prev, C, 1)
 | |
|   print ('inputs_prev_prev : {:}'.format(inputs_prev_prev.shape))
 | |
|   print ('inputs_prev      : {:}'.format(inputs_prev.shape))
 | |
|   if reduction: step_ops, concat = genotype.reduce, genotype.reduce_concat
 | |
|   else        : step_ops, concat = genotype.normal, genotype.normal_concat
 | |
|   states = [inputs_prev_prev, inputs_prev]
 | |
|   for istep, operations in enumerate(step_ops):
 | |
|     op_a, op_b = operations
 | |
|     # the first operation
 | |
|     #print ('-->>[{:}/{:}] [{:}] + [{:}]'.format(istep, len(step_ops), op_a, op_b))
 | |
|     stride  = 2 if reduction and op_a[1] < 2 else 1
 | |
|     tensor1 = OPS[ op_a[0] ](states[op_a[1]], C, C, stride)
 | |
|     stride  = 2 if reduction and op_b[1] < 2 else 1
 | |
|     tensor2 = OPS[ op_b[0] ](states[op_b[1]], C, C, stride)
 | |
|     state   = fluid.layers.elementwise_add(x=tensor1, y=tensor2, act=None)
 | |
|     assert tensor1.shape == tensor2.shape, 'invalid shape {:} vs. {:}'.format(tensor1.shape, tensor2.shape)
 | |
|     print ('-->>[{:}/{:}] tensor={:} from {:} + {:}'.format(istep, len(step_ops), state.shape, tensor1.shape, tensor2.shape))
 | |
|     states.append( state )
 | |
|   states_to_cat = [states[x] for x in concat]
 | |
|   outputs = fluid.layers.concat(states_to_cat, axis=1)
 | |
|   print ('-->> output-shape : {:} from concat={:}'.format(outputs.shape, concat))
 | |
|   return outputs
 | |
| 
 | |
| 
 | |
| 
 | |
| # NASCifarNet(inputs, 36, 6, 3, 10, 'xxx', True)
 | |
| def NASCifarNet(ipt, C, N, stem_multiplier, class_num, genotype, auxiliary):
 | |
|   # cifar head module
 | |
|   C_curr = stem_multiplier * C
 | |
|   stem   = fluid.layers.conv2d(ipt, filter_size=3, num_filters=C_curr, stride=1, padding=1, act=None, bias_attr=False)
 | |
|   stem   = fluid.layers.batch_norm(input=stem, act=None, bias_attr=None)
 | |
|   print ('stem-shape : {:}'.format(stem.shape))
 | |
|   # N + 1 + N + 1 + N cells
 | |
|   layer_channels   = [C    ] * N + [C*2 ] + [C*2  ] * N + [C*4 ] + [C*4  ] * N
 | |
|   layer_reductions = [False] * N + [True] + [False] * N + [True] + [False] * N
 | |
|   C_prev_prev, C_prev, C_curr = C_curr, C_curr, C
 | |
|   reduction_prev = False
 | |
|   auxiliary_pred = None
 | |
| 
 | |
|   cell_results = [stem, stem]
 | |
|   for index, (C_curr, reduction) in enumerate(zip(layer_channels, layer_reductions)):
 | |
|     xstr = '{:02d}/{:02d}'.format(index, len(layer_channels))
 | |
|     cell_result    = InferCell(xstr, cell_results[-2], cell_results[-1], genotype, C_prev_prev, C_prev, C_curr, reduction, reduction_prev)
 | |
|     reduction_prev = reduction
 | |
|     C_prev_prev, C_prev = C_prev, cell_result.shape[1]
 | |
|     cell_results.append( cell_result )
 | |
|     if auxiliary and reduction and C_curr == C*4:
 | |
|       auxiliary_pred = AuxiliaryHeadCIFAR(cell_result, C_prev, class_num)
 | |
| 
 | |
|   global_P = fluid.layers.pool2d(input=cell_results[-1], pool_size=8, pool_type='avg', pool_stride=1)
 | |
|   predicts = fluid.layers.fc(input=global_P, size=class_num, act='softmax')
 | |
|   print ('predict-shape : {:}'.format(predicts.shape))
 | |
|   if auxiliary_pred is None:
 | |
|     return predicts
 | |
|   else:
 | |
|     return [predicts, auxiliary_pred]
 |