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)))
我有生成神经网络的函数:
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)))