目前本人使用过的深度学习框架有4个:按照使用先后顺序:caffe,tensorflow,keras,pytorch,mxnet。
从2个方面说一下体验:
1)安装体验:
caffe: 安装及其繁琐,并且网上诸多教程都是瞎写或者转载,没有实际安装过。这里有一篇ubuntu14.04安装caffe的比较好的教程:https://blog.csdn.net/leilei18a/article/details/79490081
tensorflow:安装教程,较caffe来说简单许多。附安装教程:https://blog.csdn.net/leilei18a/article/details/79490175
keras:安装教程,本人是在tf环境下安装的,在安装tensorflow之后,加一句pip install keras 即可
pytorch:安装教程更简单,与tensorflow基本一样。若想在linux系统下安装tensorflow,pytorch。那么需要创建2个环境即可。附:https://blog.csdn.net/leilei18a/article/details/79871423 若在win下安装cpu版本,下载tf与pytorch的whl文件,pip install 名字 即可。并且pytorch教程比tensorflow好许多,tensorflow太臃肿。pytorch官方教程链接:https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html
mxnet:除了caffe其它均可以pip install。需提前安装好cuda
2)使用体验:
1. 读取数据:
caffe:一般是生成lmdb。 数据输入格式:N*C*H*W
tensorflow:本人喜欢 feed 方式,至于tfrecords ,不是很喜欢,以及tensorflow的数据增强方式(替代为opencv- python);但是feed方式,建议将数据先生成HDF5文件,这样读取数据效率快较之读取本地图片。
数据输入格式:N*C*H*W或者N*H*W*C(默认,本人比较习惯了)
keras:与tensorflow基本一样。
mxnet:symbol静态格式与tf类似,但是比tf接口简洁,没有那么多乱花眼的函数,动态和pytorch基本一致;
但是pytorch的数据增强是在totensor之前,是对PIL数据进行操作,而mxnet的数据增强统一都是tensor,但是这些数据增强操作必须在Totensor之前,而之前也是mxnet的ndarray即tensor,因此建议采用mx.image.imread读取数据,就是ndarray了,然后采用mxnet的数据增强操作;
pytorch:对于公共小数据集,pytorch很多已经集成到torchvision模块下。torchvision.datasets.下面
数据输入格式:N*C*H*W
对于本地数据集,需要建立一个txt文件,然后建立 class 类:
def default_loader(path):
return Image.open(path).convert('RGB')
class MyDataset(Dataset):
def __init__(self, txt, transform=None, target_transform=None, loader=default_loader):
fh = open(txt, 'r')
imgs = []
for line in fh:
line = line.strip('\n')
line = line.rstrip()
words = line.split()
imgs.append((words[0],int(words[1])))
self.imgs = imgs
self.transform = transform
self.target_transform = target_transform
self.loader = loader
def __getitem__(self, index):
fn, label = self.imgs[index]
img = self.loader(fn)
if self.transform is not None:
img = self.transform(img)
return img,label
def __len__(self):
return len(self.imgs)
2. 建立网络:
caffe:可以使用脚本,不过费时费力。有python接口,利用python生成网络,但是不能自动补全。
tensorflow:本人是图像处理方向(LSTM接触较少)。建议新手,先用tf.nn下面的基础网络函数建立网络,熟练后,高级模块有tf.layers,tf.contrib.layers,tf.contrib.slim(推荐使用slim模块),而且slim模块的fine-tune更加方便简洁。
fine-tune模型链接:https://github.com/tensorflow/models/tree/master/research/slim
而且 slim模块有已经写好的网络 可以直接调用(分类网络)slim.nets. 各种网络
keras:类似,预训练模型链接:https://github.com/fchollet/deep-learning-models/releases
mxnet:推荐使用动态的,静态也还可以,但是有的地方做的不友好,如gpu并行。
mxnet gluon网络在initialize之后,还需要forward一下,才会有具体参数,既可以保存,有可以通过.data()获取Ndarray,再转成numpy。net.collect_params()['alexnet0_conv0_weight']._load_init() 重新赋值!!!下图进一步证明了collect_params是同步到网络中的!!!
pytorch:与tensorflow slim fine-tune类似,pytorch也有写好的网络,可以直接调用。
torchvision.models.下面有各种网络,模型可以通过函数自动下载:eg:torchvision.models.alexnet(pretrain=True)即可自动下载。也可以手动下载:https://github.com/aaron-xichen/pytorch-playground ; https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py (往上反一级即所有模型)
tensorflow与pytorch (vgg系列 或者残差系列)实现HED或者U_Net,一般来说都是4个尺度变化,这是关键。
只需要记住 大部分是4个尺度变化或3 或5 个 ,那么无论多少个残差单元或者多少个巻积层都没有问题。只需要concat4次,上采样4次。那么心里就不发怵了。pytorch实现HED链接:https://github.com/gengyanlei/Pytorch-HED
基于VGG系列:
tf:采用slim模块以及outputs_collections,转成dict,即可获取在下采样的每层的输出(下采样过程需要单独构建一个函数,返回net,以及end_points每层的dict);那么在上采样过程中,不管是HED或U_Net均可以调用他们,然后concat。
torch:采用fine-tune的网络,model=torchvision.models.vgg11(pretrain=True)(既可以构建下采样网络,又可以获取预训练模型),而且pytorch将FC层与其他层单独分开了,使得调用非FC层方便,直接model_n=model.features就是非FC层;那么再构建HED或者U_Net,只需要切片model_n即可。然后forward。
基于残差系列:
tf:采用slim模块以及outputs_collections,并且每个尺度下最后一层的net也会保存输出成dict形式,很好调用。那么构建HED或者U_Net就是尺度构建问题了,但是仍然先需要构建下采样过程函数,返回net,endpoints每个block的输出。
pytorch:采用fine-tune的网络,model=torchvision.models.vgg11(pretrain=True)(既可以构建下采样网络,又可以获取预训练模型),而且pytorch将FC层与其他层单独分开了,使得调用非FC层方便,直接model_n=model.features就是非FC层;那么再构建HED或者U_Net,只需要切片model_n即可。然后forward。