当前位置: 首页 > 知识库问答 >
问题:

向Keras/TensorFlow CNN致密层中添加变量

严瑞
2023-03-14

我想知道是否有可能在卷积神经网络的密集层中添加一个变量(以及之前卷积层的连接,是否有额外的特征集可用于区分目的)?如果可能的话,有人能给我举个例子/文档来解释如何做到这一点吗?

我希望使用Keras,但如果Keras限制太多,我很乐意使用TensorFlow。

编辑:在这种情况下,我认为这应该起作用的方式是我向神经网络提供一个包含图像和相关特征集的列表(以及在训练相关分类期间)。

EDIT2:我想要的架构类似于:

              ___________      _________      _________      _________     ________    ______
              | Conv    |     | Max    |     | Conv    |     | Max    |    |       |   |     |
    Image --> | Layer 1 | --> | Pool 1 | --> | Layer 2 | --> | Pool 2 | -->|       |   |     |
              |_________|     |________|     |_________|     |________|    | Dense |   | Out |
                                                                           | Layer |-->|_____|
   Other      ------------------------------------------------------------>|       |
   Data                                                                    |       |
                                                                           |_______|

共有2个答案

龙兴学
2023-03-14

好的,假设您有convoluton_model,您可以通过以下方式执行此操作:

convolution_model = Flatten()(convolution_model) # if it wasn't flattened before
static_features_input = Input(shape=(static_features_size,))
blended_features = merge([convolution_model, static_features_input], mode='concat')
... here you are defining a blending model with blended features as input

在这里,您可以找到一个关于如何合并不同输入的示例。

伊温书
2023-03-14

实际上,正如@Marcin所说,您可以使用合并层。

我建议您为此使用Functional API。如果你不熟悉它,请阅读这里的一些文档。

这是您使用keras API涂鸦的网络模型:

from keras.layers.core import *
from keras.models import Model

# this is your image input definition. You have to specify a shape. 
image_input = Input(shape=(32,32,3))
# Some more data input with 10 features (eg.)
other_data_input = Input(shape=(10,))    

# First convolution filled with random parameters for the example
conv1 = Convolution2D(nb_filter = nb_filter1, nb_row = nb_row1, nb_col=_nb_col1, padding = "same", activation = "tanh")(image_input)
# MaxPool it 
conv1 = MaxPooling2D(pool_size=(pool_1,pool_2))(conv1)
# Second Convolution
conv2 = Convolution2D(nb_filter = nb_filter2, nb_row = nb_row2, nb_col=_nb_col2, padding = "same", activation = "tanh")(conv1)
# MaxPool it
conv2  = MaxPooling2D(pool_size=(pool_1,pool_2))(conv2)
# Flatten the output to enable the merge to happen with the other input
first_part_output = Flatten()(conv2)

# Merge the output of the convNet with your added features by concatenation
merged_model = keras.layers.concatenate([first_part_output, other_data_input])

# Predict on the output (say you want a binary classification)
predictions = Dense(1, activation ='sigmoid')(merged_model)

# Now create the model
model = Model(inputs=[image_input, other_data_input], outputs=predictions)
# see your model 
model.summary()

# compile it
model.compile(optimizer='adamax', loss='binary_crossentropy')

就这样:)最后很容易,定义您想要多少输入和输出,只需在创建Model对象时在列表中指定它们。当您适合它时,也可以在列表中单独提供它们。

 类似资料:
  • 在keras中。应用程序中,有一个VGG16模型在imagenet上预先培训过。 该模型具有以下结构。 我想用密集层(fc1、fc2和预测)之间的缺失层微调此模型,同时保持模型的所有预训练权重不变。我知道可以使用

  • 我做了一个小的概念验证,以了解Keras中的致密层是否支持掩蔽。下面是我的代码:- 我的数据集仅包含2个样本,每个样本具有125个特征,如下所示:- 使用掩码层,我希望密集层在训练网络时忽略所有“-1”值。因此我编写了。 我还访问了Keras Github代码(https://github.com/keras-team/keras/blob/master/keras/layers/core.py)

  • 我想做一些类似于完全卷积网络的论文(https://people.eecs.berkeley.edu/~jonlong/long\u shelhamer\u fcn。pdf)使用Keras。我有一个网络,它最终将要素地图展平,并将其穿过几个密集的图层。我想将权重从这样的网络加载到一个网络中,在这个网络中,密集层被等效卷积所取代。 Keras附带的VGG16网络可以作为一个示例,其中最后一个MaxP

  • 我开始学习RNN,并尝试在Keras中实现SimpleRNN。这是我的代码: 系统抛出以下错误: 回溯(最后一次调用):模型中第1行的文件“”。添加(SimpleRN(32))文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/keras/engine/sequential.py”,第18

  • 一直在尝试在Keras中制作神经网络,但遇到了一个问题,即我的一个密集层和激活层之间存在形状不匹配。我错过了一些明显的东西吗?使用Tensorflow后端。 那么我的模型如下: 但我得到以下错误: 该错误似乎源自使用sigmoid激活输入到第二激活层。例如: 为什么会出现不匹配?

  • 我需要向现有模型添加层。然而,我需要在“主模型级别”添加层,也就是说,我不能使用经典的函数方法。例如,如果我使用以下内容: 我获得: 因此,我获得了一个带有嵌套子模型的模型。相反,我将嵌套子模型的层(移动网)“添加”到新的顶层(即在reshape_4之后)。我尝试使用: 它适用于简单的顺序模型(如vgg、mobilenet),但对于连接不严格顺序的更复杂模型(如inception、resnet),