这是我的尝试:
inputs = Input(shape=(config.N_FRAMES_IN_SEQUENCE, config.IMAGE_H, config.IMAGE_W, config.N_CHANNELS))def cnn_model(inputs): x = Conv2D(filters=32, kernel_size=(3,3), padding='same', activation='relu')(inputs) x = MaxPooling2D(pool_size=(2, 2))(x) x = Conv2D(filters=32, kernel_size=(3,3), padding='same', activation='relu')(x) x = MaxPooling2D(pool_size=(2, 2))(x) x = Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu')(x) x = MaxPooling2D(pool_size=(2, 2))(x) x = Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu')(x) x = MaxPooling2D(pool_size=(2, 2))(x) x = Conv2D(filters=128, kernel_size=(3,3), padding='same', activation='relu')(x) x = MaxPooling2D(pool_size=(2, 2))(x) return xx = TimeDistributed(cnn_model)(inputs)
这导致了以下错误:
AttributeError: 'function' object has no attribute 'built'
回答:
你需要使用Lambda
层,并将你的函数包装在其中:
# cnn_model函数和你定义的一样...x = TimeDistributed(Lambda(cnn_model))(inputs)
或者,你可以将那个块定义为一个模型,然后在其上应用TimeDistributed
层:
def cnn_model(): input_frame = Input(shape=(config.IMAGE_H, config.IMAGE_W, config.N_CHANNELS)) x = Conv2D(filters=32, kernel_size=(3,3), padding='same', activation='relu')(input_frame) x = MaxPooling2D(pool_size=(2, 2))(x) x = Conv2D(filters=32, kernel_size=(3,3), padding='same', activation='relu')(x) x = MaxPooling2D(pool_size=(2, 2))(x) x = Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu')(x) x = MaxPooling2D(pool_size=(2, 2))(x) x = Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu')(x) x = MaxPooling2D(pool_size=(2, 2))(x) x = Conv2D(filters=128, kernel_size=(3,3), padding='same', activation='relu')(x) x = MaxPooling2D(pool_size=(2, 2))(x) model = Model(input_frame, x) return modelinputs = Input(shape=(config.N_FRAMES_IN_SEQUENCE, config.IMAGE_H, config.IMAGE_W, config.N_CHANNELS))x = TimeDistributed(cnn_model())(inputs)