Инициализируйте один слой обученной сети keras и получите прогнозы - PullRequest
0 голосов
/ 14 января 2019

Я хочу «повредить» слой обученной сети keras, чтобы увидеть, как повреждение этого единственного слоя влияет на производительность сети. В общем, я хочу:

1) загруженная обученная сеть

2) вызвать целевой слой и инициализировать его веса, вернуть его обратно в сеть

3) рассчитать точность сети

Я использую модель DenseNet201 в Keras в Google 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))

Итак, я печатаю названия слоев, а затем вводю именно эти имена в set_weights, но каждый раз, когда я получаю эту NameError

NameError Traceback (последний вызов> последний) в () ----> 1 model.layers [conv1 / conv] .set_weights (> keras.initializers.RandomNormal (среднее значение = 0,0, стандартное отклонение = 0,05, начальное число = нет))

NameError: имя 'conv1' не определено

1 Ответ

0 голосов
/ 14 января 2019

Три проблемы, которые я вижу:

  1. Используйте model.get_layer(layer_name) вместо model.layers[layer_name].
  2. Поместите кавычки вокруг conv1/conv примерно так 'conv1/conv', чтобы сделать его строкой (название слоя). Вы получаете ошибку, потому что без кавычек conv1 и conv считаются переменными (или любым другим объектом python), но вам нужна строка здесь.
  3. layers.set_weights ожидает список массива numpy , но вы передаете ему объект RandomNormal. Вместо этого вы можете использовать [np.random.normal(loc=0.0, scale=0.05, size=proper_shape)] (обратите внимание на [], это должен быть список), где вы должны определить правильную форму весовой матрицы слоя с помощью сначала proper_shape = model.get_layer('conv1/conv').get_weights()[0].shape.
...