土小夫 2019-10-28 15:53 采纳率: 50%
浏览 1034
已结题

如何利用Keras的函数式模型搭建一个局部连接的卷积神经网络模型?

最近在学习卷积神经网络模型,在对CNN鼻祖LeNet5进行构建时遇到了如下问题:

首先有这样一个连接模式:
图片说明

需要由S2层的6个特征图谱生成C3层的16个特征图谱,但这16个map并不都是与上一层进行全连接卷积求和得到的
例如C3的map1只与S2的map1,2,3进行局部连接,卷积求和在加上一个bias就得到了C3的第一个特征图谱
那么这样的连接模式怎么使用Keras来表示呢?

首先考虑最简单的序贯模型,发现并没有相关的API可以用来指定上一层的某一部分特征图作为一下层的输入(也许是我没发现),然后考虑函数式模型:

import keras
from keras.layers import Conv2D, MaxPooling2D, Input, Dense, Flatten
from keras.models import Model

input_LeNet5=Input(shape=(32,32,1))
c1=Conv2D(6,(5,5))(input_LeNet5)
s2=MaxPooling2D((2,2))(c1)
print(np.shape(s2))

这里我搭建出了LeNet5的前两层,并打印出了S2的形状,是一个(?,14,14,6)的张量,这里的6显然就是代表了S2中6张不同的map

TensorShape([Dimension(None), Dimension(14), Dimension(14), Dimension(6)])

那么是不是就可以考虑对张量的最后一维进行切片,如下,将S21作为c31的输入,代码是可以编译通过的

s21=s2[:,:,:,0:3]
c31=Conv2D(1,(5,5))(S21)

但是最后调用Model对整个模型进行编译时就出错了

model = Model(inputs=input_LeNet5, outputs=C31)
AttributeError: 'NoneType' object has no attribute '_inbound_nodes'

经过测试发现只要是对上一层的输入进行切片就会出现这样的问题,猜测是切片使得S21丢失了S2的数据类型以及属性
看了很多别人搭建的模型也没有涉及这一操作的,keras文档也没有相关描述。
特来请教有没有大牛搭建过类似的模型,不用keras也行

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-10-28 21:09
    关注

    keras的functional模式可以实现自定义多个网络和连接,但是写起来就不如直接用tensorflow简单了。

    评论

报告相同问题?

悬赏问题

  • ¥15 lammps Gpu加速出错
  • ¥15 关于PLUS模型中kapaa值的问题
  • ¥15 关于博途V17进行仿真时无法建立连接问题
  • ¥15 机器学习教材中的例题询问
  • ¥15 求.net core 几款免费的pdf编辑器
  • ¥15 为什么安装HCL 和virtualbox之后没有找到VirtualBoxHost-OnlyNetWork?
  • ¥15 C# P/Invoke的效率问题
  • ¥20 thinkphp适配人大金仓问题
  • ¥20 Oracle替换.dbf文件后无法连接,如何解决?(相关搜索:数据库|死循环)
  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号