vgg网络在病理图像数据集的应用
一、vgg网络设计
def vgg(conv_arch):
net = tf.keras.models.Sequential()
# 卷积层部分
for (num_convs, num_channels) in conv_arch:
net.add(vgg_block(num_convs, num_channels))
# 全连接层部分
net.add(tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(1024, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(1024, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(20)]))
return net
最后使用20个输出的全连接层。
二、学习率、轮数和批大小设置
lr, num_epochs, batch_size = 0.03, 15, 16
三、使用工具包的函数读取数据集
train_pos, train_neg, test_pos, test_neg = gds.train_test_pos_neg_partition(train_ratio=0.7)
train_pids = train_pos + train_neg
test_pids = test_pos + test_neg
train_pics = gds.sampling(k=80*len(train_pos+train_neg), pids=train_pos+train_neg)
train_pics.label_map, train_pics.normalize_func = lb, nf
test_pics = gds.sampling(k=2800, pids=test_pos+test_neg)
test_pics.label_map, test_pics.normalize_func = lb, nf
四、使用tf框架data.dataset创建数据迭代器
train_X, train_y = train_pics.load_data_and_label_np()
train_iter = tf.data.Dataset.from_tensor_slices((train_X, train_y)).batch(batch_size)
test_X, test_y = test_pics.load_data_and_label_np()
test_iter = tf.data.Dataset.from_tensor_slices((test_X, test_y)).batch(batch_size)
五、构建通道数较小的网络
ratio = 4
small_conv_arch = [(pair[0], pair[1] // ratio) for pair in conv_arch]
net = lambda: vgg(small_conv_arch)
六、训练结果
七、分析
首先训练轮数比较少,因为发现训练轮数增加后会出现过拟合的现象,考虑可能是因为训练集数据太少或是网络结构过于复杂,也有可能是图像中存在噪声。训练使用了88个病例的各80张总共7040张图片感觉应该不会少,使用的vgg网络块也不多,卷积层和全连接层一共才11个,感觉应该也不是网络复杂程度的问题(有待考究)。
一开始测试集的准确率就不是从0.5附近开始,所以会不会是测试集里面阴性阳性数量不均衡?
改进
接下来的想法是:
1.换一些常见的网络用同样的数据再跑
2.尝试使用更直观的数据集组织方式和读取方法