python - 模型的输出张量必须是模型 Api Tensorfow 中 TensorFlow `Layer` 的输出(因此保存过去的层元数据)
问题描述
def generator_model(self):
input_images = Input(shape=[64,64,1])
layer1= Conv2D(self.filter_size,self.kernel_size,(2,2),padding='same',use_bias=False,kernel_initializer='random_uniform')(input_images)
layer1=LeakyReLU(0.2)(layer1)
layer2= Conv2D(self.filter_size*2,self.kernel_size,(2,2),padding='same',use_bias=False,kernel_initializer='random_uniform')(layer1)
layer2=BatchNormalization()(layer2)
layer2=LeakyReLU(0.2)(layer2)
layer3=Conv2D(self.filter_size*4,self.kernel_size,(2,2),padding='same',use_bias=False,kernel_initializer='random_uniform')(layer2)
layer3=BatchNormalization()(layer3)
layer3=LeakyReLU(0.2)(layer3)
layer4=Conv2D(self.filter_size*8,self.kernel_size,(2,2),padding='same',use_bias=False,kernel_initializer='random_uniform')(layer3)
layer4=BatchNormalization()(layer4)
layer4=LeakyReLU(0.2)(layer4)
layer5=Conv2D(self.filter_size*16,self.kernel_size,(2,2),padding='same',use_bias=False,kernel_initializer='random_uniform')(layer4)
layer5=BatchNormalization()(layer5)
layer5=LeakyReLU(0.2)(layer5)
up_layer5 = Conv2DTranspose(self.filter_size*8,self.kernel_size,strides = (2,2),padding='same',use_bias=False)(layer5)
up_layer5=BatchNormalization()(up_layer5)
up_layer5=LeakyReLU(0.2)(up_layer5)
#shape = 4*4*512
up_layer5_concat = tf.concat([up_layer5,layer4],0)
up_layer6 = Conv2DTranspose(self.filter_size*4,self.kernel_size,strides = (2,2),padding='same',use_bias=False)(up_layer5_concat)
up_layer6 =BatchNormalization()(up_layer6)
up_layer6 =LeakyReLU(0.2)(up_layer6)
up_layer_6_concat = tf.concat([up_layer6,layer3],0)
up_layer7 = Conv2DTranspose(self.filter_size*2,self.kernel_size,strides = (2,2),padding='same',use_bias=False)(up_layer_6_concat)
up_layer7 =BatchNormalization()(up_layer7)
up_layer7 =LeakyReLU(0.2)(up_layer7)
up_layer_7_concat = tf.concat([up_layer7,layer2],0)
up_layer8 = Conv2DTranspose(self.filter_size,self.kernel_size,strides = (2,2),padding='same',use_bias=False)(up_layer_7_concat)
up_layer8 =BatchNormalization()(up_layer8)
up_layer8 =LeakyReLU(0.2)(up_layer8)
up_layer_8_concat = tf.concat([up_layer8,layer1],0)
output = Conv2D(3,self.kernel_size,strides = (1,1),padding='same',use_bias=False)(up_layer_8_concat)
final_output = LeakyReLU(0.2)(output)
model = Model(input_images,output)
model.summary()
return model
这就是我的 generator_model 的样子,我按照研究论文来制作架构。但是,我遇到了错误。我已经在 SO 中检查了给定问题的其他解决方案,但没有一个对我有用,因为它们可能有点不同。我的猜测,问题在于tf.concat()
应该作为 Lambda 的 tensorflow keras 层放置的函数,但我也尝试过,但没有任何帮助。关于这个问题的任何帮助?烦我2天了。
解决方案
当您使用 Keras 功能 API 定义模型时,您必须使用 Keras 层来构建模型。
因此,您是对的,问题出在您的tf.concat
调用中。
但是,在tf.keras.layers
包中,您可以找到Concatenate
也使用功能 API 的层。
因此,您可以从以下位置替换您的 concat 层:
up_layer5_concat = tf.concat([up_layer5,layer4],0)
至
up_layer5_concat = tf.keras.layers.Concatenate()([up_layer5, layer4])
对于网络中的所有其他tf.concat
调用,依此类推
推荐阅读
- apache-flink - Flink 使用 KeyedCoProcessFunction 连接流
- jenkins - 通过 REST API 手动设置 Jenkins 构建原因
- plotly - 如何在 Plotly 等值线图中格式化标签
- c++ - 重载 >> 操作符来读取文件
- python - 如何在字典中获取数组?Python
- python - 如何访问 django 中 mysql 数据库中存在的表?
- sql - 调用存储过程,传递有效的学校 ID 和 50 的领导者分数,但过程不起作用
- python - 获取在按数据框分组的多索引上具有最大列值的索引
- r - AzureCognitive R 包翻译服务返回 http 400:“请求正文不是有效的 JSON。”
- jenkins - 在共享机器上运行的 Jenkins 管道