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

输入层从深度学习模型的结构中消失

申屠飞
2023-03-14

我使用以下代码使用VGG16创建CNN模型,但创建模型后,模型的输入层从结构中消失(见图)。

为什么输入层会从结构中消失?

vgg16_model = keras.applications.vgg16.VGG16()
model = Sequential([])
 for layer in vgg16_model.layers[:-1]:
   model.add(layer)
   model.add(Dropout(0.5))
   model.add(Dense(2, activation='softmax', name = 'prediction'))

模型结构

共有2个答案

宫坚
2023-03-14

您需要显式添加InputLayer...

示例代码:

vgg16_model = keras.applications.vgg16.VGG16()
model = Sequential()
inp = InputLayer(input_shape=(224, 224, 3))
model.add(inp)

for layer in vgg16_model.layers[:-1]:
    model.add(layer)

for layer in model.layers:
    layer.trainable = False

model.add(Dense(2, activation='softmax'))
model.summary()

输出:

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 224, 224, 3)       0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928     
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 112, 112, 64)      0         
_________________________________________________________________
block2_conv1 (Conv2D)        (None, 112, 112, 128)     73856     
_________________________________________________________________
block2_conv2 (Conv2D)        (None, 112, 112, 128)     147584    
_________________________________________________________________
block2_pool (MaxPooling2D)   (None, 56, 56, 128)       0         
_________________________________________________________________
block3_conv1 (Conv2D)        (None, 56, 56, 256)       295168    
_________________________________________________________________
block3_conv2 (Conv2D)        (None, 56, 56, 256)       590080    
_________________________________________________________________
block3_conv3 (Conv2D)        (None, 56, 56, 256)       590080    
_________________________________________________________________
block3_pool (MaxPooling2D)   (None, 28, 28, 256)       0         
_________________________________________________________________
block4_conv1 (Conv2D)        (None, 28, 28, 512)       1180160   
_________________________________________________________________
block4_conv2 (Conv2D)        (None, 28, 28, 512)       2359808   
_________________________________________________________________
block4_conv3 (Conv2D)        (None, 28, 28, 512)       2359808   
_________________________________________________________________
block4_pool (MaxPooling2D)   (None, 14, 14, 512)       0         
_________________________________________________________________
block5_conv1 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_conv2 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_conv3 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0         
_________________________________________________________________
fc1 (Dense)                  (None, 4096)              102764544 
_________________________________________________________________
fc2 (Dense)                  (None, 4096)              16781312  
_________________________________________________________________
dense_1 (Dense)              (None, 2)                 8194      
=================================================================
Total params: 134,268,738
Trainable params: 8,194
Non-trainable params: 134,260,544
年烈
2023-03-14

当使用Sequential API时,这只是Keras模型表示的一个工件,它没有任何实际效果:Input层隐式存在,但它不被认为是正确的层,并且它不显示在model.summary()中。如果使用FunctionalAPI,它确实会显示出来。

考虑以下两个使用两个不同API编写的相同模型:

顺序API

from keras.models import Sequential
from keras.layers import Dense      # notice that we don't import Input here...

model_seq = Sequential([
    Dense(64, input_shape=(784,),activation='relu'),
    Dense(64, activation='relu'),
    Dense(10, activation='softmax')
])    

model_seq.summary()

# result:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 64)                50240     
_________________________________________________________________
dense_2 (Dense)              (None, 64)                4160      
_________________________________________________________________
dense_3 (Dense)              (None, 10)                650       
=================================================================
Total params: 55,050
Trainable params: 55,050
Non-trainable params: 0
_________________________________________________________________

功能API

from keras.models import Model
from keras.layers import Input, Dense  # explicitly import Input layer

inputs = Input(shape=(784,))
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)

model_func = Model(inputs=inputs, outputs=predictions)

model_func.summary()

    # result:

Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 784)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 64)                50240     
_________________________________________________________________
dense_2 (Dense)              (None, 64)                4160      
_________________________________________________________________
dense_3 (Dense)              (None, 10)                650       
=================================================================
Total params: 55,050
Trainable params: 55,050
Non-trainable params: 0
_________________________________________________________________

这两个模型是相同的;输入层没有在模型中明确显示这一事实。summary()当使用顺序API时,并不意味着与模型功能有关的任何内容。编辑:正如Daniel Möller在下面的评论中正确指出的那样,它甚至不是一个真正的层,除了定义输入形状之外什么都不做(请注意上面的model\u func.summary中的0训练参数)。

换句话说,不用担心。。。

这个相关的线程可能也很有用:Keras序列模型输入层

 类似资料:
  • 深度学习的总体来讲分三层,输入层,隐藏层和输出层。如下图: 但是中间的隐藏层可以是多层,所以叫深度神经网络,中间的隐藏层可以有多种形式,就构成了各种不同的神经网络模型。这部分主要介绍各种常见的神经网络层。在熟悉这些常见的层后,一个神经网络其实就是各种不同层的组合。后边介绍主要基于keras的文档进行组织介绍。

  • 本文向大家介绍深入学习JavaScript中的原型prototype,包括了深入学习JavaScript中的原型prototype的使用技巧和注意事项,需要的朋友参考一下 javascript 是一种 prototype based programming 的语言, 而与我们通常的 class based programming 有很大 的区别,我列举重要的几点如下: 1.函数是first cla

  • 主要内容 课程列表 专项课程学习 辅助课程 论文专区 课程列表 课程 机构 参考书 Notes等其他资料 卷积神经网络视觉识别 Stanford 暂无 链接 神经网络 Tweet 暂无 链接 深度学习用于自然语言处理 Stanford 暂无 链接 自然语言处理 Speech and Language Processing 链接 专项课程学习 下述的课程都是公认的最好的在线学习资料,侧重点不同,但推

  • Google Cloud Platform 推出了一个 Learn TensorFlow and deep learning, without a Ph.D. 的教程,介绍了如何基于 Tensorflow 实现 CNN 和 RNN,链接在 这里。 Youtube Slide1 Slide2 Sample Code

  • 我试图解决序列完成的问题。假设我们有基本真值序列(1,2,4,7,6,8,10,12,18,20) 我们模型的输入是一个不完整的序列。i、 e(1,2,4,10,12,18,20)。从这个不完整序列中,我们想要预测原始序列(地面真值序列)。哪些深度学习模型可以用来解决这个问题? 这是编码器-解码器LSTM体系结构的问题吗? 注:我们有数千个完整的序列来训练和测试模型。 感谢您的帮助。

  • 本文向大家介绍深度学习中的Batch Normalization?相关面试题,主要包含被问及深度学习中的Batch Normalization?时的应答技巧和注意事项,需要的朋友参考一下   答:BN就是在神经网络的训练过程中对每层的输入数据加一个标准化处理 传统的神经网络,只是在将样本x输入输入层之前对x进行标准化处理(减均值,除标准差),以降低样本间的差异性。BN是在此基础上,不仅仅只对输入层