深度学习框架之个人见解
目前本人使用過的深度學習框架有4個:按照使用先后順序:caffe,tensorflow,keras,pytorch。
從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
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基本一樣。
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
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。
---------------------
原文:https://blog.csdn.net/LEILEI18A/article/details/80255641
總結
以上是生活随笔為你收集整理的深度学习框架之个人见解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习概述:当你没有方向时的加油站
- 下一篇: 初学者如何选出最适合自己深度学习框架?