keras学习之:获取神经网络中间层的输出结果

本文介绍如何定义并训练一个简单的卷积神经网络(CNN),并详细展示了如何抽取CNN的中间层特征进行可视化,以便理解网络的学习过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 定义神经网络

这里定义了一个简单的 CNN 网络

import keras,os
from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPool2D, Flatten, Dropout
import numpy as np
from keras.models import Model

os.environ["CUDA_VISIBLE_DEVICES"] = "0"

def cnn():
    model = Sequential()
    model.add(Conv2D(input_shape=(28,28,1),filters=16,kernel_size=(3,3),padding='same',activation='relu',name='cov1')) 
    model.add(Conv2D(filters=32,kernel_size=(3,3),padding='same',activation='relu',name='cov2'))
    model.add(Conv2D(filters=64,kernel_size=(3,3),padding='same',activation='relu',name='cov3'))
    model.add(MaxPool2D(name='pool1'))
    model.add(Dropout(rate=0.3,name='drop1'))
    model.add(Conv2D(filters=128,kernel_size=(3,3),padding='same',activation='relu',name='cov4'))
    model.add(Conv2D(filters=256,kernel_size=(3,3),padding='same',activation='relu',name='cov5'))
    model.add(MaxPool2D(name='pool2'))
    model.add(Dropout(rate=0.3,name='drop2'))
    model.add(Flatten(name='flatten'))
    model.add(Dense(784,activation='relu',name='teacher_feature'))
    model.add(Dense(10,activation='softmax',name='softmax'))
    return model

2. 导入数据集

  • 这里使用 keras.datasets 里面自带的数据集 mnist
from keras.datasets import fashion_mnist,cifar10,cifar100
from keras.datasets import mnist
from keras.utils import to_categorical
import keras.optimizers
from keras.losses import categorical_crossentropy

(x_train,y_train),(x_test,y_test)= fashion_mnist.load_data()

x_train = x_train.reshape(60000,28,28,1)
x_test = x_test.reshape(10000,28,28,1)

y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

3. 训练网络

model = cnn()
opt = keras.optimizers.Adam(learning_rate=0.001)
callback = keras.callbacks.TensorBoard('./logs')
model.compile(optimizer=opt,metrics=['accuracy'],loss=keras.losses.categorical_crossentropy)
history = model.fit(x_train,y_train,batch_size=64,epochs=1,validation_data=(x_test,y_test),shuffle=True,callbacks=[callback])
print(model.summary())

在这里插入图片描述
在这里插入图片描述

4. 挑选中间层

三步走:

  • 挑选你想要可视化的层,假设我想要可视化的层是 cov1
  • 从原模型中 pick 出从 input 层到 cov1 的部分重新建立模型
  • 利用新建立的这个模型的 predict 接口,输出想要的中间层的输出结果
middle = Model(inputs=model.input,outputs=model.get_layer('cov1').output)
result = middle.predict(x_test)[0]
print(result.shape)

  • 这里通过 predict 之后会得到一个矩阵,这个矩阵就是我们得到的特征图
  • 下面我们以 cov1 的输出为例对他进行可视化
    在这里插入图片描述

5. 可视化中间层数据

import matplotlib.pyplot as plt
result = result[:,:,0]  # result-->(28,28,16) 取第一个来展示
plt.imshow(result)
plt.show()

在这里插入图片描述

6. 取 cov5 做整体演示,看一下深层特征,并附整体代码

import keras,os
from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPool2D, Flatten, Dropout
import numpy as np
from keras.models import Model

from keras.datasets import fashion_mnist,cifar10,cifar100
from keras.datasets import mnist
from keras.utils import to_categorical
import keras.optimizers
from keras.losses import categorical_crossentropy


os.environ["CUDA_VISIBLE_DEVICES"] = "0"

def cnn():
    model = Sequential()
    model.add(Conv2D(input_shape=(28,28,1),filters=16,kernel_size=(3,3),padding='same',activation='relu',name='cov1')) 
    model.add(Conv2D(filters=32,kernel_size=(3,3),padding='same',activation='relu',name='cov2'))
    model.add(Conv2D(filters=64,kernel_size=(3,3),padding='same',activation='relu',name='cov3'))
    model.add(MaxPool2D(name='pool1'))
    model.add(Dropout(rate=0.3,name='drop1'))
    model.add(Conv2D(filters=128,kernel_size=(3,3),padding='same',activation='relu',name='cov4'))
    model.add(Conv2D(filters=256,kernel_size=(3,3),padding='same',activation='relu',name='cov5'))
    model.add(MaxPool2D(name='pool2'))
    model.add(Dropout(rate=0.3,name='drop2'))
    model.add(Flatten(name='flatten'))
    model.add(Dense(784,activation='relu',name='teacher_feature'))
    model.add(Dense(10,activation='softmax',name='softmax'))
    return model


(x_train,y_train),(x_test,y_test)= fashion_mnist.load_data()

x_train = x_train.reshape(60000,28,28,1)
x_test = x_test.reshape(10000,28,28,1)

y_train = to_categorical(y_train)
y_test = to_categorical(y_test)


model = cnn()
opt = keras.optimizers.Adam(learning_rate=0.001)
callback = keras.callbacks.TensorBoard('./logs')
model.compile(optimizer=opt,metrics=['accuracy'],loss=keras.losses.categorical_crossentropy)
history = model.fit(x_train,y_train,batch_size=64,epochs=1,validation_data=(x_test,y_test),shuffle=True,callbacks=[callback])
print(model.summary())

middle = Model(inputs=model.input,outputs=model.get_layer('cov4').output)
result = middle.predict(x_test)[0]
print(result.shape)

for i in range(12):
    plt.subplot(4,3,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.imshow(result[:,:,i])
    plt.show()

在这里插入图片描述

  • 可以看出来 cov4 的图像明显更加抽象,而且有侧重点。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值