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

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 的图像明显更加抽象,而且有侧重点。
  • 23
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
卷积神经网络(Convolutional Neural Network,CNN)是一种可以有效地处理图像的深度学习模型,其主要的特点是引入了卷积层和池化层。其中,卷积层可以通过卷积核在图像上滑动并提取图像的特征,而池化层则可以通过降采样的方式减少特征图的尺寸,从而进一步减小模型的参数量。因此,卷积神经网络非常适合用于图像分类、目标检测和图像分割等任务。 在卷积神经网络中,一般会使用多个卷积层和池化层来提取图像的特征。具体而言,卷积层可以通过不同的卷积核来提取图像的不同特征,如边缘、纹理和形状等。而池化层则可以通过将特征图中的像素值进行平均或最大池化来减小特征图的尺寸,从而提高模型的计算效率。 在卷积神经网络中,一般会使用预训练的卷积神经网络来提取图像的特征。这些预训练的模型已经在大规模图像数据集上进行了训练,可以很好地提取图像的高层次特征,如物体的形状、大小和颜色等。常用的预训练模型包括VGG、ResNet和Inception等。 在使用卷积神经网络提取图像特征时,可以将图像输入到卷积神经网络中,并获取卷积层或池化层的输出特征。这些输出特征可以被用来进行后续的图像分类、目标检测和图像分割等任务。另外,也可以使用卷积神经网络中间层输出特征来进行特征可视化和图像生成等任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

暖仔会飞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值