如何解决Tensorflow中多输入模型的优化
我正在处理医学数据,并尝试建立具有2个输入的TF模型。
-第一个输入是一个numpy数组,其中包含有关多个Patient的数据。定期对每位患者进行一些测试(例如检查患者的体重)。它们将在我的数组中出现几次。
-第二个是病人肺部的图像。
假设我有2名叫Bob和Jean的病人。鲍勃已经测试了3次,吉恩已经测试了2次。我将在阵列中为Bob设置3行,为Jean设置2行。但是对于每个病人,我只有一张照片。因此,在我的DataGenerator中,对于每一行,我将不得不使用此图片3次。
我的第一个输入将如下所示:
['Name','Age','Weight']
['Bob',54,80]
['Bob',55,81]
['Bob',52,79]
['Jean',40,90]
['Jean',41,88]
第二个是这样的
Bob_img = 'Array representing the image of Bob lungs'
Jean_img = 'Array representing the image of Jean lungs'
[Picture_array]
[Bob_img]
[Bob_img]
[Bob_img]
[Jean_img]
[Jean_img]
我想构建一个CNN来处理图像,然后将numpy数组连接CNN的输出。 我的第二个输入中有重复的图像。它使用大量RAM,并在CNN上多次执行相同的计算。所以我想知道是否有任何方法可以对其进行优化?
该模型比下面的代码复杂,但您应该对此有所了解。
image_input = K.Input(shape=(512,512,60,),name="img_input")
x = tf.keras.layers.Conv2D(filters=64,kernel_size=(3,3),padding='same',activation='relu')(image_input)
x = tf.keras.layers.Conv2D(filters=64,activation='relu')(x)
x = tf.keras.layers.MaxPool2D(pool_size=(2,2),strides=(2,2))(x)
cnn_output = tf.keras.layers.Flatten()(x)
numpy_input = K.Input(shape=(10,name="numpy_input")
x = tf.keras.layers.concatenate([cnn_output,numpy_input],axis=1)
x = tf.keras.layers.Dense(32,activation='relu')(x)
x = tf.keras.layers.Dense(1,activation='relu')(x)
output= tf.keras.layers.Dense(1)(x)
model = K.Model(inputs=[image_input,outputs=output)
绘制模型:
tf.keras.utils.plot_model(model,show_shapes=True)
解决方法
最后找到答案:可以从头开始实施培训。然后,解决方案是使CNN前向通过,然后使用表格输入来压缩CNN前向通过,并应用NN第二部分的前向通过。最后,我只需要应用反向传播。我放置了指南的链接以从头开始编写培训here。而我的代码是否有用:
epochs = 1
for epoch in range(epochs):
print("\nStart of epoch %d" % (epoch,))
j=0
# Iterate over the batches of the dataset.
for [X1,X2],Y in generator:
# Open a GradientTape to record the operations run
# during the forward pass,which enables auto-differentiation.
with tf.GradientTape() as tape:
# Forward pass for CNN
out_imgs = CNN(X2)
# Replicate the forward pass in the same order than the numpy array
patients = X1.loc[:,'Patient'].unique()
X_imgs = np.empty([X1.shape[0],out_imgs.shape[1]])
for i in range(len(patients)):
X_imgs[np.where(X1['Patient']==patients[i])] = out_imgs.numpy()[i]
# Concatenate the forward pass with the numpy array
inp_mlp = [tf.keras.layers.concatenate([0.1*X_imgs,np.asarray(X1[temp_SELECTED_COLUMNS])],axis=1)]
# Forward pass of the second part of the layer
for layer in model.layers[-3:]:
inp_mlp.append(layer(inp_mlp[-1]))
# Calculate loss
loss = model.compiled_loss(tf.constant(Y),inp_mlp[-1],regularization_losses=model.losses)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。