def test_mul_div_raises(): with pytest.raises(Exception) as excinfo: objective = objectives.channel("mixed4a", 0) / objectives.channel("mixed4a", 0) assert str(excinfo.value) == "Can only divide by int or float. Received type <class 'lucent.optvis.objectives.Objective'>" with pytest.raises(Exception) as excinfo: objective = objectives.channel("mixed4a", 0) * objectives.channel("mixed4a", 0) assert str(excinfo.value) == "Can only multiply by int or float. Received type <class 'lucent.optvis.objectives.Objective'>"
def runDiversitywithTransforms(layerName, layerNeuron, transforms=None, imageSize=256, batch=4, weight=1e2): ''' Function to run Lucent neuron diversity optimisation for a given Layer and Neuron (Channel) in a PyTorch CNN. This function uses image augmentation transforms to help improve the clarity and resolution of the produced neuron maximisations. ''' if transforms == None: transforms = [ transform.pad(16), transform.jitter(8), transform.random_scale([n / 100. for n in range(80, 120)]), transform.random_rotate( list(range(-10, 10)) + list(range(-5, 5)) + 10 * list(range(-2, 2))), transform.jitter(2), ] batch_param_f = lambda: param.image(imageSize, batch=batch) obj = objectives.channel( layerName, layerNeuron) - weight * objectives.diversity(layerName) _ = render.render_vis(model_, obj, batch_param_f, transforms=transforms, show_inline=True)
def runDiversity(layerName, layerNeuron, imageSize=256, batch=4, weight=1e2): ''' Function to run Lucent neuron diversity optimisation for a given Layer and Neuron (Channel) in a PyTorch CNN. ''' batch_param_f = lambda: param.image(imageSize, batch=batch) obj = objectives.channel( layerName, layerNeuron) - weight * objectives.diversity(layerName) _ = render.render_vis(model_, obj, batch_param_f, show_inline=True)
def visualize_multiple_neurons(model, neuron_names, save_path, device): model.to(device).eval() param_f = lambda: param.image(512, batch=1) neuron1 = neuron_names[0] print(neuron1) obj = objectives.channel(neuron_names[0][0], neuron_names[0][1]) for i in range(1, len(neuron_names)): obj += objectives.channel(neuron_names[i][0], neuron_names[i][1]) _ = render.render_vis(model, obj, param_f, save_image=True, image_name=f'{save_path}_placeholder.jpg', show_image=False)
def gen_objective(targetid, model, params, neuron=False): print('generating feature_viz objective string for %s' % targetid) if '-' in targetid: within_id = edgename_2_singlenum(model, targetid, params) layer_name = nodeid_2_perlayerid(targetid.split('-')[1], params)[2] if not neuron: #return layer_name+'_preadd_conv:'+str(within_id) return objectives.channel(layer_name + '_preadd_conv', int(within_id)) else: return objectives.neuron(layer_name + '_preadd_conv', int(within_id)) else: layer, within_id, layer_name = nodeid_2_perlayerid(targetid, params) if not neuron: #return layer_name+':'+str(within_id) return objectives.channel(layer_name, int(within_id)) else: return objectives.neuron(layer_name, int(within_id))
def test_gan_deep_optim(inceptionv1_model): """ Test if GAN generated image could be optimized """ G = upconvGAN("fc6").to(device) def GANparam(batch=1, sd=1): code = (torch.randn( (batch, G.codelen)) * sd).to(device).requires_grad_(True) imagef = lambda: G.visualize(code) return [code], imagef objective = objectives.channel("mixed3a_1x1_pre_relu_conv", 0) assert_gan_gradient_descent(GANparam, objective, inceptionv1_model)
def visualize_diversity_fc(model, layer, filter, path, batch_size, device): model.to(device).eval() if not os.path.exists(f'{path}/'): os.makedirs(f'{path}/') batch_param_f = lambda: param.image(128, batch=batch_size) layer_name = f'fc_{layer}:{filter}' obj = objectives.channel( f"fc_{layer}", filter) - 1e2 * objectives.diversity(f"fc_{layer}") image_name = f"{path}/{layer_name}_diversity.jpg" _ = render.render_vis(model, obj, batch_param_f, save_image=True, image_name=image_name.replace(':', '_'), show_image=False)
def test_linear_transform(inceptionv1_model): objective = 1 + 1 * -objectives.channel("mixed4a", 0) / 1 - 1 assert_gradient_descent(objective, inceptionv1_model)
def test_sum(inceptionv1_model): channel = lambda n: objectives.channel("mixed4a_pool_reduce_pre_relu_conv", n) objective = objectives.Objective.sum([channel(21), channel(32)]) assert_gradient_descent(objective, inceptionv1_model)
def test_channel(inceptionv1_model): objective = objectives.channel("mixed3a_1x1_pre_relu_conv", 0) assert_gradient_descent(objective, inceptionv1_model)
def test_diversity(inceptionv1_model): objective = objectives.channel("mixed4a", 0) - 100 * objectives.diversity("mixed4a") assert_gradient_descent(objective, inceptionv1_model)
def fetch_deepviz_img_for_subgraph(model, layer_name, within_id, targetid, viz_folder, params): model = set_across_model(model, 'target_node', None) objective_str = layer_name + ':' + str(targetid) neuron = params['deepviz_neuron'] #generate objective #objective = gen_objective(targetid,model,params,neuron=neuron) print('generating feature_viz objective string for %s' % targetid) if not params['deepviz_neuron']: #return layer_name+':'+str(within_id) objective = objectives.channel(layer_name, int(within_id)) else: objective = objectives.neuron(layer_name, int(within_id)) file_path = viz_folder + '/images.csv' parametrizer = params['deepviz_param'] optimizer = params['deepviz_optim'] transforms = params['deepviz_transforms'] image_size = params['deepviz_image_size'] param_str = object_2_str(parametrizer, "params['deepviz_param']=") optimizer_str = object_2_str(optimizer, "params['deepviz_optim']=") transforms_str = object_2_str(transforms, "params['deepviz_transforms']=") df = pd.read_csv(file_path, dtype=str) df_sel = df.loc[(df['targetid'] == str(targetid)) & (df['objective'] == objective_str) & (df['parametrizer'] == param_str) & (df['optimizer'] == optimizer_str) & (df['transforms'] == transforms_str) & (df['neuron'] == str(neuron))] if len(df_sel) == 0: print('deepviz image not found for %s, generating . . .' % targetid) #image_name = 'deepviz_'+str(targetid)+'_'+objective+'_'+str(time.time())+'.jpg' image_name = str(targetid) + '_' + objective_str + '_' + str( time.time()) + '.jpg' #gen_visualization(model,image_name,objective,parametrizer,optimizer,transforms,image_size,neuron,params) if neuron: full_image_path = viz_folder + '/neuron/' + image_name else: full_image_path = viz_folder + '/channel/' + image_name if parametrizer is None: parametrizer = lambda: param.image(image_size) print('generating featviz with objective: %s' % str(objective_str)) _ = render.render_vis(model, objective, parametrizer, optimizer, transforms=transforms, save_image=True, image_name=full_image_path, show_inline=True) with open(file_path, 'a') as csv: csv.write(','.join([ image_name, str(targetid), objective_str, param_str, optimizer_str, transforms_str, str(neuron) ]) + '\n') else: print('found pre-generated image') image_name = df_sel.iloc[0]['image_name'] if neuron: return 'neuron/' + image_name else: return 'channel/' + image_name