【问题标题】:Traffic sign classification - OOM when allocating tensor of shape [] and type float交通标志分类 - 分配 shape [] 和类型 float 的张量时的 OOM
【发布时间】:2019-01-27 10:54:59
【问题描述】:

我目前正在尝试从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 找到堆栈跟踪。我知道它的内存分配错误,它似乎与输入的形状有关。

【问题讨论】:

  • 您的 IMG_SIZE 是多少,批量大小以及您是否使用 gpu?
  • 您能否提供一个导致错误的代码更改示例?
  • 这是内存分配错误。能否请您也发布回溯。
  • 问题已编辑。 @SashaTsukanov 例如,我删除了第三个卷积层,就会发生这种情况。

标签: python tensorflow keras


【解决方案1】:

你有一个错误

由 2 减去 3 导致的负维度大小 'conv2d_8/convolution' (op: 'Conv2D') 输入形状:[?,256,2,2], [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'))

【讨论】:

  • 你是对的,但我还必须设置data_format="channels_last",即使在文档中默认为channels_last
  • @FilipKočica 您可以在keras.json文件stackoverflow.com/a/43833679/7541374中调整您的默认频道位置
猜你喜欢
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多