#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, а затем подогнать их под модель, тогда это должно сработать.