我目前正在尝试从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。我知道它的内存分配错误,似乎与输入的形状有关。
答案 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'))