<code class="hljs php has-numbering"><span class="hljs-keyword">const</span> Dtype* cpu_data() <span class="hljs-keyword">const</span>;
Dtype* mutable_cpu_data();
(similarly <span class="hljs-keyword">for</span> gpu <span class="hljs-keyword">and</span> diff).</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>
<code class="hljs r has-numbering">// 假设刚开始数据存储在CPU中,我们定义了一个Blob
const Dtype* foo;
Dtype* bar;
foo = blob.gpu_data(); // 数据复制:cpu->gpu
foo = blob.cpu_data(); // 没有数据复制过程,因为数据都是最新的
bar = blob.mutable_gpu_data(); // 没有数据复制过程
// <span class="hljs-keyword">...</span> 一些中间操作 <span class="hljs-keyword">...</span>
bar = blob.mutable_gpu_data(); // 如果此时还是GPU模式,没有数据复制过程
foo = blob.cpu_data(); // 数据复制:gpu->cpu, 如果GPU更改过数据
foo = blob.gpu_data(); // 没有数据复制过程,因为数据都是最新的
bar = blob.mutable_cpu_data(); // 没有数据复制过程
bar = blob.mutable_gpu_data(); // 数据复制:cpu->gpu
bar = blob.mutable_cpu_data(); // 数据复制:gpu->cpu</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li></ul>
可以如下定义:
<code class="hljs css has-numbering"><span class="hljs-tag">name</span>: "<span class="hljs-tag">LogReg</span>"
<span class="hljs-tag">layer</span> <span class="hljs-rules">{
<span class="hljs-rule"><span class="hljs-attribute">name</span>:<span class="hljs-value"> <span class="hljs-string">"mnist"</span>
type: <span class="hljs-string">"Data"</span>
top: <span class="hljs-string">"data"</span>
top: <span class="hljs-string">"label"</span>
data_param {
source: <span class="hljs-string">"input_leveldb"</span>
batch_size: <span class="hljs-number">64</span>
</span></span></span>}
}
<span class="hljs-tag">layer</span> <span class="hljs-rules">{
<span class="hljs-rule"><span class="hljs-attribute">name</span>:<span class="hljs-value"> <span class="hljs-string">"ip"</span>
type: <span class="hljs-string">"InnerProduct"</span>
bottom: <span class="hljs-string">"data"</span>
top: <span class="hljs-string">"ip"</span>
inner_product_param {
num_output: <span class="hljs-number">2</span>
</span></span></span>}
}
<span class="hljs-tag">layer</span> <span class="hljs-rules">{
<span class="hljs-rule"><span class="hljs-attribute">name</span>:<span class="hljs-value"> <span class="hljs-string">"loss"</span>
type: <span class="hljs-string">"SoftmaxWithLoss"</span>
bottom: <span class="hljs-string">"ip"</span>
bottom: <span class="hljs-string">"label"</span>
top: <span class="hljs-string">"loss"</span>
</span></span></span>}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li></ul>
<code class="hljs css has-numbering"><span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.931977</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:39</span>] <span class="hljs-tag">Initializing</span> <span class="hljs-tag">net</span> <span class="hljs-tag">from</span> <span class="hljs-tag">parameters</span>:
<span class="hljs-tag">name</span>: "<span class="hljs-tag">LogReg</span>"
<span class="hljs-attr_selector">[...model prototxt printout...]</span>
# <span class="hljs-tag">construct</span> <span class="hljs-tag">the</span> <span class="hljs-tag">network</span> <span class="hljs-tag">layer-by-layer</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.932152</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:67</span>] <span class="hljs-tag">Creating</span> <span class="hljs-tag">Layer</span> <span class="hljs-tag">mnist</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.932165</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:356</span>] <span class="hljs-tag">mnist</span> <span class="hljs-tag">-</span>> <span class="hljs-tag">data</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.932188</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:356</span>] <span class="hljs-tag">mnist</span> <span class="hljs-tag">-</span>> <span class="hljs-tag">label</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.932200</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:96</span>] <span class="hljs-tag">Setting</span> <span class="hljs-tag">up</span> <span class="hljs-tag">mnist</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.935807</span> 2079114000 <span class="hljs-tag">data_layer</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:135</span>] <span class="hljs-tag">Opening</span> <span class="hljs-tag">leveldb</span> <span class="hljs-tag">input_leveldb</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.937155</span> 2079114000 <span class="hljs-tag">data_layer</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:195</span>] <span class="hljs-tag">output</span> <span class="hljs-tag">data</span> <span class="hljs-tag">size</span>: 64,1,28,28
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.938570</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:103</span>] <span class="hljs-tag">Top</span> <span class="hljs-tag">shape</span>: 64 1 28 28 (50176)
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.938593</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:103</span>] <span class="hljs-tag">Top</span> <span class="hljs-tag">shape</span>: 64 (64)
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.938611</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:67</span>] <span class="hljs-tag">Creating</span> <span class="hljs-tag">Layer</span> <span class="hljs-tag">ip</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.938617</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:394</span>] <span class="hljs-tag">ip</span> <<span class="hljs-tag">-</span> <span class="hljs-tag">data</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.939177</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:356</span>] <span class="hljs-tag">ip</span> <span class="hljs-tag">-</span>> <span class="hljs-tag">ip</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.939196</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:96</span>] <span class="hljs-tag">Setting</span> <span class="hljs-tag">up</span> <span class="hljs-tag">ip</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.940289</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:103</span>] <span class="hljs-tag">Top</span> <span class="hljs-tag">shape</span>: 64 2 (128)
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.941270</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:67</span>] <span class="hljs-tag">Creating</span> <span class="hljs-tag">Layer</span> <span class="hljs-tag">loss</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.941305</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:394</span>] <span class="hljs-tag">loss</span> <<span class="hljs-tag">-</span> <span class="hljs-tag">ip</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.941314</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:394</span>] <span class="hljs-tag">loss</span> <<span class="hljs-tag">-</span> <span class="hljs-tag">label</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.941323</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:356</span>] <span class="hljs-tag">loss</span> <span class="hljs-tag">-</span>> <span class="hljs-tag">loss</span>
# <span class="hljs-tag">set</span> <span class="hljs-tag">up</span> <span class="hljs-tag">the</span> <span class="hljs-tag">loss</span> <span class="hljs-tag">and</span> <span class="hljs-tag">configure</span> <span class="hljs-tag">the</span> <span class="hljs-tag">backward</span> <span class="hljs-tag">pass</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.941328</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:96</span>] <span class="hljs-tag">Setting</span> <span class="hljs-tag">up</span> <span class="hljs-tag">loss</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.941328</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:103</span>] <span class="hljs-tag">Top</span> <span class="hljs-tag">shape</span>: (1)
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.941329</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:109</span>] <span class="hljs-tag">with</span> <span class="hljs-tag">loss</span> <span class="hljs-tag">weight</span> 1
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.941779</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:170</span>] <span class="hljs-tag">loss</span> <span class="hljs-tag">needs</span> <span class="hljs-tag">backward</span> <span class="hljs-tag">computation</span>.
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.941787</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:170</span>] <span class="hljs-tag">ip</span> <span class="hljs-tag">needs</span> <span class="hljs-tag">backward</span> <span class="hljs-tag">computation</span>.
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.941794</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:172</span>] <span class="hljs-tag">mnist</span> <span class="hljs-tag">does</span> <span class="hljs-tag">not</span> <span class="hljs-tag">need</span> <span class="hljs-tag">backward</span> <span class="hljs-tag">computation</span>.
# <span class="hljs-tag">determine</span> <span class="hljs-tag">outputs</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.941800</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:208</span>] <span class="hljs-tag">This</span> <span class="hljs-tag">network</span> <span class="hljs-tag">produces</span> <span class="hljs-tag">output</span> <span class="hljs-tag">loss</span>
# <span class="hljs-tag">finish</span> <span class="hljs-tag">initialization</span> <span class="hljs-tag">and</span> <span class="hljs-tag">report</span> <span class="hljs-tag">memory</span> <span class="hljs-tag">usage</span>
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.941810</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:467</span>] <span class="hljs-tag">Collecting</span> <span class="hljs-tag">Learning</span> <span class="hljs-tag">Rate</span> <span class="hljs-tag">and</span> <span class="hljs-tag">Weight</span> <span class="hljs-tag">Decay</span>.
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.941818</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:219</span>] <span class="hljs-tag">Network</span> <span class="hljs-tag">initialization</span> <span class="hljs-tag">done</span>.
<span class="hljs-tag">I0902</span> 22<span class="hljs-pseudo">:52</span><span class="hljs-pseudo">:17</span><span class="hljs-class">.941824</span> 2079114000 <span class="hljs-tag">net</span><span class="hljs-class">.cpp</span><span class="hljs-pseudo">:220</span>] <span class="hljs-tag">Memory</span> <span class="hljs-tag">required</span> <span class="hljs-tag">for</span> <span class="hljs-tag">data</span>: 201476</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li></ul>
-注意:网络结构是设备无关的,Blob和Layer=隐藏了模型定义的具体实现细节。定义网络结构后,可以通过Caffe::mode()或者Caffe::set_mode()在CPU和GPU模式间切换。Layer在CPU和GPU模式下运算的结果是一致的(忽略计算误差)。CPU和GPU模式间是无缝切换的,并且独立于模型定义。