【问题标题】:ValueError: Shape must be rank 4 but is rank 0 for '{{node Conv2D_5}} , tf.nn.conv2dValueError:形状必须为 4 级,但对于 '{{node Conv2D_5}} 为 0 级,tf.nn.conv2d
【发布时间】:2021-11-21 16:05:21
【问题描述】:

我想构建一个具有以下架构的卷积模型:
CONV2D -> RELU -> MAXPOOL -> CONV2D -> RELU -> MAXPOOL -> 展平 -> DENSE
参数:
input_img -- 输入数据集,形状 (input_shape)

Returns:
model -- TF Keras model (object containing the information for the entire training process)  

所以这是我到目前为止所做的代码:

def convolutional_model(input_shape):

    input_img = tf.keras.Input(shape=input_shape)
    ## CONV2D: 8 filters 4x4, stride of 1, padding 'SAME'
    Z1 = tf.nn.conv2d(input_img,filters=8 ,strides=[1, 1, 1, 1], padding='SAME')
    ## RELU
    A1 = tf.nn.relu(Z1)
    ## MAXPOOL: window 8x8, stride 8, padding 'SAME'
    P1 = tf.nn.max_pool(A1, ksize = [1, 8, 8, 1], strides = [1, 8, 8, 1], padding='SAME')
    ## CONV2D: 16 filters 2x2, stride 1, padding 'SAME'
    Z2 = tf.nn.conv2d(P1, strides=[1, 1, 1, 1], padding='SAME')
    ## RELU
    A2 = tf.nn.relu(Z2)
    ## MAXPOOL: window 4x4, stride 4, padding 'SAME'
    P2 = tf.nn.max_pool(A2, ksize = [1, 4, 4, 1], strides = [1, 4, 4, 1], padding='SAME')
    ## FLATTEN
    F = tf.contrib.layers.flatten(P2)
    ## Dense layer
    ## 6 neurons in output layer. Hint: one of the arguments should be "activation='softmax'" 
    outputs = tf.contrib.layers.fully_connected(P, 6, activation_fn='softmax')

    model = tf.keras.Model(inputs=input_img, outputs=outputs)
    return model

我收到以下错误:

ValueError: Shape must be rank 4 but is rank 0 for '{{node Conv2D_5}} = Conv2D[T=DT_FLOAT, data_format="NHWC", dilations=[1, 1, 1, 1], explicit_paddings=[], padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true](input_10, Conv2D_5/filter)' with input shapes: [?,64,64,3], [].

有人可以帮忙吗? 如果我的代码中有任何其他错误,请对它们发表评论,我一直在为 Coursera Deeplearning 规范课程上的这项作业而苦苦挣扎

【问题讨论】:

    标签: python tensorflow keras conv-neural-network


    【解决方案1】:
    Z1 = tf.keras.layers.Conv2D(filters = 8,kernel_size= (4,4), strides=(1,1), padding='SAME')(input_img)
    ## RELU
    A1 = tf.keras.layers.ReLU()(Z1)
    ## MAXPOOL: window 8x8, stride 8, padding 'SAME'
    P1 = tf.keras.layers.MaxPool2D(pool_size=(8,8), strides =(8,8), padding='SAME')(A1)
    ## CONV2D: 16 filters 2x2, stride 1, padding 'SAME'
    Z2 = tf.keras.layers.Conv2D(filters = 16,kernel_size= (2,2),strides =(1,1), padding='SAME')(P1)
    ## RELU
    A2 = tf.keras.layers.ReLU()(Z2)
    ## MAXPOOL: window 4x4, stride 4, padding 'SAME'
    P2 = tf.keras.layers.MaxPool2D(pool_size=(4,4), strides =(4,4), padding='SAME')(A2)
    ## FLATTEN
    F = tf.keras.layers.Flatten()(P2)
    ## Dense layer
    ## 6 neurons in output layer. Hint: one of the arguments should be "activation='softmax'" 
    outputs = tf.keras.layers.Dense(units = 6, activation = 'softmax')(F)
    

    效果不错,你可以试试。

    【讨论】:

      【解决方案2】:

      tf.keras.Input(shape=(...)) 创建一个符号张量,它允许我们仅通过知道模型的输入和输出来创建模型。所以它是张量的占位符(但它本身不是张量)。 tf.nn.conv2d(input) 对给定的输入执行卷积。它不是模型层(不可训练),只是一个功能。因此,当向tf.nn.conv2d() 提供符号张量(占位符)作为输入时,它会抛出错误。

      如果您尝试构建模型,请使用tf.keras.layers.Conv2D()

      请参阅 tf.keras.Input https://www.tensorflow.org/api_docs/python/tf/keras/Input 的 tensorflow 文档

      请参阅 tf.nn.conv2d 的 tensorflow 文档 https://www.tensorflow.org/api_docs/python/tf/nn/conv2d

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-17
        • 1970-01-01
        • 1970-01-01
        • 2019-05-10
        • 1970-01-01
        • 2018-05-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多