我想可视化 CNN 中给定特征图所学的模式(在本例中,我使用的是 vgg16)。为此,我创建了一个随机图像,通过网络馈送到所需的卷积层,选择特征图并找到相对于输入的梯度。这个想法是以这样一种方式改变输入,以最大化所需特征图的激活。使用 tensorflow 2.0 我有一个 GradientTape 跟随函数然后计算梯度,但是梯度返回 None,为什么它无法计算梯度?
import tensorflow as tf
import matplotlib.pyplot as plt
import time
import numpy as np
from tensorflow.keras.applications import vgg16
class maxFeatureMap():
def __init__(self, model):
self.model = model
self.optimizer = tf.keras.optimizers.Adam()
def getNumLayers(self, layer_name):
for layer in self.model.layers:
if layer.name == layer_name:
weights = layer.get_weights()
num = weights[1].shape[0]
return ("There are {} feature maps in {}".format(num, layer_name))
def getGradient(self, layer, feature_map):
pic = vgg16.preprocess_input(np.random.uniform(size=(1,96,96,3))) ## Creates values between 0 and 1
pic …Run Code Online (Sandbox Code Playgroud) 我正在尝试在包含名人面孔的图像数据集上训练一个基本的 CNN,其中分配的类对应于每个人。鉴于大约有 10,000 个类,我使用了 sparse_categorical_crossentropy 而不是 one-hot 编码类,但是一旦网络开始训练,损失就停留在一个数字上,并且在几批之后变为 NaN 我尝试了不同的图像缩放和一个较小的网络,但没有运气。关于什么可能导致 NaN 的任何线索?
生成批次的函数:
def Generator(data, label, batch_size):
url = "../input/celeba-dataset/img_align_celeba/img_align_celeba/"
INPUT_SHAPE = (109, 109)
i = 0
while True:
image_batch = [ ]
label_batch = [ ]
for b in range(batch_size):
if i == len(data):
i = 0
data, label = shuffle(data, label)
sample = data[i]
label_batch.append(label[i])
i += 1
image = cv2.resize(cv2.imread(url + sample), INPUT_SHAPE)
image_batch.append((image.astype(float)) / 255)
yield (np.array(image_batch), np.array(label_batch))
Run Code Online (Sandbox Code Playgroud)
该模型:
class CNN():
def __init__(self, train, val, y_train, …Run Code Online (Sandbox Code Playgroud)