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

时间:2018-08-21 09:22:55

标签: python tensorflow keras

我目前正在尝试从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

我是机器学习的新手,并不真正理解错误。我知道卷积/密集/池化层的作用,但是我不确定如何在模型中实际使用它们。

所以我的问题是:

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

  • 是否有人可以提出一些建议,以提高准确性,或者让我找到一些有关创建CNN模型的好教程?

编辑:

我在gpu上运行此代码,IMG_SIZE为32,批处理大小为32。除非我在模型中添加或移动图层,否则它运行良好。堆栈跟踪可以找到here。我知道它的内存分配错误,似乎与输入的形状有关。

1 个答案:

答案 0 :(得分:2)

您遇到错误

  

因2减去3而导致的负尺寸   输入形状为[?,256,2,2]的'conv2d_8 / convolution'(op:'Conv2D'),   [3,3,256,256]。

这可能与您的频道位置(最后一个或第一个频道)有关

最后尝试使用频道,替换:

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'))