使用 Colab GPU 时出错,而 CPU 则没有

Posted

技术标签:

【中文标题】使用 Colab GPU 时出错,而 CPU 则没有【英文标题】:Error using Colab GPU, while none with CPU 【发布时间】:2019-11-10 08:05:46 【问题描述】:

我正在 Google Colab 中尝试一些代码。 使用 CPU 可以正常工作,但是当我切换到 GPU 时,它会显示错误。

自包含代码:

import numpy as np
import tensorflow as tf
import keras
from keras.layers import Input, BatchNormalization, Activation
from keras.layers import ZeroPadding2D, MaxPooling2D, Dense
from keras.layers import Reshape, Add, Dropout
from keras.layers import Conv2D
from keras.layers import Conv3DTranspose, Conv2DTranspose
from keras.initializers import VarianceScaling
from keras.models import Model
from keras.regularizers import l2
from keras.optimizers import SGD
import sys

# hyperparameters
BATCH_NORM_MOMENTUM = 0.1
BATCH_NORM_EPS = 1e-5
KERNEL_REGULARIZER = 0.0001
batchSize = 4

sgd = SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)


def step1(input_shape = (3, 256, 256)):

    step = 'step1_'
    X_input = Input(input_shape, name = step + 'input')

    X = Conv2D(64, (7, 7), strides = (2, 2),  padding='same', data_format = 'channels_first', kernel_initializer="he_normal",kernel_regularizer=l2(KERNEL_REGULARIZER), name = step+'b1_conv_a',)(X_input)
    X = BatchNormalization(axis = 1, momentum=BATCH_NORM_MOMENTUM, epsilon = BATCH_NORM_EPS, name = step+'b1_bn_a')(X)
    X = Activation('relu', name = step+'b1_act_a')(X)
    X = MaxPooling2D((3, 3), strides=(2, 2), data_format='channels_first', padding='same', name = step + 'b1_maxpool2d_a')(X)
    print(X.shape)
    model = Model(inputs = X_input, outputs = X, name='step1')

    return model

step1Model = step1((3,256,256))

错误:

ValueError: Shape must be rank 1 but is rank 0 for 'step1_b1_bn_a/cond/Reshape_4' (op: 'Reshape') with input shapes: [1,64,1,1], [].

为什么使用 CPU 和 GPU 会有这种区别?

【问题讨论】:

【参考方案1】:

这可能分别与 CPU 和 GPU 内核上的 tensorflowtensorflow-gpu 包有关。

您可以绕过它,但从BatchNormalization layer 中删除axis=1

改变:

X = BatchNormalization(axis = 1, momentum=BATCH_NORM_MOMENTUM, epsilon = BATCH_NORM_EPS, name = step+'b1_bn_a')(X)

到:

X = BatchNormalization(momentum=BATCH_NORM_MOMENTUM, epsilon = BATCH_NORM_EPS, name = step+'b1_bn_a')(X)

【讨论】:

非常感谢,不再报错!您是否知道删除 axis=1 是否有其他含义?或者您是否知道任何可以检查 CPU 和 GPU 版本之间所有这些差异的文档? 对不起@Blueko,我不知道任何文档。我认为删除 axis=1 没有其他含义,但我不是 100% 确定。

以上是关于使用 Colab GPU 时出错,而 CPU 则没有的主要内容,如果未能解决你的问题,请参考以下文章

仅使用 Colab Pro 的 GPU

在 colab 中使用 keras_to_tpu_model 时,TPU 运行速度与 CPU 一样慢

Colab-免费GPU算力

Colab-免费GPU算力

如何启用英特尔 iRIS Xe GPU 进行深度学习?

为啥我的 colab 笔记本不使用 GPU?