初始化经过训练的keras网络的单层并获得预测

时间:2019-01-14 12:57:22

标签: python keras neural-network conv-neural-network

我想“损坏”经过训练的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'未定义

1 个答案:

答案 0 :(得分:0)

我看到三个问题:

  1. 使用model.get_layer(layer_name)代替model.layers[layer_name]
  2. 像这样conv1/conv那样在'conv1/conv'周围加上引号,使其成为字符串(图层名称)。之所以会出现错误,是因为没有引号的conv1conv被认为是变量(或任何其他python对象),但是这里需要一个字符串。
  3. 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确定图层权重矩阵的正确形状。