ValueError:调用层“tf.concat_19”时遇到异常(类型 TFOpLambda) 我的图像形状是 (64,64,3) 这些是我为 CycleGAN 的生成器和鉴别器制作的下采样和上采样函数。
def downsample(filters, kernel_size, apply_instance_norm=True, n_strides=2) :
model = tf.keras.Sequential()
model.add(Conv2DTranspose(filters, kernel_size, strides = n_strides, padding = 'same',
kernel_initializer = tf.keras.initializers.RandomNormal(0.,0.02), use_bias = False))
if apply_instance_norm :
model.add(tfa.layers.InstanceNormalization())
model.add(LeakyReLU(0.2))
return model
def upsample(filters, kernel_size) :
model = tf.keras.Sequential([
Conv2DTranspose(filters, kernel_size, strides=2, padding = 'same',
kernel_initializer = tf.keras.initializers.RandomNormal(0.,0.02), use_bias = False),
tfa.layers.InstanceNormalization(),
LeakyReLU(0.2),
])
return model
发电机型号:
def generator() :
input = Input((IM_SHAPE[0], IM_SHAPE[1], 3))
x = input
store = []
for filter in [32,64,128,256,512,] :
x = downsample(filter, 4)(x)
store.append(x)
for filter in [512,256,128,64,3] :
x = tf.concat([x, store.pop()], axis = -1)
x = upsample(filter, 4)(x)
model = tf.keras.Model(input, x, name='unet_generator')
return model
我检查它的summary()时判别器没遇到问题。但是当我试图检查 generator().summary() 时,我得到了这个错误:
ValueError: Exception encountered when calling layer "tf.concat_19" (type TFOpLambda).
Dimension 1 in both shapes must be equal, but are 4096 and 1024. Shapes are [?,4096,4096] and [?,1024,1024]. for '{{node tf.concat_19/concat}} = ConcatV2[N=2, T=DT_FLOAT, Tidx=DT_INT32](Placeholder, Placeholder_1, tf.concat_19/concat/axis)' with input shapes: [?,4096,4096,512], [?,1024,1024,256], [] and with computed input tensors: input[2] = <-1>.
Call arguments received by layer "tf.concat_19" (type TFOpLambda):
• values=['tf.Tensor(shape=(None, 4096, 4096, 512), dtype=float32)', 'tf.Tensor(shape=(None, 1024, 1024, 256), dtype=float32)']
• axis=-1
• name=concat
您得到的错误表明您的生成器模型中的
tf.concat
操作存在维度不匹配。错误消息表明正在连接的两个张量的维度不匹配。具体来说,它说两个形状中的维度 1 必须相等,但是它们是 4096 和 1024。两个张量的形状是 [?, 4096, 4096, 512] 和 [?, 1024, 1024, 256]。
这似乎发生在生成器模型的最后一层,您将最后一个上采样层的输出与模型早期相应下采样层的输出连接起来。该错误表明这两个张量的形状不适合串联。
此错误的一个可能解释是您在定义生成器的输入形状时使用了错误的
IM_SHAPE
。确保您使用的 IM_SHAPE
与实际图像数据的形状相匹配。
另一个可能的解释可能是下采样和上采样函数配置不正确,这导致张量形状变得不匹配。具体来说,您可能想要检查
downsample
和 upsample
函数的输出形状,并确保它们彼此一致。
最后,错误消息还表明正在动态计算
tf.concat
操作的输入张量的形状,并且其中一个被设置为 -1。这可能表明模型的输入形状存在问题,未正确设置。你可能想检查你的生成器的输入形状是否被正确指定。
为了进一步诊断这个问题,我建议在你的生成器模型的每一步打印出张量的形状,这样你就可以准确地找出尺寸不匹配发生的地方。您还可以尝试使用
tf.keras.layers.Input
为您的张量设置明确的形状,这可能会帮助您更早地发现错误。