我想“损坏”经过训练的keras网络的这一层,以查看对该单层的损害如何影响网络的性能。 所以基本上我想:
1)加载训练有素的网络
2)调用目标层并初始化其权重,然后将其放回网络内部
3)计算网络准确性
我正在使用带有TensorFlow后端的Google Colab在Keras中使用DenseNet201模型
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))
所以,我要打印出图层的名称,而不是将这些名称准确地输入到set_weights中,但是每次得到此NameError时
NameError跟踪(最近的呼叫>最近) 在()中 ----> 1个model.layers [conv1 / conv] .set_weights(> keras.initializers.RandomNormal(mean = 0.0,stddev = 0.05,seed = None))
NameError:名称'conv1'未定义
答案 0 :(得分:0)
我看到三个问题:
model.get_layer(layer_name)
代替model.layers[layer_name]
。 conv1/conv
那样在'conv1/conv'
周围加上引号,使其成为字符串(图层名称)。之所以会出现错误,是因为没有引号的conv1
和conv
被认为是变量(或任何其他python对象),但是这里需要一个字符串。layers.set_weights
expects a list of numpy array,但是您将其传递给RandomNormal
对象。您可以改用[np.random.normal(loc=0.0, scale=0.05, size=proper_shape)]
(注意[]
,它必须是一个列表),在这里您必须首先通过proper_shape = model.get_layer('conv1/conv').get_weights()[0].shape
确定图层权重矩阵的正确形状。