少年帮|利用深度学习生成医疗报告( 六 )

还记得我们的数据生成器吗?现在是时候使用它们了 。
这里 , 生成器提供的batch不是我们用于训练的实际数据batch 。 请记住 , 它们不是逐字输入输出对 。 它们只返回图像及其相应的整个报告 。
我们将从生成器中检索每个batch , 并将从该batch中手动创建输入输出序列 , 也就是说 , 我们将创建我们自己的定制的batch数据以供训练 。 所以在这里 , batch处理大小逻辑上是模型在一个batch中看到的图像对的数量 。 我们可以根据我们的系统能力改变它 。 我发现这种方法比其他博客中提到的传统定制生成器要快得多 。
由于我们正在创建自己的batch数据用于训练 , 因此我们将使用“train_on_batch”来训练我们的模型 。
epoch_train_loss = []epoch_val_loss = []for epoch in range(EPOCH):print('EPOCH : ',epoch+1)start = time.time()batch_loss_tr = 0batch_loss_vl = 0for img, report in train_dataset:r1 = bytes_to_string(report.numpy())img_input, rep_input, output_word = convert(img.numpy(), r1)rep_input = pad_sequences(rep_input, maxlen=MAX_INPUT_LEN, padding='post')results = encoder_decoder.train_on_batch([img_input, rep_input], output_word)batch_loss_tr += resultstrain_loss = batch_loss_tr/(X_train_img.shape[0]//BATCH_SIZE)with train_summary_writer.as_default():tf.summary.scalar('loss', train_loss, step = epoch)for img, report in cv_dataset:r1 = bytes_to_string(report.numpy())img_input, rep_input, output_word = convert(img.numpy(), r1)rep_input = pad_sequences(rep_input, maxlen=MAX_INPUT_LEN, padding='post')results = encoder_decoder.test_on_batch([img_input, rep_input], output_word)batch_loss_vl += resultsval_loss = batch_loss_vl/(X_cv_img.shape[0]//BATCH_SIZE)with val_summary_writer.as_default():tf.summary.scalar('loss', val_loss, step = epoch)epoch_train_loss.append(train_loss)epoch_val_loss.append(val_loss)print('Training Loss: {},Val Loss: {}'.format(train_loss, val_loss))print('Time Taken for this Epoch : {} sec'.format(time.time()-start))encoder_decoder.save_weights('Weights/BM7_new_model1_epoch_'+ str(epoch+1) + '.h5')代码中提到的convert函数将生成器中的数据转换为逐字输入输出对表示 。 然后将剩余报告填充到报告的最大长度 。
Convert 函数:
def convert(images, reports):'''此函数接受batch数据并将其转换为新数据集'''imgs = []in_reports = []out_reports = []for i in range(len(images)):sequence = [tokenizer.word_index[e] for e in reports[i].split() if e in tokenizer.word_index.keys()]for j in range(1,len(sequence)):in_seq = sequence[:j]out_seq = sequence[j]out_seq = tf.keras.utils.to_categorical(out_seq, num_classes=vocab_size)imgs.append(images[i])in_reports.append(in_seq)out_reports.append(out_seq)return np.array(imgs), np.array(in_reports), np.array(out_reports)Adam优化器的学习率为0.001 。 该模型训练了40个epoch , 但在第35个epoch得到了最好的结果 。 由于随机性 , 你得到的结果可能会有所不同 。
少年帮|利用深度学习生成医疗报告注:以上训练在Tensorflow 2.1中实现 。
8.2 推理现在我们已经训练了我们的模型 , 是时候准备我们的模型来预测报告了 。
为此 , 我们必须对我们的模型作一些调整 。 这将在测试期间节省一些时间 。


推荐阅读