Пример #1
0
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'>"
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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)
Пример #5
0
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))
Пример #6
0
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)
Пример #7
0
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)
Пример #8
0
def test_linear_transform(inceptionv1_model):
    objective = 1 + 1 * -objectives.channel("mixed4a", 0) / 1 - 1
    assert_gradient_descent(objective, inceptionv1_model)
Пример #9
0
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)
Пример #10
0
def test_channel(inceptionv1_model):
    objective = objectives.channel("mixed3a_1x1_pre_relu_conv", 0)
    assert_gradient_descent(objective, inceptionv1_model)
Пример #11
0
def test_diversity(inceptionv1_model):
    objective = objectives.channel("mixed4a", 0) - 100 * objectives.diversity("mixed4a")
    assert_gradient_descent(objective, inceptionv1_model)
Пример #12
0
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