keras中中间激活的可视化:'History'对象没有属性'Model'

Visualisation of intermediate activations in keras: 'History' object has no attribute 'Model'

我有生成神经网络的函数:

def create_network(): 
  model = Sequential()

  model.add(Input(shape=(150,150,3)))
  model.add(Conv2D(32, kernel_size=3,strides=(1, 1),activation='relu'))
  model.add(MaxPooling2D(pool_size=(2, 2)))

  model.add(Flatten())
  model.add(Dense(512, activation='relu'))

  model.add(Dense(1, activation='relu'))

  model.compile(optimizer = 'rmsprop',
                   loss = 'binary_crossentropy', 
                   metrics = ['accuracy'])
  return model

然后我调用模型:

network = create_network()

然后我找到模型:

def fit_model(X_train, y_train, network=create_network()):
  model = network
  history = model.fit(X_train,
                      y_train,
                      epochs=2,
                      validation_data=(X_test, y_test),
                      batch_size=32,
                      verbose=2
                      )
  return history

并调用这个函数:

model = fit_model(X_train,y_train)

我想为随机图像可视化此模型中的中间激活(即每个中间激活中的每个通道)。

所以我有这个代码:

images = []
for img_path in glob.glob('test_image*.JPEG'):
    image1 = mpimg.imread(img_path)
    open_file = image1 / 255
    resize = cv2.resize(open_file,(150,150))
    print(resize.shape)
    images.append(resize)
  
plt.figure(figsize=(20,10))
columns = 5
for i, image in enumerate(images):
    plt.subplot(len(images) / columns + 1, columns, i + 1)
    plt.imshow(image)

print(network.summary())

layer_outputs = [layer.output for layer in model.layers[:]]
activation_model = model.Model(inputs=model.input, outputs=layer_outputs)
activations = activation_model.predict(np.expand_dims(images[0]), axis=0)

当我 运行 出现这个错误时:

'History' object has no attribute 'layers'

然后我想好吧,我打算 运行 在网络架构上使用层本身,而不是适合的模型,所以我将最后三行更改为:

layer_outputs = [layer.output for layer in network.layers[:]]
activation_model = network.Model(inputs=network.input, outputs=layer_outputs)
activations = activation_model.predict(np.expand_dims(images[0]), axis=0)

然后我得到:

AttributeError: 'Sequential' object has no attribute 'Model'

然后我想也许最初我应该在层中读入 layer_outputs,但随后在 activation_model:

中使用模型
layer_outputs = [layer.output for layer in network.layers[:]]
activation_model = model.Model(inputs=model.input, outputs=layer_outputs)
activations = activation_model.predict(np.expand_dims(images[0]), axis=0)

但我得到:

'History' object has no attribute 'Model'

有人可以告诉我哪里出了问题以可视化我的中间激活吗?

问题是 model.fit 实际上 returns 一个历史对象而不是你的模型本身。检查 docs:

A History object. Its History.history attribute is a record of training loss values and metrics values at successive epochs, as well as validation loss values and validation metrics values

它没有任何图层等。试试这样的东西:

import tensorflow as tf

def create_network(): 
  model = tf.keras.Sequential()
  model.add(tf.keras.layers.Conv2D(32, kernel_size=3,strides=(1, 1),activation='relu'))
  model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2)))

  model.add(tf.keras.layers.Flatten())
  model.add(tf.keras.layers.Dense(512, activation='relu'))

  model.add(tf.keras.layers.Dense(1, activation='relu'))

  model.compile(optimizer = 'rmsprop',
                   loss = 'binary_crossentropy', 
                   metrics = ['accuracy'])
  return model


def fit_model(network=create_network()):
  model = network
  history = model.fit(tf.random.normal((50, 150, 150, 3)),
                      tf.random.normal((50, 1)),
                      epochs=2,
                      validation_data=(tf.random.normal((50, 150, 150, 3)), tf.random.normal((50, 1))),
                      batch_size=32,
                      verbose=2
                      )
  return history, model

history, model = fit_model()
layer_outputs = [layer.output for layer in model.layers[:]]
activation_model = tf.keras.Model(inputs=model.input, outputs=layer_outputs)
activations = activation_model.predict(tf.random.normal((1, 150, 150, 3)))