我正在建立一个u-net,用于随着时间推移对一些合成图像进行消噪。我的数据是(256,256,128,1),它是在128个时间步长上的256 * 256灰度图像(轨迹是随机余弦)。我有120张图像,所以整个数据集都是形状(120,256,256,128,1)。我为该数据添加了5%的随机噪声以获取嘈杂的数据集。自从我开始使用TF2以来,我就更像Keras对待它。
这是我的数据摘要:
x_train (120, 256, 256, 128, 1)
x_train_noisy (120, 256, 256, 128, 1)
x_validation (10, 256, 256, 128, 1)
x_validation_noisy (10, 256, 256, 128, 1)
x_test (10, 256, 256, 128, 1)
x_test_noisy (10, 256, 256, 128, 1)
x_train_input (100, 256, 256, 128, 1)
x_train_noisy_input (100, 256, 256, 128, 1)
现在,我想构建一个3D u-net进行去噪。我将嘈杂的图像作为输入,将原始的妖魔化为所需的输出,并希望它学习变换。我是新手,因此我使用了来自github的简单2d unet作为模板并对其进行了修改。
-这是我的U-net:我想知道(1)这种u-net架构是否正确? (显然有什么问题吗?)(基本上是像Ronnenberg一样的普通u-net)。
inputs = Input((256,256,128,1))
conv1 = Conv3D(64, (3,3,3), activation='relu', padding='same')(inputs)
conv1 = Conv3D(64, (3,3,3), activation='relu', padding='same')(conv1)
pool1 = MaxPooling3D(pool_size=(2,2,2))(conv1)
conv2 = Conv3D(128, (3,3,3), activation='relu', padding='same')(pool1)
conv2 = Conv3D(128, (3,3,3), activation='relu', padding='same')(conv2)
pool2 = MaxPooling3D(pool_size=(2,2,2))(conv2)
conv3 = Conv3D(256, (3,3,3), activation='relu', padding='same')(pool2)
conv3 = Conv3D(256, (3,3,3), activation='relu', padding='same')(conv3)
pool3 = MaxPool3D(pool_size= (2,2,2))(conv3)
conv4 = Conv3D(512, (3,3,3), activation='relu', padding='same')(pool3)
conv4 = Conv3D(512, (3,3,3), activation='relu', padding='same')(conv4)
up4 = concatenate([Conv3DTranspose(256, (3,3,3), strides=(2,2,2), padding ='same')(conv4), conv3], axis=-1)
conv5 = Conv3D(256, (3,3,3), activation='relu', padding='same')(up4)
conv5 = Conv3D(256, (3,3,3), activation='relu', padding='same')(conv5)
up5 = concatenate([Conv3DTranspose(128, (3,3,3), strides=(2,2,2), padding='same')(conv5), conv2], axis=-1)
conv6 = Conv3D(128, (3,3,3), activation='relu', padding='same')(up5)
conv6 = Conv3D(128, (3,3,3), activation='relu', padding='same')(conv6)
up6 = concatenate([Conv3DTranspose(64, (3,3,3), strides=(2,2,2), padding ='same')(conv6), conv1], axis=-1)
conv7 = Conv3D(64, (3,3,3), activation='relu', padding='same')(up6)
conv7 = Conv3D(64, (3,3,3), activation='relu', padding='same')(conv7)
conv8 = Conv3D(1, (3,3,3), activation=None, padding='same')(conv7)
conv9 = Activation('relu')(conv8)
#now the keras Model and compilation
unet = Model(inputs = [inputs], outputs = [conv9])
unet.compile(optimizer = 'adam', loss = 'mean_squared_error')
-现在我正尝试适应它:
save_dir = "/Users/Jack/Desktop/unet_50"
es_cb = EarlyStopping(monitor='val_loss', patience=2, verbose=1, mode='auto')
chkpt = save_dir + 'unet_50_synthetic_denoise_weights.{epoch:02d}-{loss:.2f}-{val_loss:.2f}.hdf5'
cp_cb = ModelCheckpoint(filepath = chkpt, monitor='val_loss', verbose=1, save_best_only=True, mode='auto')
tensor_board = tf.keras.callbacks.TensorBoard(
log_dir = "my_log_dir_unet_50",
histogram_freq = 1,
embeddings_freq = 1,)
history = unet.fit(x_train_noisy_input, x_train_input,
batch_size = 4,
epochs = 100,
verbose=1,
validation_data=(x_validation_noisy, x_validation),
callbacks = [es_cb, cp_cb],
shuffle=True)
-但是我明白了,它已经这样停滞了大约一个小时。我很确定应该有类似进度条的经历:
Train on 100 samples, validate on 10 samples
Epoch 1/100
-所以这是我的问题: 我做错了,因为试管工作停滞了(是应该花几个小时,进度栏事情还是完全滞后了)。我知道我的计算机(CPU)肯定正在运行一些东西。
-您是否发现u-net代码有什么问题?
-关于批量大小和用于验证的数据拆分,您是否看到任何明显的错误或选择数字的更好方法?
答案 0 :(得分:0)
您提供给网络的输入的大小(256x256x128图像)非常大,最重要的是,您在体系结构的第一层有64层。我猜想,仅考虑第一级的conv层,就应该已经聚集到10至100Gb的GPU内存中,这实在太大了。
我想这就是它卡住的原因,尽管它没有广播任何类型的错误消息(例如GPU内存溢出),但我感到很惊讶。
我建议减少第一层的层数,并使用2d(3,3,1)个内核进行更改(该内核仅适用于图像尺寸,而不适用于图像尺寸)。时间)。