如何解决问题 ValueError: logits and labels must have the same shape ((None, 388, 388, 1) vs (None, 572, 572, 1))?

问题描述

Error Error Description

我使用 TensorFlow 2.2 来实现 Unet。 这是我正在构建的代码,它给了我 logits vs labels 的错误。已附上错误图片

**imports**
import numpy as np
import os
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

**Double Conv**
class Down(layers.Layer):
  def __init__(self,channels):
    super(Down,self).__init__()
    self.conv1 = layers.Conv2D(channels,(3,3),padding='valid',activation='relu')
    self.conv2 = layers.Conv2D(channels,activation='relu')
    

  def call(self,input_tensor,training=False):
    x = self.conv1(input_tensor,training=training)
    x = self.conv2(x,training=training)
    

    return x
**crop tensor**
def crp_img(tensor,target):
  x = tensor.get_shape().as_list()
  t_h = x[1]
  y = target.get_shape().as_list()
  tg_h= y[1]
  delta = t_h - tg_h 
  delta = delta // 2 
  #target = tf.image.resize_with_pad(target,t_h,t_w)

  return tensor[:,delta:t_h-delta,:] 

**Unet**
class U_net(keras.Model):
  def __init__(self):
    super(U_net,self).__init__()
    self.down1 = Down(64)
    self.down2 = Down(128)
    self.down3 = Down(256)
    self.down4 = Down(512)
    self.down5 = Down(1024)
    self.pool  = layers.MaxPooling2D((2,2),2)
    self.cv_T1= layers.Conv2DTranspose(512,(2,strides=(2,2))
    self.cv_T2 = layers.Conv2DTranspose(256,2))
    self.cv_T3 = layers.Conv2DTranspose(128,2))
    self.cv_T4 = layers.Conv2DTranspose(64,2))
    self.up1 = Down(512)
    self.up2 = Down(256)
    self.up3 = Down(128)
    self.up4 = Down(64)


  def call(self,training=False):
    d1 = self.down1(input_tensor,training=training)#
    x1 = self.pool(d1)
    print("Down_1 ",x1.shape)
    d2 = self.down2(x1,training=training)#
    x2 = self.pool(d2)
    print("Down_2 ",x2.shape)
    d3 = self.down3(x2,training=training)#
    x3 = self.pool(d3)
    print("Down_3 ",x3.shape)
    d4 = self.down4(x3,training=training)#
    x4 = self.pool(d4)
    print("Down_4 ",x4.shape)
    x5 = self.down5(x4,training=training)
    #mid = layers.Conv2D(1024,padding='same',activation='relu')(x4)
    print("Down_5 ",x5.shape)
    
    up_1 = self.cv_T1(x5)
    y_1 = crp_img(d4,up_1)
    x_11 = layers.concatenate([up_1,y_1])
    #print(x_11.shape)
    up = self.up1(x_11)
    print(up.shape)
    
    up_2 = self.cv_T2(up)
    y_2 = crp_img(d3,up_2)
    x_22 = layers.concatenate([up_2,y_2])
    #rint(x_22.shape)
    up_c = self.up2(x_22)

    print(up_c.shape)

    up_3 = self.cv_T3(up_c)
    print(up_3.shape)
    #up_3 = self.cv_T3(up_c)
    y_3 = crp_img(d2,up_3)
    #print(y_3.shape)
    x_33 = layers.concatenate([up_3,y_3])
    up_x = self.up3(x_33)
    print(up_x.shape)


    up_4 = self.cv_T4(up_x)
    y_4 = crp_img(d1,up_4)
    x_44 = layers.concatenate([up_4,y_4])
    #print(x_44.shape)
    up_z = self.up4(x_44)
   # print(up_z.shape)


    print(up_z.shape)
    #print(conv_x.shape)
    
    z = layers.Conv2D(1,(1,1),activation='sigmoid')(up_z)
    print(z.shape)
    return z
  
  def model(self):
    x = keras.Input(shape=(None,None,3))
    return keras.Model(inputs=[x],outputs=self.call(x))

**Model Call and Training**
model = U_net()
model.compile(optimizer=keras.optimizers.Adam(lr=0.001),loss=keras.losses.BinaryCrossentropy(from_logits=False),metrics=["accuracy"])
model.fit(train_set,epochs=epochs,steps_per_epoch=len(train_images)//bs,verbose=1)

当我尝试训练上述模型时,会产生 logits 与标签错误 ValueError:logits 和标签必须具有相同的形状 ((None,388,1) vs (None,572,1))

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)