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