我想“损坏”一个经过训练的keras网络层,看看这个单层的损坏如何影响网络的性能。 所以基本上我想:
1)负荷训练网络
2)调用目标层并初始化其权重,将其放回网络中
3)计算网络精度
我使用DenseNet201模型在Keras在谷歌Colab与TensorFlow后端
import tensorflow as tf
import pandas as pd
import numpy as np
from keras.applications.densenet import DenseNet201
from keras.preprocessing import image
from keras.applications.inception_v3 import preprocess_input, decode_predictions
from keras.models import Model
from keras.callbacks import ReduceLROnPlateau, ModelCheckpoint
from keras.optimizers import Adam, SGD
from google.colab import drive
drive.mount('/content/gdrive')
from keras.models import load_model
model=load_model('/content/gdrive/My Drive/dense.h5')
adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=True)
model.compile(optimizer=adam, loss='binary_crossentropy', metrics=['accuracy'])
for layer in model.layers:
print(layer.name)
model.layers[conv1/conv].set_weights( keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None))
所以,我打印出图层的名称,然后将这些名称精确地输入到集合权重中,但是每次我都会得到这个名称错误
NameError Traceback (most recent call >last) in () ----> 1 model.layers[conv1/conv].set_weights( >keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None))
NameError: name 'conv1' is not defined
我认为有三个问题:
model.get_layer(layer_name)
代替model.layers[layer_name]
。在conv1/conv
周围加上引号,像这样'conv1/conv'
使其成为一个字符串(层的名称)。之所以会出现错误,是因为不带引号的conv1
和{layers.set_weights
expects a list of numpy array,但您传递给它一个RandomNormal
对象。您可以使用^{[]
,它必须是一个列表),在这里您必须首先通过proper_shape = model.get_layer('conv1/conv').get_weights()[0].shape
来确定层权重矩阵的正确形状。在相关问题 更多 >
编程相关推荐