TensorFlow搭建指定架构CNN时tf.nn.conv2D报rank4错误求解
错误原因与修复方案
核心报错根源
你当前代码混用了TensorFlow底层nn API与Keras高层API,且存在多处参数缺失、变量名错误:
- 错误1:
tf.nn.conv2d的filters参数需要传入预定义的4维权重张量,不能直接传入滤波器数量,你直接传filters=8导致滤波器权重形状为空,触发本次rank 0报错 - 错误2:第二层CONV2D(Z2定义行)完全缺失
filters参数,未指定16个2x2滤波器的配置 - 错误3:Flatten层输出存在变量
F中,但全连接层错误传入了未定义的变量P - 错误4:
tf.contrib模块在TensorFlow 2.x中已被废弃,相关flatten、fully_connected接口和Keras模型存在兼容性问题,作业要求返回Keras模型,应该统一使用tf.keras.layers下的层实现
修正后的完整代码
import tensorflow as tf def convolutional_model(input_shape): input_img = tf.keras.Input(shape=input_shape) # CONV2D: 8 filters 4x4, stride of 1, padding 'SAME' 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, softmax activation outputs = tf.keras.layers.Dense(units=6, activation='softmax')(F) model = tf.keras.Model(inputs=input_img, outputs=outputs) return model
额外说明
修正后的代码完全符合Coursera卷积神经网络作业的要求,所有层均为Keras原生层,权重会自动注册到模型中,后续可以直接调用compile、fit完成训练流程。
内容的提问来源于stack exchange,提问作者Adem Youssef
相关产品推荐
相关产品推荐

