реализация уровня разархивирования в u-сети, произошла ошибка InvalidArgumentError

#tensorflow2.0

#tensorflow2.0

Вопрос:

Я использую сегментацию EM_dataset, keras2.3.1 и tensorflow 2, в Google colab

Вот мой код. Это U-сеть.

     def unpool(pool, ind, ksize=[1,2,2,1], scope='unpool'):

  """
  Unpooling layer after max_pool_with_argmax.
  Args:
  pool:  max pooled output tensor
  ind:   argmax indices
  ksize: ksize is the same as for the pool
  Return:
    ret: unpooling tensor
  """
  with tf.compat.v1.variable_scope(scope):
    input_shape = tf.shape(pool)
    output_shape = [input_shape[0], input_shape[1] * ksize[1], input_shape[2] * ksize[2], input_shape[3]]


    flat_input_size = tf.reduce_prod(input_shape)
    flat_output_shape = [output_shape[0], output_shape[1] * output_shape[2] * output_shape[3]]

    pool_ = tf.reshape(pool, [flat_input_size])
    batch_range = tf.reshape(tf.range(tf.cast(output_shape[0], tf.int64), dtype=ind.dtype), shape=[input_shape[0], 1, 1, 1])
    b = tf.ones_like(ind) * batch_range
    b1 = tf.reshape(b, [flat_input_size, 1])
    ind_ = tf.reshape(ind, [flat_input_size, 1])
    ind_ = tf.concat([b1, ind_], 1)

    ret = tf.scatter_nd(ind_, pool_, shape=tf.cast(flat_output_shape, tf.int64))
    ret = tf.reshape(ret, output_shape)

    set_input_shape = pool.get_shape()
    set_output_shape = [set_input_shape[0], set_input_shape[1] * ksize[1], set_input_shape[2] * ksize[2], set_input_shape[3]]
    ret.set_shape(set_output_shape)
    #print(set_output_shape)
    return ret
  

также я использую ImageDataGenerator в keras

 inputs = Input(shape=(160, 160, 1))

# encorder
c1 = layers.BatchNormalization()(inputs)
c1 = layers.Conv2D(8, (3, 3), activation='relu', padding='same')(c1)
c1 = layers.Conv2D(8, (3, 3), activation='relu', padding='same')(c1)
#p1 = layers.MaxPooling2D((2, 2))(c1) # 80 80
p1, argmax1 = tf.nn.max_pool_with_argmax(input=c1, ksize=(1,2,2,1), strides=(1,2,2,1), padding='SAME')

c2 = layers.BatchNormalization()(p1)
c2 = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(c2)
c2 = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(c2)
#p2 = layers.MaxPooling2D((2, 2))(c2) # 40 40
p2, argmax2 = tf.nn.max_pool_with_argmax(input=c2, ksize=(1,2,2,1), strides=(1,2,2,1), padding='SAME')


c3 = layers.BatchNormalization()(p2)
c3 = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(c3)
c3 = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(c3)
#p3 = layers.MaxPooling2D((2, 2))(c3) # 20 20
p3, argmax3 = tf.nn.max_pool_with_argmax(input=c3, ksize=(1,2,2,1), strides=(1,2,2,1), padding='SAME')


c4 = layers.BatchNormalization()(p3)
c4 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(c4)
c4 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(c4)
#p4 = layers.MaxPooling2D(pool_size=(2, 2))(c4) # 10 10
p4, argmax4 = tf.nn.max_pool_with_argmax(input=c4, ksize=(1,2,2,1), strides=(1,2,2,1), padding='SAME')


c5 = layers.BatchNormalization()(p4)
c5 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(c5)
c5 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(c5)
#p5 = layers.MaxPooling2D(pool_size=(2, 2))(c5) # 5 5
p5, argmax5 = tf.nn.max_pool_with_argmax(input=c5, ksize=(1,2,2,1), strides=(1,2,2,1), padding='SAME')


c55 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(p5)
c55 = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(c55) 


u6 = layers.concatenate([unpool(c55, argmax5), c5])
c6 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(u6)
c6 = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(c6)

u71 = layers.concatenate([unpool(c6,argmax4), c4])
c71 = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(u71)
c61 = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(c71)

u7 = layers.concatenate([unpool(c61,argmax3), c3])
c7 = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(u7)
c7 = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(c7)

u8 = layers.concatenate([unpool(c7,argmax2), c2])
c8 = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(u8)
c8 = layers.Conv2D(16, (3, 3), activation='relu', padding='same')(c8)


u9 = layers.concatenate([unpool(c8,argmax1), c1], axis=3)
c9 = layers.Conv2D(8, (3, 3), activation='relu', padding='same')(u9)
c9 = layers.Conv2D(8, (3, 3), activation='relu', padding='same')(c9)

outputs = layers.Conv2D(1, (1, 1), activation='sigmoid')(c9)
  

Сеть в порядке, но если я подхожу, возникает ошибка

Ошибка InvalidArgumentError: входные данные для изменения формы представляют собой тензор с 12800 значениями, но запрошенная форма имеет 25600 [[функционал_33 узла/tf_op_layer_Reshape_393/Reshape_393 (определено в :4) ]] [Op:__вывод_обучающая_функция_56708]

Я не знаю, почему возникла эта ошибка… пожалуйста, помогите…

Ответ №1:

Поскольку ошибка предполагает, что для этого требуется, чтобы размер входного изображения составлял 160×160 = 25600 значений. но изображения, введенные в модель, не имеют требуемого размера. вы можете изменить размер всех изображений, которые требуются для размещения в модели, до 160x160x1, а затем подогнать их под модель, тогда это должно сработать.