Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Resnet152训练模型,保存权重,加载权重并添加更多层_Python_Tensorflow_Keras_Deep Learning_Transfer Learning - Fatal编程技术网

Python 使用Resnet152训练模型,保存权重,加载权重并添加更多层

Python 使用Resnet152训练模型,保存权重,加载权重并添加更多层,python,tensorflow,keras,deep-learning,transfer-learning,Python,Tensorflow,Keras,Deep Learning,Transfer Learning,我的目标是首先只使用ResNet152进行训练,然后保存学习的重量。然后,我想使用这些权重作为一个更复杂的模型的基础,该模型带有添加的层,我最终想对其进行超参数调整。采用这种方法的原因是一次完成这一切需要很长时间。我遇到的问题是我的代码似乎不起作用。我没有收到错误消息,但当我开始训练更复杂的模型时,它似乎再次从0开始,并且没有使用学习的ResNet152权重 代码如下: 首先,我只使用ResNet152和输出层 input\u tensor=input(shape=train\u generat

我的目标是首先只使用ResNet152进行训练,然后保存学习的重量。然后,我想使用这些权重作为一个更复杂的模型的基础,该模型带有添加的层,我最终想对其进行超参数调整。采用这种方法的原因是一次完成这一切需要很长时间。我遇到的问题是我的代码似乎不起作用。我没有收到错误消息,但当我开始训练更复杂的模型时,它似乎再次从0开始,并且没有使用学习的ResNet152权重

代码如下:

首先,我只使用ResNet152和输出层

input\u tensor=input(shape=train\u generator.image\u shape)
base\u model=applications.ResNet152(weights='imagenet',包括\u top=False,input\u tensor=input\u tensor)
对于基本模型中的层。层[:]:
layer.trainable=真–可训练
x=展平()(基本模型输出)
预测=密集(num_类,激活='softmax')(x)
模型=模型(输入=基本模型。输入,输出=预测)
model.compile(
损失=“稀疏”\u分类”\u交叉熵',
优化器=opt,
指标=[‘准确度’])
模型拟合(
列车发电机,
验证\u数据=有效的\u生成器,
时代,
每个历元的步数=列长//批量大小,
验证步骤=长度/批量大小,
回调=[earlyStopping,reduce_lr]
)
然后我保存重量:

model.save_weights('/content/drive/MyDrive/MODELS_SAVED/model_RESNET152/model_weights.h5')
添加更多层


输入\张量=输入(形状=序列\生成器。图像\形状)
base\u model=applications.ResNet152(weights='imagenet',包括\u top=False,input\u tensor=input\u tensor)
对于基本模型中的层。层[:]:
layer.trainable=错误
x=展平()(基本模型输出)
x=稠密(1024,核正则化子=tf.keras.regularizers.L2(L2=0.01),
kernel_initializer=tf.keras.initializers.HeNormal(),
内核约束=tf.keras.constraints.UnitNorm(轴=0))(x)
x=LeakyReLU()(x)
x=BatchNormalization()(x)
x=辍学率(0.1)(x)
x=稠密(512,核正则化子=tf.keras.regularizers.L2(L2=0.01),
kernel_initializer=tf.keras.initializers.HeNormal(),
内核约束=tf.keras.constraints.UnitNorm(轴=0))(x)
x=LeakyReLU()(x)
x=BatchNormalization()(x)
预测=密集(num_类,激活='softmax')(x)
模型=模型(输入=基本模型。输入,输出=预测)
根据keras教程,在添加层之后加载权重并使用by_name=True

model.load_weights('/content/drive/MyDrive/MODELS_SAVED/model_RESNET152/model_weights.h5',by_name=True)
然后我又开始训练

model.compile(
损失=“稀疏”\u分类”\u交叉熵',
优化器=opt,
指标=['准确度']
)
模型拟合(
列车发电机,
验证\u数据=有效的\u生成器,
时代,
每个历元的步数=列长//批量大小,
验证步骤=长度/批量大小,
回调=[earlyStopping,reduce_lr]
)

但它的起始精度非常低,基本上又是从0开始的,所以我猜这里出了问题。有关如何解决此问题的任何想法?

当您使用adam并仅保存模型权重时-您还必须保存/加载优化器权重:

  weight_values = model.optimizer.get_weights()
  with open(output_path+'optimizer.pkl', 'wb') as f:
      pickle.dump(weight_values, f)

  dummy_input = tf.random.uniform(inp_shape) # create a tensor of input shape
  dummy_label = tf.random.uniform(label_shape) # create a tensor of label shape
  hist = model.fit(dummy_input, dummy_label)
  with open(path_to_saved_model+'optimizer.pkl', 'rb') as f:
      weight_values = pickle.load(f)
  optimizer.set_weights(weight_values)

也许你可以试试
base\u model.load\u weights(你的路径)
你用的是哪种优化器?@Andrey opt=tfa.optimizers.lazyadm(lr=0.000074)@BDouchet我现在正在尝试你的想法,大约一个小时后就会有结果,因为我还要运行Resnet几个时代才能确定它是否有效。用这个代码我保存了重量,对吗?所以我把这个代码放在model.save_weights()后面?。从这个pickle转储加载优化器权重的代码是什么?我从来没用过泡菜,对吗用open(“weight_values”,“rb”)作为f:weights=Pickle.load(f)Optimizer.set_weights(weights)```@JKnecht查看编辑过的答案谢谢,我想它现在可以工作了!!首先,我对resnet152进行了3个历次的训练,得到了损失:2.4604-准确度:0.4477…然后我保存并构建了新模型,它从历次1/3 114/3969开始[…]-ETA:27:02-损失:19.4842-准确度:0.2174…之前的精度是0。这个新的开始是合理的,对吗?如果其他任何人遇到此问题,我想补充一点,您也需要遵循BDouchets的建议,以使其工作,即设置基本模型。加载权重(您的路径),而不是模型。加载权重。@JKnecht精度应为0.44(除非您的精度太不稳定)。我更新了答案-在加载重量之前,尝试使用虚拟输入