代码之家  ›  专栏  ›  技术社区  ›  Oblomov

异常训练resnet50:“扁平化”输入的形状未完全定义”

  •  1
  • Oblomov  · 技术社区  · 7 年前

    我想用 keras.applications.resnet50 使用以下设置为两类问题训练resnet:

    from keras.layers import Dropout, Flatten, Dense
    from keras.applications.resnet50 import ResNet50
    from keras.models import Model
    
    resNet = ResNet50(include_top=False, weights=None)
    y = resNet.output
    y = Flatten()(y)
    y = Dense(2, activation='softmax')(y)
    model = Model(inputs=resNet.input, outputs=y)
    opt = keras.optimizers.Adam()
    model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
    epochs = 15
    model.fit(train_tensors, train_targets, 
              validation_data=(valid_tensors, valid_targets),
              epochs=epochs, batch_size=10, callbacks=[checkpointer], verbose=1)
    

    运行代码会抛出错误

    Exception: The shape of the input to "Flatten" is not fully defined 
    

    所以输出层的输入张量肯定有问题,在我的例子中,它是一个热编码向量,也就是一个大小为2的一维数组。我做错什么了?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Ioannis Nasios    7 年前

    你得到

    异常:“扁平化”输入的形状未完全定义

    因为您尚未在resnet网络中设置输入形状。尝试:

    resNet = ResNet50(include_top=False, weights=None, input_shape=(224, 224, 3)) 
    

    另外,由于在输出层中使用的是二元交叉熵和乙状结肠激活,因此应该只使用1个神经元而不是2个,如下所示:

    y = Dense(1, activation='sigmoid')(y)
    
        2
  •  1
  •   Pang Ajmal PraveeN    7 年前

    既然你在申请不 池(平均或最大) 对于resnet模型的输出,它提供的输出是一个4-d张量,传递给密集层。在密集层之前应用池是一个好主意,它将提取 动静脉畸形 最大值 上一层的每个特征,然后传递到密集层。另一个选项是,如果不想应用池层,则可以只应用 平坦() 层到resnet的输出,也可以将4-d张量转换为2-d张量,这是致密层所期望的。

    推荐文章