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

交通标志分类-分配形状为[]和类型为float的张量时的OOM

  •  2
  • kocica  · 技术社区  · 6 年前

    我正在尝试从这个改进算法 tutorial . 更具体地说是CNN模型的层次。

    def cnn_model():
        model = Sequential()
    
        model.add(Conv2D(32, (3, 3), padding='same',
                         input_shape=(3, IMG_SIZE, IMG_SIZE),
                         activation='relu'))
        model.add(Conv2D(32, (3, 3), activation='relu'))
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Dropout(0.2))
    
        model.add(Conv2D(64, (3, 3), padding='same',
                         activation='relu'))
        model.add(Conv2D(64, (3, 3), activation='relu'))
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Dropout(0.2))
    
        ########### The problem occurs when this is removed ############
        model.add(Conv2D(128, (3, 3), padding='same',
                         activation='relu'))
        model.add(Conv2D(128, (3, 3), activation='relu'))
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Dropout(0.2))
        ################################################################
    
        model.add(Flatten())
        model.add(Dense(512, activation='relu'))
        model.add(Dropout(0.5))
        model.add(Dense(NUM_CLASSES, activation='softmax'))
        return model
    

    分配形状为[]且类型为float的张量时的OOM

    所以我的问题是:

    • 为什么我会犯这样的错误?

    编辑:

    Iam在gpu上运行此命令,IMG U大小为32,批处理大小为32。除非我在模型中添加或删除层,否则运行正常。可以找到堆栈跟踪 here . 我知道它的内存分配错误,这似乎与输入的形状有关。

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

    你有个错误

    从2减去3导致的负尺寸 [33256256]。

    最后尝试频道,替换:

    model.add(Conv2D(32, (3, 3), padding='same',
                     input_shape=(3, IMG_SIZE, IMG_SIZE),
                     activation='relu'))
    

    model.add(Conv2D(32, (3, 3), padding='same',
                     input_shape=(IMG_SIZE, IMG_SIZE, 3),
                     activation='relu'))