1. 程式人生 > >將Alexnet的拓撲結構和權重從Caffe轉換成tensorflow

將Alexnet的拓撲結構和權重從Caffe轉換成tensorflow

Caffe實現下,Alexnet的拓撲結構(caffeprotxt檔案)和權重(caffemodel檔案)都可以從Model Zoo下載。我自己寫了一個python2.7檔案,將Alexnet連拓撲帶權重從Caffe轉換成tensorflow. 檔案下載地址:Alexnet_caffe_to_tf.py. 我將自己執行的結果打包放在谷歌雲端硬碟上:Alexnet_tf.zip

#!/usr/bin/python
#-*-coding:utf-8-*
#########################################
  # File Name: alexnet.py
  # Author: ying chenlu
# Mail: [email protected] # Created Time: 2016/12/08,00:07:59 # Usage: ######################################## from __future__ import print_function from __future__ import absolute_import from __future__ import division import os import sys import pdb import cv2 import numpy as np import cPickle as
pickle # converts caffe filter to tf # tensorflow uses [filter_height, filter_width, in_channels, out_channels] # 2 3 1 0 # need to transpose channel axis in the weights # caffe: a convolution layer with 96 filters of 11 x 11 spatial dimension # and 3 inputs the blob is 96 x 3 x 11 x 11
# caffe uses [out_channels, in_channels, filter_height, filter_width] # 0 1 2 3 # # the weights of fc layers are also been transposed DEBUG = True tf_layer_params_file = 'Alexnet_tf_weights.pickle' def getInput(image_path): means = np.load('ilsvrc_2012_mean.npy') img_raw = cv2.imread(image_path) # HxWxC img = cv2.resize(img_raw, means.shape[1:3]) img = np.asarray(img.transpose([2, 0, 1]), dtype=np.float32) - means # CxHxW return img.transpose([1, 2, 0]) # HxWxC if not os.path.exists(tf_layer_params_file): import caffe caffe_net = '/data/yingcl/ModelZoo/CaffeNet/deploy.prototxt' caffe_weights = '/data/yingcl/ModelZoo/CaffeNet/bvlc_reference_caffenet.caffemodel' caffe_model = caffe.Net(caffe_net, caffe_weights, caffe.TEST) # input_img = cv2.resize(getInput('../cat.jpg'), (227, 227)) # input_img = input_img.transpose((2, 0, 1)) # CxHxW # caffe_model.blobs['data'].data[0] = input_img # caffe_model.forward() # logit = caffe_model.blobs['prob'].data[0] # print(np.argmax(logit)) tf_layer_params = {} for i, layer in enumerate(caffe_model.layers): layer_name = caffe_model._layer_names[i] if layer_name.startswith('conv'): tf_layer_params[layer_name] = {} weights = layer.blobs[0].data biases = layer.blobs[1].data if DEBUG == True: print(layer_name, ': ', weights.shape, ',', biases.shape) tf_layer_params[layer_name]['weights'] = weights.transpose((2, 3, 1, 0)) tf_layer_params[layer_name]['biases'] = biases.copy() if layer_name.startswith("fc"): tf_layer_params[layer_name] = {} weights = layer.blobs[0].data biases = layer.blobs[1].data if DEBUG == True: print(layer_name, ': ', weights.shape, ',', biases.shape) tf_layer_params[layer_name]['weights'] = weights.transpose((1, 0)) tf_layer_params[layer_name]['biases'] = biases.copy() if DEBUG == True: print("param shapes in tf") for layer_name in tf_layer_params: print(layer_name, ': ', tf_layer_params[layer_name]['weights'].shape, ', ', tf_layer_params[layer_name]['biases'].shape) with open(tf_layer_params_file, 'wb') as fp: pickle.dump(tf_layer_params, fp) else: import tensorflow as tf with open(tf_layer_params_file, 'rb') as fp: tf_layer_params = pickle.load(fp) def conv(input, kernel, biases, k_h, k_w, c_o, s_h, s_w,\ padding="VALID", group=1, name=None): ''' k_h: kernel height k_w: kernel width c_o: channle output ''' c_i = input.get_shape()[-1] # channel_input assert c_i%group==0 assert c_o%group==0 convolve = lambda i, k: tf.nn.conv2d(i, k, [1, s_h, s_w, 1], padding=padding) if group==1: conv = convolve(input, kernel) else: #group means we split the input into 'group' groups along the third demention input_groups = tf.split(3, group, input) kernel_groups = tf.split(3, group, kernel) output_groups = [convolve(i, k) for i,k in zip(input_groups, kernel_groups)] conv = tf.concat(3, output_groups) # pdb.set_trace() return tf.reshape(tf.nn.bias_add(conv, biases), conv.get_shape().as_list(), name=name) x = tf.placeholder(tf.float32, shape=(1, 227, 227, 3), name='data') with tf.name_scope('conv1') as scope: #conv1 #conv(11, 11, 96, 4, 4, padding='VALID', name='conv1') k_h = 11; k_w = 11; c_o = 96; s_h = 4; s_w = 4 conv1W = tf.Variable(tf_layer_params["conv1"]['weights'], name='weights') conv1b = tf.Variable(tf_layer_params["conv1"]['biases'], name='biases') conv1_in = conv(x, conv1W, conv1b, k_h, k_w, c_o, s_h, s_w, padding="VALID", group=1, name='conv1') conv1 = tf.nn.relu(conv1_in, name='relu1') with tf.name_scope('pool1') as scope: #maxpool1 #max_pool(3, 3, 2, 2, padding='VALID', name='pool1') k_h = 3; k_w = 3; s_h = 2; s_w = 2; padding = 'VALID' maxpool1 = tf.nn.max_pool(conv1, ksize=[1, k_h, k_w, 1], strides=[1, s_h, s_w, 1], padding=padding, name='pool1') with tf.name_scope('lrn1') as scope: #lrn1 #lrn(2, 2e-05, 0.75, name='norm1') radius = 2; alpha = 2e-05; beta = 0.75; bias = 1.0 lrn1 = tf.nn.local_response_normalization(maxpool1, depth_radius=radius, alpha=alpha, beta=beta, bias=bias, name='lrn1') with tf.name_scope('conv2') as scope: #conv2 #conv(5, 5, 256, 1, 1, group=2, name='conv2') k_h = 5; k_w = 5; c_o = 256; s_h = 1; s_w = 1; group =2 conv2W = tf.Variable(tf_layer_params["conv2"]['weights'], name='weights') conv2b = tf.Variable(tf_layer_params["conv2"]['biases'], name='biases') conv2_in = conv(lrn1, conv2W, conv2b, k_h, k_w, c_o, s_h, s_w, padding="SAME", group=group, name='conv2') conv2 = tf.nn.relu(conv2_in, name='relu2') with tf.name_scope('pool2') as scope: #maxpool2 #max_pool(3, 3, 2, 2, padding='VALID', name='pool2') k_h = 3; k_w = 3; s_h = 2; s_w = 2; padding = 'VALID' maxpool2 = tf.nn.max_pool(conv2, ksize=[1, k_h, k_w, 1], strides=[1, s_h, s_w, 1], padding=padding, name='pool2') with tf.name_scope('lrn2') as scope: #lrn2 #lrn(2, 2e-05, 0.75, name='norm2') radius = 2; alpha = 2e-05; beta = 0.75; bias = 1.0 lrn2 = tf.nn.local_response_normalization(maxpool2 , depth_radius=radius, alpha=alpha, beta=beta, bias=bias, name='lrn2') with tf.name_scope('conv3') as scope: #conv3 #conv(3, 3, 384, 1, 1, name='conv3') k_h = 3; k_w = 3; c_o = 384; s_h = 1; s_w = 1; group = 1 conv3W = tf.Variable(tf_layer_params["conv3"]['weights'], name='weights') conv3b = tf.Variable(tf_layer_params["conv3"]['biases'], name='biases') conv3_in = conv(lrn2, conv3W, conv3b, k_h, k_w, c_o, s_h, s_w, padding="SAME", group=group, name='conv3') conv3 = tf.nn.relu(conv3_in, name='relu3') with tf.name_scope('conv4') as scope: #conv4 #conv(3, 3, 384, 1, 1, group=2, name='conv4') k_h = 3; k_w = 3; c_o = 384; s_h = 1; s_w = 1; group = 2 conv4W = tf.Variable(tf_layer_params["conv4"]['weights'], name='weights') conv4b = tf.Variable(tf_layer_params["conv4"]['biases'], name='biases') conv4_in = conv(conv3, conv4W, conv4b, k_h, k_w, c_o, s_h, s_w, padding="SAME", group=group, name='conv4') conv4 = tf.nn.relu(conv4_in, name='relu4') with tf.name_scope('conv5') as scope: #conv5 #conv(3, 3, 256, 1, 1, group=2, name='conv5') k_h = 3; k_w = 3; c_o = 256; s_h = 1; s_w = 1; group = 2 conv5W = tf.Variable(tf_layer_params["conv5"]['weights'], name='weights') conv5b = tf.Variable(tf_layer_params["conv5"]['biases'], name='biases') conv5_in = conv(conv4, conv5W, conv5b, k_h, k_w, c_o, s_h, s_w, padding="SAME", group=group, name='conv5') conv5 = tf.nn.relu(conv5_in, name='relu5') with tf.name_scope('pool5') as scope: #maxpool5 #max_pool(3, 3, 2, 2, padding='VALID', name='pool5') k_h = 3; k_w = 3; s_h = 2; s_w = 2; padding = 'VALID' maxpool5 = tf.nn.max_pool(conv5, ksize=[1, k_h, k_w, 1], strides=[1, s_h, s_w, 1], padding=padding, name='pool5') with tf.name_scope('fc6') as scope: #fc6 #fc(4096, name='fc6') maxpool5_transpose = tf.transpose(maxpool5, perm=[0, 3, 1, 2]) fc6_input_shape = np.prod(maxpool5.get_shape().as_list()[1:]) fc6W = tf.Variable(tf_layer_params["fc6"]['weights'], name='weights') fc6b = tf.Variable(tf_layer_params["fc6"]['biases'], name='biases') # pdb.set_trace() conv5_flatten = tf.reshape(maxpool5_transpose, [int(maxpool5.get_shape()[0]), fc6_input_shape]) fc6 = tf.nn.relu_layer(conv5_flatten, fc6W, fc6b, name='fc6') with tf.name_scope('fc7') as scope: #fc7 #fc(4096, name='fc7') fc7W = tf.Variable(tf_layer_params["fc7"]['weights'], name='weights') fc7b = tf.Variable(tf_layer_params["fc7"]['biases'], name='biases') fc7 = tf.nn.relu_layer(fc6, fc7W, fc7b, name='fc7') with tf.name_scope('fc8') as scope: #fc8 #fc(1000, relu=False, name='fc8') fc8W = tf.Variable(tf_layer_params["fc8"]['weights'], name='weights') fc8b = tf.Variable(tf_layer_params["fc8"]['biases'], name='biases') fc8 = tf.nn.xw_plus_b(fc7, fc8W, fc8b, name='fc8') with tf.name_scope('prob') as scope: #prob #softmax(name='prob')) prob = tf.nn.softmax(fc8, name='prob') global_variables = tf.global_variables() for var in global_variables: print(var.name, var.get_shape().as_list()) saver = tf.train.Saver() with tf.Session(config=tf.ConfigProto(log_device_placement=True, allow_soft_placement=True)) as sess: sess.run(tf.global_variables_initializer()) sess.run(tf.local_variables_initializer()) # input_img = getInput('../cat.jpg') # input_img = cv2.resize(input_img, (227, 227)) # logit = sess.run(prob, feed_dict={x: input_img[np.newaxis, :, :, :]}) # print(np.argmax(logit)) saver.save(sess, 'AlexNet.tfmodel')

2016年12月16日更新:程式碼有錯,已更改。注意maxpool5在flatten之前要transpose。

相關推薦

Alexnet結構權重Caffe轉換tensorflow

Caffe實現下,Alexnet的拓撲結構(caffeprotxt檔案)和權重(caffemodel檔案)都可以從Model Zoo下載。我自己寫了一個python2.7檔案,將Alexnet連拓撲帶權重從Caffe轉換成tensorflow. 檔案下載地址:A

環狀結構混合型結構

在環狀拓撲結構(ring topology) 中,每臺裝置只與其兩側的裝置有一條專用的點到點的連線。訊號以一個方向在環中傳輸,從一臺裝置到達另一臺裝置,直到其到達目的裝置。環中的每臺裝置中安裝有一箇中繼器。當裝置接收到發給另一臺裝置的訊號時,它的中繼器會再生井轉發這些位。

[今天開始修煉資料結構]無環圖的應用 —— 排序關鍵路徑演算法

上一篇文章我們學習了最短路徑的兩個演算法。它們是有環圖的應用。下面我們來談談無環圖的應用。   一、拓撲排序     博主大學學的是土木工程,在老本行,施工時很關鍵的節約人力時間成本的一項就是流水施工,鋼筋沒綁完,澆築水泥的那幫兄弟就得在那等著,所以安排好流水施工,讓工作週期能很好地銜接就很關鍵。這樣的工程活

資料結構排序關鍵路徑

拓撲排序 在一個表示工程的有向圖中,用頂點表示活動,用弧表示活動之間的優先關係,這樣的有向圖為頂點表示活動的網,稱為AOV網。 基本思路:從AOV網中選擇一個入度為0的頂點輸出,然後刪去此頂點,並刪除以此頂點為尾的弧,繼續重複此步驟,直到輸出全部頂點或者AOV網中不存在入度為0的頂

USB理論學習之三-----裝置級USB系統USB結構

一、裝置級USB系統 1.USB Hub 提供USB的連線埠,Hub就是能將多個連線線集中在一起的裝置 USB的體系允許多個Hub之間進行互連   上行埠:用於連線上一級Hub或根Hub 下行埠:用於連線下級Hub或USB裝置   通過檢測USB電

結構

拓撲虛線就是需要實現的目標,能夠直接訪問到192.168.20.0/24裏面的機器本文出自 “kictto” 博客,謝絕轉載!拓撲結構

網絡結構

因此 div 交換機 目前 eight 支持 outer 計算機 結構 網絡拓撲 (Topology) 結構是指用傳輸介質互連各種設備的物理布局。 星型拓撲結構(如圖 1 、圖 2 ) 星型網絡由中心節點和其它從節點組成,中心節點可直接與從節點通信,而從節點間必須通過中心節

OptimalSolution(2)--二叉樹問題(4)子樹與結構

kmp ole 結點 mp算法 返回 str 序列 || 開始   一、判斷t1樹是否包含t2樹全部的拓撲結構 1 / 2 3 2 / \ /

檢視CPU/CACHE的結構

轉自 http://smilejay.com/2017/12/cpu-cache-topology/ Linux上,CPU和Cache相關的拓撲結構,都可以從sysfs檔案系統的目錄 /sys/devices/system/cpu/ 來獲取詳細資訊。在網上,找了對CPU相關拓撲結構的解析的兩個指令

網路的結構

網路拓撲是網路形狀 網路的拓撲結構 主要有星型結構、環型結構、匯流排結構、分散式結構、樹型結構、網狀結構、蜂窩狀結構等。 What:網路拓撲結構是指用傳輸媒體互連各種裝置的物理佈局, Why:規劃網路 How: 把網路中的計算機等裝置連線起來 組成 每一種網路結構

結構域Topologically associating domains,TAD

拓撲結構域(英語:Topological domains)或稱為拓撲相關結構域(Topologically associating domains,簡稱TAD)是染色質亞結構的學術名稱。類似的定義還包括接觸結構域(Contact domain)、DNA環結構域(DNA Loo

3.11 判斷t1樹是否包含t2樹全部的結構

【題目】:   給定彼此獨立的兩棵樹頭節點分別為t1和t2,判斷t1樹是否包含t2樹全部的拓撲結構   例如,t1樹和t2樹分別為如下左圖和右圖所示:                          &

《程式設計師程式碼面試指南》判斷t1樹是否包含t2樹的全部結構

題目: 給定彼此獨立的兩棵樹頭結點分別為t1和t2,判斷t1樹是否包含t2樹的全部拓撲結構。 t1樹包含t2樹的全部拓撲結構,所以返回true。 解答: 如果t1中某棵子樹節點的值與t2頭節點的值一樣,則從這兩個頭結點開始匹配,匹配的每一步都讓t1上的節點跟著t2

計算機網路結構 以下關於星型網路結構的描述正確的是______。 (多選題 )

全文轉自百度,自己總結方便自己以後查詢! 常見型別:  星型拓撲  匯流排拓撲 ▪ 環型拓撲 ▪ 樹型拓撲 ▪ 混合型拓 ▪ 網型拓撲 簡單介紹的: 星型 優點:可靠性高,方便管理,易於擴充套件,傳輸效率高 缺點:線路利用率低,中心節點需要

死磕演算法·字串問題】判斷A中是否存在一棵子樹與B樹的結構完全相同·kmp演算法應用

題目大意: 對於兩棵彼此獨立的二叉樹A和B,請編寫一個高效演算法,檢查A中是否存在一棵子樹與B樹的拓撲結構完全相同。給定兩棵二叉樹的頭結點A和B,請返回一個bool值,代表A中是否存在一棵同構於B的子樹。 許多題目可以轉化為字串型別題目進行求解。此題判斷A中是否有一棵拓撲結構和B相同

溫習Algs4 (四):有向圖, 排序強連通分量

有向圖, 拓撲排序和強連通分量 有向圖 Digraph.java 有向環 DiCycle.java 深度優先搜尋序列 DFSOrder.java 拓撲排序 Topo

網路中的結構

一.星型拓撲結構 星型拓撲結構是目前應用最廣、實用性最好的一種拓撲結構,這主要是因為它非常容易實現網路的拓展。星型拓撲結構又叫集中式拓撲結構,是因集線器或交換機連線的各節點呈星狀分佈而得名,在這種拓撲結構的網路中有中央節點(集線器或交換機),其他節點(工作站、伺服器)都與中央節點直接相連。

系統技術非業餘研究 » CPU結構的調查

在做多核程式的時候(比如Erlang程式),我們需要了解cpu的拓撲結構, 瞭解logic CPU和物理的CPU的對映關係,以及瞭解CPU的內部的硬體引數,比如說 L1,L2 cache的大小等資訊。 Linux下的/proc/cpuinfo提供了相應的資訊,但是比較不全面。 /sys/devi

Flume(2)-結構與Agent內部原理

一. 拓撲結構 1. 序列模式 這種模式是將多個flume給順序連線起來了,從最初的source開始到最終sink傳送的目的儲存系統。此模式不建議橋接過多的flume數量, flume數量過多不僅會影響傳輸速率,而且一旦傳輸過程中某個節點flume宕機,會影響整個傳輸系統。 2. 單Source多C

什麼是結構_結構圖

什麼是拓撲結構?   首先我們來解釋一下拓撲的含義,所謂“拓撲”就是把實體抽象成與其大小、形狀無關的“點”,而把連線實體的線路抽象成“線”,進而以圖的形式來表示這些點與線之間關係的方法,其目的在於研究這些點、線之間的相連關係。表示點和線之間關係的圖被稱為拓撲結