1. 程式人生 > >caffe學習筆記1.1-- caffe的Makefile檔案

caffe學習筆記1.1-- caffe的Makefile檔案

在本文中,描述一下caffe的Makefile檔案,這個檔案用於caffe的編譯;這裡不會把所有檔案都考過來,有些指令碼相似的會省略掉

檔案在caffe根目錄下,因為用到makefile.config中的變數,因此,在用到的時候我會給下說明

首先,是專案名稱

PROJECT := caffe #專案名稱,就是當前的caffe目錄

接下來,這個檔案要用到了Makefile.config中的一些變數,要包含這個檔案:

CONFIG_FILE := Makefile.config #配置檔名
# Explicitly check for the config file, otherwise make -k will proceed anyway.
ifeq ($(wildcard $(CONFIG_FILE)),) #檢查配置問價是否存在,如果不存在,使用config.example
$(error $(CONFIG_FILE) not found. See $(CONFIG_FILE).example.)
endif
include $(CONFIG_FILE) #將檔案包含進來

編譯後文件的存放目錄

BUILD_DIR_LINK := $(BUILD_DIR) #BUILD_DIR在Makefile.config檔案中定義 caffe中的build目錄

編譯方式:
ifeq ($(RELEASE_BUILD_DIR),) #是編譯方式,使用debug還是release編譯,如果用debug生成./build_debug目錄,release生成./build_release目錄
	RELEASE_BUILD_DIR := .$(BUILD_DIR)_release
endif
ifeq ($(DEBUG_BUILD_DIR),)
	DEBUG_BUILD_DIR := .$(BUILD_DIR)_debug
endif

#檢查debug是否為0,debug的定義在.config檔案中
DEBUG ?= 0
ifeq ($(DEBUG), 1)
	BUILD_DIR := $(DEBUG_BUILD_DIR)
	OTHER_BUILD_DIR := $(RELEASE_BUILD_DIR)
else
	BUILD_DIR := $(RELEASE_BUILD_DIR)
	OTHER_BUILD_DIR := $(DEBUG_BUILD_DIR)
endif

連結庫生成

# All of the directories containing code.找到所有.cpp .proto
SRC_DIRS := $(shell find * -type d -exec bash -c "find {} -maxdepth 1 \
	\( -name '*.cpp' -o -name '*.proto' \) | grep -q ." \; -print)

# The target shared library name
LIB_BUILD_DIR := $(BUILD_DIR)/lib #build/lib存放生成的連結庫
STATIC_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).a #生成靜態連結庫
DYNAMIC_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).so #動態連結庫

獲取所有原始檔:
##############################
# Get all source files
##############################
# CXX_SRCS are the source files excluding the test ones.
CXX_SRCS := $(shell find src/$(PROJECT) ! -name "test_*.cpp" -name "*.cpp") #排除test_*.cpp
# CU_SRCS are the cuda source files
CU_SRCS := $(shell find src/$(PROJECT) ! -name "test_*.cu" -name "*.cu") #排除test_*.cu
# TEST_SRCS are the test source files
TEST_MAIN_SRC := src/$(PROJECT)/test/test_caffe_main.cpp #~/src/caffe/test/test_caffe_main.cpp
TEST_SRCS := $(shell find src/$(PROJECT) -name "test_*.cpp")
TEST_SRCS := $(filter-out $(TEST_MAIN_SRC), $(TEST_SRCS))
TEST_CU_SRCS := $(shell find src/$(PROJECT) -name "test_*.cu")
GTEST_SRC := src/gtest/gtest-all.cpp
# TOOL_SRCS are the source files for the tool binaries
TOOL_SRCS := $(shell find tools -name "*.cpp") #tools目錄下所有.cpp檔案
# EXAMPLE_SRCS are the source files for the example binaries
EXAMPLE_SRCS := $(shell find examples -name "*.cpp")
# BUILD_INCLUDE_DIR contains any generated header files we want to include.
BUILD_INCLUDE_DIR := $(BUILD_DIR)/src #build/src, 包含include的標頭檔案。
# PROTO_SRCS are the protocol buffer definitions
PROTO_SRC_DIR := src/$(PROJECT)/proto 	#~/src/caffe/proto
PROTO_SRCS := $(wildcard $(PROTO_SRC_DIR)/*.proto)
# PROTO_BUILD_DIR will contain the .cc and obj files generated from
# PROTO_SRCS; PROTO_BUILD_INCLUDE_DIR will contain the .h header files
PROTO_BUILD_DIR := $(BUILD_DIR)/$(PROTO_SRC_DIR) #build/proto
PROTO_BUILD_INCLUDE_DIR := $(BUILD_INCLUDE_DIR)/$(PROJECT)/proto
# NONGEN_CXX_SRCS includes all source/header files except those generated
# NONGEN_CXX_SRCS 所有排除的檔案
# automatically (e.g., by proto).
NONGEN_CXX_SRCS := $(shell find \
	src/$(PROJECT) \
	include/$(PROJECT) \
	python/$(PROJECT) \
	matlab/+$(PROJECT)/private \
	examples \
	tools \
	-name "*.cpp" -or -name "*.hpp" -or -name "*.cu" -or -name "*.cuh")

後面一段LINT貌似是關於靜態程式碼解析的,還有一些是用於python和matlab介面的,這裡不做說明

匯出生成檔案:

這裡需要說一下編譯caffe的過程:從.cpp檔案,生成.o檔案,由.o檔案生成.bin檔案,同時,在生成.d的過程需要依賴.d檔案

因此,在build檔案中會由這三種字尾的檔案

##############################
# Derive generated files
##############################
# The generated files for protocol buffers
#caffe.pb.h,caffe.pb.cc在build/proto中
PROTO_GEN_HEADER_SRCS := $(addprefix $(PROTO_BUILD_DIR)/, \ 
		$(notdir ${PROTO_SRCS:.proto=.pb.h}))
PROTO_GEN_HEADER := $(addprefix $(PROTO_BUILD_INCLUDE_DIR)/, \
		$(notdir ${PROTO_SRCS:.proto=.pb.h}))
PROTO_GEN_CC := $(addprefix $(BUILD_DIR)/, ${PROTO_SRCS:.proto=.pb.cc})
PY_PROTO_BUILD_DIR := python/$(PROJECT)/proto
PY_PROTO_INIT := python/$(PROJECT)/proto/__init__.py
PROTO_GEN_PY := $(foreach file,${PROTO_SRCS:.proto=_pb2.py}, \
		$(PY_PROTO_BUILD_DIR)/$(notdir $(file)))
# The objects corresponding to the source files
# These objects will be linked into the final shared library, so we
# exclude the tool, example, and test objects.
CXX_OBJS := $(addprefix $(BUILD_DIR)/, ${CXX_SRCS:.cpp=.o})
CU_OBJS := $(addprefix $(BUILD_DIR)/cuda/, ${CU_SRCS:.cu=.o})
PROTO_OBJS := ${PROTO_GEN_CC:.cc=.o}
OBJS := $(PROTO_OBJS) $(CXX_OBJS) $(CU_OBJS)
# tool, example, and test objects
TOOL_OBJS := $(addprefix $(BUILD_DIR)/, ${TOOL_SRCS:.cpp=.o}) #定義生成規則,tools下的.cpp檔案生成.o檔案;檔案存放在build/tools中
#下面類似
TOOL_BUILD_DIR := $(BUILD_DIR)/tools
TEST_CXX_BUILD_DIR := $(BUILD_DIR)/src/$(PROJECT)/test
TEST_CU_BUILD_DIR := $(BUILD_DIR)/cuda/src/$(PROJECT)/test
TEST_CXX_OBJS := $(addprefix $(BUILD_DIR)/, ${TEST_SRCS:.cpp=.o})
TEST_CU_OBJS := $(addprefix $(BUILD_DIR)/cuda/, ${TEST_CU_SRCS:.cu=.o})
TEST_OBJS := $(TEST_CXX_OBJS) $(TEST_CU_OBJS)
GTEST_OBJ := $(addprefix $(BUILD_DIR)/, ${GTEST_SRC:.cpp=.o})
EXAMPLE_OBJS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o})
# Output files for automatic dependency generation
# 生成的依賴檔案是.d的
DEPS := ${CXX_OBJS:.o=.d} ${CU_OBJS:.o=.d} ${TEST_CXX_OBJS:.o=.d} \
	${TEST_CU_OBJS:.o=.d} $(BUILD_DIR)/${MAT$(PROJECT)_SO:.$(MAT_SO_EXT)=.d}
# tool, example, and test bins
TOOL_BINS := ${TOOL_OBJS:.o=.bin}  #.o檔案生成.bin檔案
EXAMPLE_BINS := ${EXAMPLE_OBJS:.o=.bin}
# symlinks to tool bins without the ".bin" extension
TOOL_BIN_LINKS := ${TOOL_BINS:.bin=}
# Put the test binaries in build/test for convenience.
TEST_BIN_DIR := $(BUILD_DIR)/test
TEST_CU_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \
		$(foreach obj,$(TEST_CU_OBJS),$(basename $(notdir $(obj))))))
TEST_CXX_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \
		$(foreach obj,$(TEST_CXX_OBJS),$(basename $(notdir $(obj))))))
TEST_BINS := $(TEST_CXX_BINS) $(TEST_CU_BINS)
# TEST_ALL_BIN is the test binary that links caffe dynamically.
TEST_ALL_BIN := $(TEST_BIN_DIR)/test_all.testbin

再下來,生成警告檔案

##############################
# Derive compiler warning dump locations
# 警告檔案,.o.warnings.txt;編譯沒有問題生警告檔案為0字元
##############################
WARNS_EXT := warnings.txt
CXX_WARNS := $(addprefix $(BUILD_DIR)/, ${CXX_SRCS:.cpp=.o.$(WARNS_EXT)})
CU_WARNS := $(addprefix $(BUILD_DIR)/cuda/, ${CU_SRCS:.cu=.o.$(WARNS_EXT)})
TOOL_WARNS := $(addprefix $(BUILD_DIR)/, ${TOOL_SRCS:.cpp=.o.$(WARNS_EXT)})
EXAMPLE_WARNS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o.$(WARNS_EXT)})
TEST_WARNS := $(addprefix $(BUILD_DIR)/, ${TEST_SRCS:.cpp=.o.$(WARNS_EXT)})
TEST_CU_WARNS := $(addprefix $(BUILD_DIR)/cuda/, ${TEST_CU_SRCS:.cu=.o.$(WARNS_EXT)})
ALL_CXX_WARNS := $(CXX_WARNS) $(TOOL_WARNS) $(EXAMPLE_WARNS) $(TEST_WARNS)
ALL_CU_WARNS := $(CU_WARNS) $(TEST_CU_WARNS)
ALL_WARNS := $(ALL_CXX_WARNS) $(ALL_CU_WARNS)

EMPTY_WARN_REPORT := $(BUILD_DIR)/.$(WARNS_EXT)
NONEMPTY_WARN_REPORT := $(BUILD_DIR)/$(WARNS_EXT)

新增cuda的路徑
##############################
# Derive include and lib directories
# 匯出include和lib目錄
##############################
CUDA_INCLUDE_DIR := $(CUDA_DIR)/include

CUDA_LIB_DIR :=
# add <cuda>/lib64 only if it exists
# 新增cuda/lib64檔案路徑:如果你已經安裝了cuda
ifneq ("$(wildcard $(CUDA_DIR)/lib64)","")
	CUDA_LIB_DIR += $(CUDA_DIR)/lib64
endif
CUDA_LIB_DIR += $(CUDA_DIR)/lib

INCLUDE_DIRS += $(BUILD_INCLUDE_DIR) ./src ./include
ifneq ($(CPU_ONLY), 1)
	INCLUDE_DIRS += $(CUDA_INCLUDE_DIR)
	LIBRARY_DIRS += $(CUDA_LIB_DIR)
	LIBRARIES := cudart cublas curand
endif
LIBRARIES += glog gflags protobuf leveldb snappy \
	lmdb boost_system hdf5_hl hdf5 m \
	opencv_core opencv_highgui opencv_imgproc
PYTHON_LIBRARIES := boost_python python2.7
WARNINGS := -Wall -Wno-sign-compare

build文件目錄等
##############################
# Set build directories
# 設定build目錄
##############################

DISTRIBUTE_DIR ?= distribute
DISTRIBUTE_SUBDIRS := $(DISTRIBUTE_DIR)/bin $(DISTRIBUTE_DIR)/lib
DIST_ALIASES := dist
ifneq ($(strip $(DISTRIBUTE_DIR)),distribute)
		DIST_ALIASES += distribute
endif

ALL_BUILD_DIRS := $(sort $(BUILD_DIR) $(addprefix $(BUILD_DIR)/, $(SRC_DIRS)) \
	$(addprefix $(BUILD_DIR)/cuda/, $(SRC_DIRS)) \
	$(LIB_BUILD_DIR) $(TEST_BIN_DIR) $(PY_PROTO_BUILD_DIR) $(LINT_OUTPUT_DIR) \
	$(DISTRIBUTE_SUBDIRS) $(PROTO_BUILD_INCLUDE_DIR))

##############################
# Set directory for Doxygen-generated documentation
# 註釋文件什麼的
##############################
DOXYGEN_CONFIG_FILE ?= ./.Doxyfile
# should be the same as OUTPUT_DIRECTORY in the .Doxyfile
DOXYGEN_OUTPUT_DIR ?= ./doxygen
DOXYGEN_COMMAND ?= doxygen
# All the files that might have Doxygen documentation.
DOXYGEN_SOURCES := $(shell find \
	src/$(PROJECT) \
	include/$(PROJECT) \
	python/ \
	matlab/ \
	examples \
	tools \
	-name "*.cpp" -or -name "*.hpp" -or -name "*.cu" -or -name "*.cuh" -or \
        -name "*.py" -or -name "*.m")
DOXYGEN_SOURCES += $(DOXYGEN_CONFIG_FILE)

作業系統(只貼下linux部分的)
##############################
# Configure build
# 作業系統
##############################

# Determine platform
UNAME := $(shell uname -s)
ifeq ($(UNAME), Linux) #對於linux系統
	LINUX := 1
else ifeq ($(UNAME), Darwin) #ios
	OSX := 1
endif

# Linux
ifeq ($(LINUX), 1)
	CXX ?= /usr/bin/g++ #是否有g++
	GCCVERSION := $(shell $(CXX) -dumpversion | cut -f1,2 -d.)
	# older versions of gcc are too dumb to build boost with -Wuninitalized
	ifeq ($(shell echo | awk '{exit $(GCCVERSION) < 4.6;}'), 1) #如果g++版本<4.6需要新增一些配置
		WARNINGS += -Wno-uninitialized
	endif
	# boost::thread is reasonably called boost_thread (compare OS X)
	# We will also explicitly add stdc++ to the link target.
	LIBRARIES += boost_thread stdc++ #新增boost_thread和stdc++
endif

後面一大堆配置,如自定義編譯,矩陣運算包之類;
# Custom compiler
# 自定義編譯
ifdef CUSTOM_CXX
	CXX := $(CUSTOM_CXX)
endif

# Static linking
# 靜態連結庫
ifneq (,$(findstring clang++,$(CXX)))
	STATIC_LINK_COMMAND := -Wl,-force_load $(STATIC_NAME)
else ifneq (,$(findstring g++,$(CXX)))
	STATIC_LINK_COMMAND := -Wl,--whole-archive $(STATIC_NAME) -Wl,--no-whole-archive
else
  # The following line must not be indented with a tab, since we are not inside a target
  $(error Cannot static link with the $(CXX) compiler)
endif

# Debugging
ifeq ($(DEBUG), 1)
	COMMON_FLAGS += -DDEBUG -g -O0
	NVCCFLAGS += -G
else
	COMMON_FLAGS += -DNDEBUG -O2
endif

# cuDNN acceleration configuration.
ifeq ($(USE_CUDNN), 1)
	LIBRARIES += cudnn
	COMMON_FLAGS += -DUSE_CUDNN
endif

# CPU-only configuration
# 只有CPU下的配置
ifeq ($(CPU_ONLY), 1)
	OBJS := $(PROTO_OBJS) $(CXX_OBJS)
	TEST_OBJS := $(TEST_CXX_OBJS)
	TEST_BINS := $(TEST_CXX_BINS)
	ALL_WARNS := $(ALL_CXX_WARNS)
	TEST_FILTER := --gtest_filter="-*GPU*"
	COMMON_FLAGS += -DCPU_ONLY
endif

# Python layer support
ifeq ($(WITH_PYTHON_LAYER), 1)
	COMMON_FLAGS += -DWITH_PYTHON_LAYER
	LIBRARIES += $(PYTHON_LIBRARIES)
endif

# BLAS configuration (default = ATLAS)
# 矩陣運算庫,預設ATLAS
BLAS ?= atlas
ifeq ($(BLAS), mkl)
	# MKL
	LIBRARIES += mkl_rt
	COMMON_FLAGS += -DUSE_MKL
	MKL_DIR ?= /opt/intel/mkl
	BLAS_INCLUDE ?= $(MKL_DIR)/include
	BLAS_LIB ?= $(MKL_DIR)/lib $(MKL_DIR)/lib/intel64
else ifeq ($(BLAS), open)
	# OpenBLAS
	LIBRARIES += openblas
else
	# ATLAS
	ifeq ($(LINUX), 1)
		ifeq ($(BLAS), atlas)
			# Linux simply has cblas and atlas
			LIBRARIES += cblas atlas
		endif
	else ifeq ($(OSX), 1)
		# OS X packages atlas as the vecLib framework
		LIBRARIES += cblas
		# 10.10 has accelerate while 10.9 has veclib
		XCODE_CLT_VER := $(shell pkgutil --pkg-info=com.apple.pkg.CLTools_Executables | grep -o 'version: 6')
		ifneq (,$(findstring version: 6,$(XCODE_CLT_VER)))
			BLAS_INCLUDE ?= /System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers/
			LDFLAGS += -framework Accelerate
		else
			BLAS_INCLUDE ?= /System/Library/Frameworks/vecLib.framework/Versions/Current/Headers/
			LDFLAGS += -framework vecLib
		endif
	endif
endif
INCLUDE_DIRS += $(BLAS_INCLUDE)
LIBRARY_DIRS += $(BLAS_LIB)

LIBRARY_DIRS += $(LIB_BUILD_DIR)

後面一句是為了寫.d檔案
# Automatic dependency generation (nvcc is handled separately)
CXXFLAGS += -MMD -MP #生成依賴
##
# build資料夾的子目錄中會有.d檔案,MMD生成這個檔案的前半段:.build.......
# MP生成了後面include ...: 的內容
# 第一次編譯時,會編譯所有檔案,而如果include中的內容由改變時,不會重新生成.d.
##

以build/src/bolb.b為例:

MMD生成了:

.build_debug/src/caffe/blob.o: src/caffe/blob.cpp include/caffe/blob.hpp \
 include/caffe/common.hpp include/caffe/util/device_alternate.hpp \
 /usr/local/cuda/include/cublas_v2.h /usr/local/cuda/include/cublas_api.h \
 /usr/local/cuda/include/driver_types.h \.......................

MP生了:
include/caffe/blob.hpp:
include/caffe/common.hpp:
include/caffe/util/device_alternate.hpp:...................................

然後直到下面定義編譯目標:

這裡,就是make xx的東西了

##############################
# Define build targets
# 定義編譯目標,就是make執行的內容
##############################
# make
#如果make後面什麼都不加,就執行所有的all test clean.....
.PHONY: all test clean docs linecount lint lintclean tools examples $(DIST_ALIASES) \
	py mat py$(PROJECT) mat$(PROJECT) proto runtest \
	superclean supercleanlist supercleanfiles warn everything

# make all
all: $(STATIC_NAME) $(DYNAMIC_NAME) tools examples
....................

以tools為例子,解釋一下這部分做的事情:
tools: $(TOOL_BINS) $(TOOL_BIN_LINKS)
這裡的意思是說,如果你執行make tools,會做:右邊的兩件事情,$(TOOL_BIN)和$(TOOL_BIN_LINKS)其實是兩個規則,具體定義如下:
$(TOOL_BINS): %.bin : %.o | $(DYNAMIC_NAME)
	@ echo CXX/LD -o [email protected]
	$(Q)$(CXX) $< -o [email protected] $(LINKFLAGS) -l$(PROJECT) $(LDFLAGS) \
		-Wl,-rpath,$(ORIGIN)/../lib

檔案中的標識中:[email protected]目標檔案,$^--所有的依賴檔案,$<--第一個依賴檔案。

echo後面的內容,是make後在命令視窗中打印出來的內容

$(Q)在Makefile.config的最後定義:預設不列印後面的內容,將這裡註釋掉,就可以打印出所有內容

# enable pretty build (comment to see full commands)
Q ?= @

%.o:是個萬用字元,表示所有的.o檔案,這幾步是把.o檔案生成.bin檔案

| : 是一種依賴規則:當不存在目標檔案時,所有的依賴都會被執行,生成目標檔案,當存在目標時,若修改依賴中的內容,目標檔案不會被重新建立。即|後面的依賴是一種很弱的依賴,

Makefile中的內容大致就是這樣,現在,註釋掉Makefile.config中的$(Q),執行:

make 2>&1 >out.log 

2是錯誤的輸出,1為正確的輸出,這句的意思是將所有編譯的內容全部輸出到out.log中

將所有內容列印到out.log檔案中,看一下caffe.cpp檔案的執行過程:

CXX tools/caffe.cpp
g++ tools/caffe.cpp -MMD -MP -pthread -fPIC -DDEBUG -g -O0 -DUSE_OPENCV -DUSE_LEVELDB -DUSE_LMDB -I/usr/include/python2.7 -I/usr/lib/python2.7/dist-packages/numpy/core/include -I/usr/local/include -I.build_debug/src -I./src -I./include -I/usr/local/cuda-7.5/include -Wall -Wno-sign-compare -c -o .build_debug/tools/caffe.o 2> .build_debug/tools/caffe.o.warnings.txt \
		|| (cat .build_debug/tools/caffe.o.warnings.txt; exit 1)
CXX/LD -o .build_debug/tools/caffe.bin
g++ .build_debug/tools/caffe.o -o .build_debug/tools/caffe.bin -pthread -fPIC -DDEBUG -g -O0 -DUSE_OPENCV -DUSE_LEVELDB -DUSE_LMDB -I/usr/include/python2.7 -I/usr/lib/python2.7/dist-packages/numpy/core/include -I/usr/local/include -I.build_debug/src -I./src -I./include -I/usr/local/cuda-7.5/include -Wall -Wno-sign-compare -lcaffe -L/home/sindyz/anaconda/lib -L/usr/local/lib -L/usr/lib -L/usr/local/cuda-7.5/lib64 -L/usr/local/cuda-7.5/lib -L.build_debug/lib  -lcudart -lcublas -lcurand -lglog -lgflags -lprotobuf -lboost_system -lboost_filesystem -lm -lhdf5_hl -lhdf5 -lleveldb -lsnappy -llmdb -lopencv_core -lopencv_highgui -lopencv_imgproc -lboost_thread -lstdc++ -lcblas -latlas \
		-Wl,-rpath,\$ORIGIN/../lib
這裡,第一個g++後面的內容,是從.cpp檔案生成.o檔案的過程,可以看到相應的連結庫和配置資訊

第二個g++後面的內容是.o檔案到.bin的生成過程。

由此,我們可以自己寫caffe的程式碼並且配置Makefile了。

初學caffe,由一些地方說明的不清楚的不對的,希望大家一起討論,共同進步。

相關推薦

Caffe學習筆記1):簡單的資料視覺化

caffe的底層是c++寫的,如果要進行資料視覺化,需要藉助其它的庫或者是介面,如opencv,python或者是matlab,python的環境需要自行配置,因為我使用的都是網管同志已經配置好的深度學習伺服器,所以不用管底層的一些配置問題,如果需要自行配置自己

Windows下使用深度學習框架caffe學習筆記1

由於本人大四畢業論文是關於深度學習,因此接觸了caffe框架,但是因為自己電腦是windows平臺,所以想在windows平臺上配置,網上有很多windows caffe的版本,本人試了很多個版本,推薦使用微軟的官方caffe版本,地址https://github.com/

caffe學習筆記3.1 -- caffe的三級結構

在caffe教程中,介紹了caffe的三級結構:Blobs, Layers,Nets.如下圖所示: 深度網路是一個複雜的模型,caffe定義了一個層與層之間連線的網路模型。這個網路定義了從輸入層到損失的所有模型。caffe使用blobs結構儲存,交換和處理網路中正向和反向

caffe學習筆記1.1-- caffe的Makefile檔案

在本文中,描述一下caffe的Makefile檔案,這個檔案用於caffe的編譯;這裡不會把所有檔案都考過來,有些指令碼相似的會省略掉 檔案在caffe根目錄下,因為用到makefile.config中的變數,因此,在用到的時候我會給下說明 首先,是專案名稱 PROJE

caffe學習筆記1:轉化自己的資料為(leveldb/lmdb)檔案

環境:ubuntu16.04 CPU 經過千難萬險將環境配置好之後,MNIST資料集也測試過了,MNIST資料集是通過caffe可以直接獲取資料集,如果我們要處理自己的資料的話,我們就需要做一些轉化了,我們的影象資料往往是圖片檔案,jpg,jpeg,pn

Linux學習筆記1——檔案和目錄管理(硬連線和軟連線)(連結檔,相當於快捷方式)

在這節將要學習linux的連線檔,在之前用"ls -l" 檢視檔案屬性的命令時, 其中第二個屬性是連線數。那麼這個連線數是幹什麼的?這就要理解inode。     先說一下檔案是怎麼儲存的。檔案儲存在硬碟上,硬碟的最小儲存單位叫做"扇區"(Sector),每個扇區儲存512位元

Caffe學習筆記1:linux下建立自己的資料庫訓練和測試caffe中已有網路

本文是基於薛開宇 《學習筆記3:基於自己的資料訓練和測試“caffeNet”》基礎上,從頭到尾把實驗跑了一遍~對該文中不清楚的地方做了更正和說明。 主要工作如下: 1、下載圖片建立資料庫 2、將圖片轉化為256*256的lmdb格式 3、計算影象均值 4、定義網路修改部分引

Groovy學習筆記1)讀取CSV檔案

  本篇分享講展示如何在Groovy中讀取CSV檔案。   我們要讀取的CSV檔案foo.csv的內容如下:   Groovy程式碼如下: //import packages impo

深度學習框架Caffe學習筆記(1)-Caffe環境搭建

Caffe是由伯克利視覺和學習中心開發的基於C++/CUDA/Python實現的卷積神經網路,提供了面向命令列、Matlab、Python的繫結介面。 Caffe環境搭建 系統:Ubuntu16.04 首先安裝Caffe依賴包: $ sudo

Linux系統程式設計學習筆記1)-檔案的I/O操作

概述 在Linux系統下,通常以一個非負整數來代指一個開啟的檔案,這些檔案可以包括終端,socket,裝置,普通檔案等等。規定的三個標準的檔案描述符為0,1,2下面分別介紹(在互動式shell中,這些檔案描述符通常指向shell執行所在的終端): 檔案描述

docker學習筆記4.1-使用Dockerfile檔案構建映象

Dockerfile檔案 Dockerfile 使用基於DSL語法的指令來構建一個Docker映象,之後使用docker build命令基於該Dockerfile的指令構建一個新的映象。 建立Dockerfile檔案 我們必須建立一個目錄來儲存Doc

caffe學習筆記1-win10安裝與測試mnist

windows下caffe的安裝有些麻煩,我折騰了一天終於安裝好caffe並且成功測試了mnist,在此期間遇到了不少坑,特此記錄一下。 安裝caffe caffe的安裝方式一直在變化,我安裝的時候發現不少部落格寫的東西已經有些過時了,所以建議大家在安裝的時

虛擬檔案系統學習筆記1

1 通過虛擬檔案系統,linux可以支援多種檔案系統型別; 2 虛擬檔案系統所隱含的思想是把表示很多不同種類檔案系統的共同資訊放入核心;其中用1個欄位或函式來支援所有支援具體檔案系統所提供的任何操作。 3 VFS支援的檔案系統可以分為3類:磁碟檔案系統、網路檔案系統及特

JAVA學習筆記1)——a++與++a的區別

col int 演示 opera 解析 代碼 數據 ++i div 需求:此博客用於解釋i++與++i的區別。 過程: 1、名稱解釋 ++:自增,即在原有數據基礎上+1,再賦給原有數據。 2、程序演示 (1)代碼: 1 class OperateDemo 2 { 3

【extjs6學習筆記1.1 初始:創建項目

workspace 學習 分享 pps cnblogs log -i 學習筆記 apps 創建工作空間 sencha generate workspace /path/to/workspace 使用sencha創建應用 sencha

【extjs6學習筆記1.2 初始:MVC MVVM

控制 進行 nbsp 例如 ges 如果 image 初始 互動 模型 這表示數據層。該模型可以包含數據驗證和邏輯來保持數據。在 ext js 中, 大多數模型都與一個數據存儲一起使用。 視圖 這表示用戶界面。 是用戶在屏幕上看到的組

vray學習筆記1

com .cn 過程 分組 是把 皮膚 mon image 基本 vray是個什麽東西? 它是個渲染器。 渲染器是個什麽東西? 渲染器就是3d軟件裏面把模型畫成一張圖片的東西,渲染的過程就是把3D物體變成2D畫面的過程。 模型是個什麽東西? 模型就是模型,它由兩部分組成,第

《深入理解C指針》學習筆記1)--- 指針之外

結構 def form 學習 編程 stdlib.h struct 一個 char   C語言從誕生之初就非常善於和硬件打交道,經過這麽多年的發展之後,其靈活性和超強的特征是受到幾乎所有程序員的肯定。C語言的這種靈活性很大一部分程度來源與C指針,指針為C語言動態操控內存提供

【extjs6學習筆記1.7 初始:加載第三方庫

sum pro eve owa spec expect mapview cap ply https://www.sencha.com/blog/integrating-ext-js-with-3rd-party-libraries-2/ Introduction

【extjs6學習筆記1.9 初始: Mixins

另一個 筆記 extjs 微軟 mage extjs6 名稱 img pan Mixin允許我們使用一個類的函數作為另一個類的函數而不繼承。 Mixins可以使用mixins關鍵字定義,並將值指定為JSON對象,其中屬性的名稱應該是要使用的方法的名稱,屬性的值