首页 Paddle框架 帖子详情
如何同时读取两个模型权重做加权?
收藏
快速回复
Paddle框架 问答深度学习模型训练 2418 5
如何同时读取两个模型权重做加权?
收藏
快速回复
Paddle框架 问答深度学习模型训练 2418 5

#coding=utf-8

from future import absolute_import
from future import division
from future import print_function

import argparse
import functools
import numpy as np
import paddle.fluid as fluid

#加载自定义文件
import models
from attack.attack_pp import FGSM, PGD
from utils import init_prog, save_adv_image, process_img, tensor2img, calc_mse, add_arguments, print_arguments

#######parse parameters
parser = argparse.ArgumentParser(description=doc)
add_arg = functools.partial(add_arguments, argparser=parser)

add_arg('class_dim', int, 120, "Class number.")
add_arg('shape', str, "3,224,224", "output image shape")
add_arg('input', str, "./input_image/", "Input directory with images")
add_arg('output', str, "./output_image/", "Output directory with images")

args = parser.parse_args()
print_arguments(args)

######Init args
image_shape = [int(m) for m in args.shape.split(",")]
class_dim=args.class_dim
input_dir = args.input
output_dir = args.output
model_name1="ResNeXt50_32x4d"
model_name2='MobileNetV2_x2_0'
pretrained_model1="./models_parameters/ResNeXt50_32x4d"
pretrained_model2="./models_parameters/MobileNetV2"
val_list = 'val_list.txt'
use_gpu=True

######Attack graph
adv_program=fluid.Program()
#完成初始化
with fluid.program_guard(adv_program):
input_layer = fluid.layers.data(name='image', shape=image_shape, dtype='float32')
#设置为可以计算梯度
input_layer.stop_gradient=False

# model definition
model1 = models.__dict__[model_name1]()
model2 = models.__dict__[model_name2]()
out_logits1 = model1.net(input=input_layer, class_dim=class_dim)
out_logits2 = model2.net(input=input_layer, class_dim=class_dim)
out_logits = 0.5*(out_logits1+out_logits2)
out = fluid.layers.softmax(out_logits)

place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace()
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())

#记载模型参数
print("Load 1 Start!")
# fluid.io.load_persistables(exe, pretrained_model1)
fluid.io.load_params(exe, pretrained_model1, main_program=fluid.default_main_program())
# fluid.io.load_persistables(exe, pretrained_model2)
fluid.io.load_params(exe, pretrained_model2, main_program=fluid.default_main_program())
print("Load 2 Finish!")

#设置adv_program的BN层状态
init_prog(adv_program)

#创建测试用评估模式
eval_program = adv_program.clone(for_test=True)

#定义梯度
with fluid.program_guard(adv_program):
label = fluid.layers.data(name="label", shape=[1] ,dtype='int64')
loss = fluid.layers.cross_entropy(input=out, label=label)
gradients = fluid.backward.gradients(targets=loss, inputs=[input_layer])[0]

######Inference
def inference(img):
fetch_list = [out.name]

result = exe.run(eval_program,
                 fetch_list=fetch_list,
                 feed={ 'image':img })
result = result[0][0]
pred_label = np.argmax(result)
pred_score = result[pred_label].copy()
return pred_label, pred_score

######FGSM attack
#untarget attack
def attack_nontarget_by_FGSM(img, src_label):
pred_label = src_label

step = 8.0/256.0
eps = 32.0/256.0
while pred_label == src_label:
    #生成对抗样本
    adv=FGSM(adv_program=adv_program,eval_program=eval_program,gradients=gradients,o=img,
             input_layer=input_layer,output_layer=out,step_size=step,epsilon=eps,
             isTarget=False,target_label=0,use_gpu=use_gpu)

    pred_label, pred_score = inference(adv)
    step *= 2
    if step > eps:
        break

print("Test-score: {0}, class {1}".format(pred_score, pred_label))

adv_img=tensor2img(adv)
return adv_img

######PGD attack
#untarget attack
def attack_nontarget_by_PGD(img, src_label):
pred_label = src_label

# Step = 2.0/256效果没有8/256好
step = 8.0/256.0
eps = 32.0/256.0
while pred_label == src_label:
    #生成对抗样本
    adv=PGD(adv_program=adv_program,eval_program=eval_program,gradients=gradients,o=img,
             input_layer=input_layer,output_layer=out,step_size=step,epsilon=eps,
             isTarget=False,target_label=0,use_gpu=use_gpu)

    pred_label, pred_score = inference(adv)
    step *= 2
    if step > eps:
        break

print("Test-score: {0}, class {1}".format(pred_score, pred_label))

adv_img=tensor2img(adv)
return adv_img

####### Main #######
def get_original_file(filepath):
with open(filepath, 'r') as cfile:
full_lines = [line.strip() for line in cfile]
cfile.close()
original_files = []
for line in full_lines:
label, file_name = line.split()
original_files.append([file_name, int(label)])
return original_files

def gen_adv():
mse = 0
original_files = get_original_file(input_dir + val_list)

for filename, label in original_files:
    img_path = input_dir + filename
    print("Image: {0} ".format(img_path))
    img=process_img(img_path)
    adv_img = attack_nontarget_by_FGSM(img, label)
    # adv_img = attack_nontarget_by_PGD(img, label)
    image_name, image_ext = filename.split('.')
    ##Save adversarial image(.png)
    save_adv_image(adv_img, output_dir+image_name+'.png')

    org_img = tensor2img(img)
    score = calc_mse(org_img, adv_img)
    mse += score
print("ADV {} files, AVG MSE: {} ".format(len(original_files), mse/len(original_files)))

def main():
gen_adv()

if name == 'main':
main()

报错信息:
image
image
image
image

  • 问题描述:
    Target : 目标读取入两个模型的权重并加权
0
收藏
回复
全部评论(5)
时间顺序
AIStudio790260
#2 回复于2019-11

"Cannot open file models_parameters/ResNeXt50_32x4d/res_conv1_weights for load op"
根据这条log,可能是没有对应的models文件?

0
回复
AIStudio791116
#3 回复于2019-11

"Cannot open file models_parameters/ResNeXt50_32x4d/res_conv1_weights for load op"
根据这条log,可能是没有对应的models文件?

有模型文件的,两个模型单独导入均没有问题

0
回复
AIStudio790019
#4 回复于2019-11

image
从代码来看,两个模型的参数都被读到同一个program中去了,会导致第一个模型的参数被覆盖。
还有,可以说明一下两个模型做加权具体是指的什么样的操作吗

0
回复
AIStudio791116
#5 回复于2019-11

image
从代码来看,两个模型的参数都被读到同一个program中去了,会导致第一个模型的参数被覆盖。
还有,可以说明一下两个模型做加权具体是指的什么样的操作吗

字面意思降两个模型的输出加权也就是code里的out_logits = 0.5*(out_logits1+out_logits2)操作

0
回复
AIStudio790019
#6 回复于2020-01

不好意思,之前忘了回复。
以上代码出错的原因,是因为当定义了两个模型后,program中就包含了这两个模型的结构和参数,当加载其中一个模型的参数文件时,找不到另一个模型中的参数对应的参数文件就会报错。
可以尝试在定义模型时为每一层指定name,这样防止两个模型的变量名重复,然后将保存的参数文件复制到同一文件夹,然后使用load_params加载该文件夹

1
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户