<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[Lazy Cser - 日志]]></title>
<link>http://www.bkkss.com/</link>
<description><![CDATA[Extremely tired...]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog2 v2.4]]></copyright>
<webMaster><![CDATA[wbccccc#gmail.com(Bill Wu)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>Lazy Cser</title> 
	<url>http://www.bkkss.com/images/logos.gif</url> 
	<link>http://www.bkkss.com/</link> 
	<description>Lazy Cser</description> 
</image>

			<item>
			<link>http://www.bkkss.com/default.asp?id=435</link>
			<title><![CDATA[Neural Network Project]]></title>
			<author>wbccccc#gmail.com(wbc)</author>
			<category><![CDATA[日志]]></category>
			<pubDate>Sat,12 Dec 2009 16:52:12 +0800</pubDate>
			<guid>http://www.bkkss.com/default.asp?id=435</guid>	
		<description><![CDATA[上了一個學期的CSC3230，對於AI有了初步瞭解，前期課程比較悶，入肉的是最後的Neural Network，終於見到AI的強大。<br/>學期完了，但還要交project，這些project也費事找group mate了，自己單拖，可惜對於NN的掌握還不太熟悉，tutor又無去過，做起來非常迷茫，通過分析那字字珠璣的project spec. 慢慢摸著石頭過河，也有了少少進展。<br/>今日又在google搵到篇非常簡單易明的Backward Propagation的文章，興奮不已，必須收藏。<br/><br/>ref. http://clemens.bytehammer.com/papers/BackProp/index.html<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.bkkss.com/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用內容"/> 引用內容</div><div class="UBBContent"><br/>        <strong>Backward Propagation Tutorial</strong> <br/>     <br/>   <br/>    <br/>  <strong><u>Introduction</u></strong> <br/>  Backward Propagation is probably the most common method for <br/>    training forward-feed neural networks. A forward pass using an input pattern <br/>    propagates through the network and produces an actual output. The backward <br/>    pass uses the desired outputs corresponding to the input pattern and updates <br/>    the weights according to the error signal. <br/>  There are hundreds of papers covering the subject of backward <br/>    propagation. Unfortunately, many of them tend to exhibit a vast stockpile <br/>    of equations and complicated partial derivatives with undefined variables <br/>    to explain a concept that is really quite simple. Quite often, a pseudocode <br/>    algorithm or an example with pictures is the most effiecient method to convey <br/>    information. <br/>  <strong><u>Artificial Neuron Anatomy</u></strong> <br/>  <span id="94847802.56"><a href="http://clemens.bytehammer.com/papers/backprop/neuron_anatomy.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/neuron_anatomy.gif" border="0"  onload="document.getElementById('94847802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('94847802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/neuron_anatomy.gif target=_blank >打開圖片失敗.</a>'" > <br/>    <br/>  w --&gt; weight<br/> <br/>    I --&gt; input<br/> <br/>    O --&gt; output<br/> <br/>    A --&gt; activation value <br/>  Think of the activations as a pulses of electricity traveling <br/>    along the dendrite path. Each activation pulse is multiplied by the weight <br/>    of the dendrite it is traveling along. When all inputs to the neuron have <br/>    been &#34;stimulated&#34; with this pulse, the neuron adds up these products <br/>    and performs a thresholding or &#34;squashing&#34; operation on the resulting <br/>    sum. The result of the squashing function is then sent to each of its output <br/>    dendrites and the process is repeated for each neuron on the receiving end. <br/>  Thus, the net input of each neuron is: <br/>  (EQU 1)         <span id="86547802.56"><a href="http://clemens.bytehammer.com/papers/backprop/netin.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/netin.gif" border="0"  onload="document.getElementById('86547802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('86547802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/netin.gif target=_blank >打開圖片失敗.</a>'" > <br/>  Read this equation as: The net input of a neuron is the sum <br/>    of (all weights connected as inputs to the neuron * all activation values <br/>    of the neurons at the end of those inputs) <br/>   <br/>     <br/>   <br/>   <br/>     <br/>      <strong>i</strong> refers to a neuron that is an input to the neuron <br/>        we&#39;re looking at. (PREVIOUS) <br/>     <br/>     <br/>      <strong>j </strong>is the node we&#39;re currently looking at. (CURRENT) <br/>     <br/>     <br/>      <strong>k</strong> refers to a neuron that is an output to the neuron <br/>        we&#39;re looking at. (NEXT) <br/>     <br/>   <br/>  In the above diagram, the <strong>netin</strong> for the neuron would <br/>    be: <br/>  <i>netin</i> <br/>    = (<i>w0</i> * <i>A0</i>) + (<i>w1</i> * <i>A1</i>) + (<i>w2</i> * <i>A2</i>); <br/>  <strong><u>The Activation Function</u></strong> <br/>  The most common squashing function is the sigmoidal function <br/>    defined as: <br/>  (EQU 2)         <span id="64547802.56"><a href="http://clemens.bytehammer.com/papers/backprop/sigmoid_equation.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/sigmoid_equation.gif" border="0"  onload="document.getElementById('64547802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('64547802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/sigmoid_equation.gif target=_blank >打開圖片失敗.</a>'" >which <br/>    might look something like this if you graphed it on your TI-82 using F = 5: <br/>    <span id="4047802.56"><a href="http://clemens.bytehammer.com/papers/backprop/sigmoid.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/sigmoid.gif" border="0"  onload="document.getElementById('4047802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('4047802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/sigmoid.gif target=_blank >打開圖片失敗.</a>'" >  <br/>  <strong>F</strong> is a factor that determines the pitch or &#34;steepness&#34; <br/>    of the function&#39;s graph. The sigmoid function will take an input and &#34;squash&#34; <br/>    it so that it&#39;s output is between 0 and 1. <br/>    <br/>  So now we know how find <strong>netin </strong>for the neuron and use <br/>    it to give us an activation pulse <strong>A</strong> using <strong>Act(netin)</strong>. <br/>  <strong><u>The Forward Pass</u></strong> <br/>  Consider the following network: <br/>  <span id="85447802.56"><a href="http://clemens.bytehammer.com/papers/backprop/network_tutorial.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/network_tutorial.gif" border="0"  onload="document.getElementById('85447802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('85447802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/network_tutorial.gif target=_blank >打開圖片失敗.</a>'" > <br/>  For the forward pass, the only neuron variables we are interested <br/>    in are <strong>netin </strong>and <strong>A</strong>. Throughout the forward pass, all weights <br/>    (<strong>W</strong>) remain constant -- the only values that ever change are <strong>netin</strong> <br/>    and our activation pulse <strong>A</strong>. <br/> <br/> <br/>   <br/>    Nodes 1 and 2 are input nodes. <br/>   <br/>   <br/>    Nodes 3 and 4 are hidden nodes. <br/>   <br/>   <br/>    Nodes 5 and 6 are output nodes. <br/>   <br/> <br/> <br/>  The object of a forward pass is to give input nodes 1 and 2 <br/>    your input pattern, and then compute <strong>netin</strong> and activation <strong>A</strong> <br/>    for each node. At the end of the pass, output nodes 5 and 6 will hold activation <br/>    values that essentially tell you what the network thinks the answer is.  <br/> <br/>At the start of a forward pass, nodes 1 and 2 are given input values. <br/> <i>Node1.A</i> = some input <br/>  pattern bit<br/> <br/>  <i>Node2.A</i> = some input pattern bit <br/> <br/>  Then recalling equations 1 and 2, we can compute <i>Node3.netin</i> <br/>    and <i>Node4.netin<strong> </strong></i> by the following: <br/>  (EQU 1)         <span id="86547802.56"><a href="http://clemens.bytehammer.com/papers/backprop/netin.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/netin.gif" border="0"  onload="document.getElementById('86547802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('86547802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/netin.gif target=_blank >打開圖片失敗.</a>'" > <br/>   <i>Node3.netin</i><strong><i> <br/>    </i></strong><i><strong>=</strong></i><strong> </strong>(<i>Node1.A</i><strong>*</strong><i><strong> <br/>    </strong>W13</i>) + (<i>Node2.A</i><strong> *</strong><i><strong> <br/>    </strong>W23</i>)<br/> <br/>    <i>Node4.netin<strong> </strong></i><i><strong>=</strong></i><strong> </strong>(<i>Node1.A</i><strong>*</strong><i><strong> <br/>    </strong>W14</i>) + (<i>Node2.A</i><strong> *</strong><i><strong> <br/>    </strong>W24</i>)  <br/>  Now that we know the <strong>netin</strong> values for <br/>    neurons 3 and 4, we can use the threshold function to find their activation <br/>    values. <br/>  (EQU 2)         <span id="64547802.56"><a href="http://clemens.bytehammer.com/papers/backprop/sigmoid_equation.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/sigmoid_equation.gif" border="0"  onload="document.getElementById('64547802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('64547802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/sigmoid_equation.gif target=_blank >打開圖片失敗.</a>'" > <br/>  <i>Node3.A <br/>    </i>= 1 / (1 + e^(-<i>F</i> <br/>    * <i>Node3.netin</i>))<br/> <br/>    <i>Node4.A </i>= 1 / (1 + e^(-<i>F</i> * <i>Node4.netin</i>)) <br/>      <br/>  Now we can do the exact same things we just did above to give <br/>    us the activation values of neurons 5 and 6. <br/>  <i>Node5.netin</i><strong><i> <br/>    </i></strong><i><strong>=</strong></i><strong> </strong>(<i>Node3.A</i><strong> <br/>    *</strong><i><strong> </strong>W35</i>) + (<i>Node4.A</i><strong>*</strong><i><strong> <br/>    </strong>W45</i>)<br/> <br/>    <i>Node6.netin</i><i><strong>=</strong></i><strong> </strong>(<i>Node3.A</i><strong> *</strong><i><strong> <br/>    </strong>W36</i>) + (<i>Node4.A</i><strong>*</strong><i><strong> <br/>    </strong>W46</i>)  <br/>  <i>Node5.A</i>= <br/>    1 / (1 + e^(-<i>F</i> * <i>Node5.netin</i>))<br/> <br/>    <i>Node6.A</i> = 1 / (1 + e^(-<i>F</i> * <i>Node6.netin</i>)) <br/>  Done! <i>A5</i> <br/>    and <i>A6</i> are the outputs <br/>    of our network after a forward pass. <br/>  <strong><u>The Backward Pass</u></strong> <br/>  In the backward pass, we are given the desired outputs and propagate <br/>    backward through the network updating weight values for each dendrite. You <br/>    should perform a forward pass before running a backward pass. During a backward <br/>    pass, the variables <strong>A</strong> and <strong>netin</strong> remain constant and the values <br/>    that change are <strong>§</strong>, <strong>netout</strong>, <strong>D</strong> and <strong>W</strong>. A backward <br/>    pass takes one parameter -- the desired output (<strong>D</strong>) that you think the <br/>    previous input given in the forward pass should have produced as an output. <br/> <br/> <br/>   <br/>    <strong>§ </strong>Is the error signal at each neuron. It emulates <br/>      a pulse much like the activation value <strong>A</strong> in forward propagation. <br/>      <br/> <br/>      (I couldn&#39;t find a greek delta in html -- so pretend it&#39;s the same delta <br/>      in the network diagram above.) <br/>   <br/>   <br/>    <strong>netout</strong> is the sum of all output products for a neuron. <br/>      It is much like the <strong>netin</strong> in forward propagation. <br/>   <br/>   <br/>    <strong>Wjk</strong> is the weight of a particular <br/>      dendrite between neuron <strong>j</strong> and a neuron <strong>k</strong> that is an ouput <br/>      of neuron <strong>j</strong>. <br/>   <br/>  <strong>D</strong> is the given desired value (used only on ouput nodes). (as the <br/>    &#34;trainer&#34;, you provide this value) <br/>  <strong>A</strong> is the activation value that was calculated for each node during <br/>    the forward pass. <br/>  <strong>netin</strong> is the sum of all input units that was calculated for each <br/>    neuron during the forward pass. <br/>  <strong>F</strong> is a constant that specifies the slope/pitch of the sigmoidal function. <br/>  <strong><i>n</i></strong> (neta) is a constant that determines the learning rate of <br/>    the network. <br/> <br/>For the <u>output nodes</u>, <strong>netout</strong> is not computed, (there are no outputs <br/>  on an output node). So for an output node, we set our <strong>netout</strong> to be the <br/>  difference between our desired output and the actual output that the network <br/>  gave when we did our last forward pass. <br/>(EQU 3)         <span id="14347802.56"><a href="http://clemens.bytehammer.com/papers/backprop/netout_out.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/netout_out.gif" border="0"  onload="document.getElementById('14347802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('14347802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/netout_out.gif target=_blank >打開圖片失敗.</a>'" > <br/>Calculating <strong>netout</strong> in our example network above for nodes 5 and 6 is <br/>  as easy as: <br/><i>Node5.netout</i> = (<i>Node5.D</i> <br/>  - <i>Node5.A</i>)<br/> <br/>  <i>Node6.netout</i> = (<i>Node6.D</i> - <i>Node6.A</i>) <br/>To find the error signal for any neuron, we calculate an error using: <br/>(EQU 4)        <span id="81147802.56"><a href="http://clemens.bytehammer.com/papers/backprop/errsig.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/errsig.gif" border="0"  onload="document.getElementById('81147802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('81147802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/errsig.gif target=_blank >打開圖片失敗.</a>'" > <br/>As you recall from our forward pass our sigmoidal activation function is: <br/>(EQU 2)         <span id="64547802.56"><a href="http://clemens.bytehammer.com/papers/backprop/sigmoid_equation.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/sigmoid_equation.gif" border="0"  onload="document.getElementById('64547802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('64547802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/sigmoid_equation.gif target=_blank >打開圖片失敗.</a>'" > <br/>Taking the derivative of <strong>Act(netin)</strong> gives us: <br/>(EQU 5)        <span id="55947802.56"><a href="http://clemens.bytehammer.com/papers/backprop/sigmoid_equ_deriv.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/sigmoid_equ_deriv.gif" border="0"  onload="document.getElementById('55947802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('55947802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/sigmoid_equ_deriv.gif target=_blank >打開圖片失敗.</a>'" > <br/>Substituting this into EQU 4 we get: <br/>(EQU 4)        <span id="29647802.56"><a href="http://clemens.bytehammer.com/papers/backprop/errsig_simplified.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/errsig_simplified.gif" border="0"  onload="document.getElementById('29647802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('29647802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/errsig_simplified.gif target=_blank >打開圖片失敗.</a>'" > <br/>This simplified version is the official equation we&#39;ll use for updating our <br/>  error signals (<strong>§</strong>). So, in the case <br/>  of our network above, we can find the error signals of the two output nodes <br/>  5 and 6 by: <br/><i>Node5.§</i> = <i>Node5.A <br/>  * </i>(1 - <i>Node5.A</i>) * <i>Node5.netout</i><br/> <br/>  <i>Node6.§</i> =<i> Node6.A * </i>(1 - <i>Node6.A</i>) * <i>Node6.netout</i> <br/>The error in a neuron is used to update all of its input dendrites&#39; weights <br/>  using the following equation: <br/>(EQU 5)        <span id="82047802.56"><a href="http://clemens.bytehammer.com/papers/backprop/weight_update.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/weight_update.gif" border="0"  onload="document.getElementById('82047802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('82047802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/weight_update.gif target=_blank >打開圖片失敗.</a>'" > <br/>Since we have the error signals <i>Node5.§</i> and<i> </i><i>Node6.§</i> <br/>  we can use this equation with neurons 3 and 4 in the diagram to update their <br/>  input weights. <br/><i>W35</i> <br/>  = <i>W35</i> + <i>n * Node5.§ * Node3.A</i><br/> <br/>  <i>W36</i> = <i>W36</i> + <i>n * <br/>  Node6.§ * Node3.A</i><br/> <br/>  <i>W45</i> = <i>W45</i> + <i>n * <br/>  Node5.§ * Node4.A</i><br/> <br/>  <i>W46</i> = <i>W46</i> + <i>n * <br/>  Node6.§ * Node4.A</i> <br/>The method for calculating the general <strong>netout</strong> for all non-ouput nodes <br/>  is much like finding the general <strong>netin</strong> on a forward pass <br/>(EQU 6)        <span id="24947802.56"><a href="http://clemens.bytehammer.com/papers/backprop/netout.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/netout.gif" border="0"  onload="document.getElementById('24947802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('24947802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/netout.gif target=_blank >打開圖片失敗.</a>'" > <br/>Implementing this with our example network diagram above, we calculate our <br/>  <strong>netout</strong> variables via: <br/><i>Node3.netout</i><strong><i> <br/>  </i></strong><i><strong>=</strong></i><strong> </strong>(<i>W35 <br/>  * Node5.§</i>) + (<i>W36 <br/>  </i>* <i>Node6.§</i>)<br/> <br/>  <i>Node4.netout</i><i><strong> =</strong></i><strong> </strong>(<i>W45 <br/>  * Node5.§</i>) + (<i>W46</i> <br/>  * <i>Node6.§</i>) <br/>And use the <strong>netout</strong> variables to calculate our error signals <br/>  <strong>§</strong><i>.</i> <br/><i>Node3.§</i> = <i>Node3.A</i> <br/>  * (1 - <i>Node3.A</i>) * <i>Node3.netout</i><strong><i><br/> <br/>  </i></strong><i>Node4.§</i> = <i>Node4.A</i> * (1 - <i>Node4.A</i>) * <i>Node4.netout</i> <br/>At this point, all equations have been introduced, and we continue back-propagating <br/>  by calculating each neuron&#39;s <strong>netout</strong> and <strong>§</strong>, <br/>  and then<strong> </strong>then updating its output weights until the entire network <br/>  is updated. Continuing our example, we move on to nodes 1 and 2 and update their <br/>  output weights as follows: <br/><i>W13</i> <br/>  = <i>W13</i> + <i>n * Node3.§ * Node1.A</i> <br/> <br/>  <i>W14</i> = <i>W14</i> + <i>n * <br/>  Node4.§ * Node1.A</i> <br/> <br/>  <i>W23</i> = <i>W23</i> + <i>n * <br/>  Node3.§ * Node2.A</i><br/> <br/>  <i>W24</i> = <i>W24</i> + <i>n * <br/>  Node4.§ * Node2.A</i> <br/>If neurons 1 and 2 were hidden nodes, we would compute their error signals, <br/>  and keep going. However, since1 and 2 are input nodes and we have already updated <br/>  all weights in the network, there is no need to continue. That&#39;s all there is <br/>  to it! <br/><strong><u>Network Structure and Variations</u></strong> <br/><strong>Bi-connection</strong>: Most networks are bi-connected so that each layer is <br/>  fully connected with the layers immediately before and after it. <br/><strong>Biases:</strong> To help &#34;normalize&#34; a neural network, most networks <br/>  have bias nodes connected as an input to each non-input neuron. You initialize <br/>  their dendrite weights in the same way as any other neuron, and give them an <br/>  initial activation value of -1 or 1. Treat them as you would treat a neuron <br/>  in the input layer and update their dendrite weights during back-propagation <br/>  just as you would update the weights of any other dendrite. <br/><strong>Initialization</strong>: The simplest way to initialize a network&#39;s weights is <br/>  using small random values, say between +- 0.5. It doesn&#39;t matter how you initialize <br/>  the activation values, error signals, or any other parameters specific to a <br/>  neuron because they are over-written during the propagation processes. Two guys <br/>  named Nguyen and Widrow came up with an initialization scheme that seems to <br/>  help the network converge a bit faster. <br/>F = ((0.7h^(1/i))/R)<br/> <br/>  BiasWeights = +-F<br/> <br/>  All Other Weights = F <br/>F = the weight scale factor.<br/> <br/>  R is the range of input values<br/> <br/>  h = # of hidden neurons<br/> <br/>  i = # of input neurons<br/> <br/>  w = weight <br/><strong>The Squashing Function</strong>: Although the most popular thresholding technique <br/>  uses the sigmoidal method, there are several other functions that might yield <br/>  a better result in a particular situation. Some networks such as ANFIS use a <br/>  fuzzy logic lookup table to appropriately modify the type of sigmoidal function <br/>  as the network is trained. As far as I know, almost all activation functions <br/>  are continuous and differentiable to allow the backward propagation to calculate <br/>  the gradient error signal. <br/>Here is a variation that allows you to adjust the asymptotes of the sigmoid function <br/>  so that it produces an output in any given desired range: <br/>[(-L - H) / (1 + e^(-F * netin))] + L <br/>L --&gt; the low boundary<br/> <br/>  H --&gt; the high boundary<br/> <br/>  F --&gt; the steepness/pitch factor <br/><strong><u>Classification encoding schemes</u></strong> <br/>A common use of neural networks is for classification of items. The object <br/>  is to take the data from a number of known samples, enter it as inputs to the <br/>  network and use backward propagation to train the network so that it later it <br/>  can correctly classify each sample. So once you have the back-prop algorithms <br/>  coded up, the next step is to figure out how to encode your information so that <br/>  the network outputs a meaningful value. There are many ways in which you can <br/>  encode your information, but there are two schemes that seem to be the most <br/>  popular for class separation. <br/><strong>Variables</strong> <br/> <br/>  <strong>Cc </strong>is the number of classes that you want to distinguish. (Class <br/>    Count) <br/>  <strong>Ci</strong> is the class index. <br/>  <strong>A</strong> is the output activation value. In this section it will always <br/>    refer to the activation value of the output neuron. (METHOD 1) <br/>  <strong>{A} </strong>is a set of activation values for all output neurons (METHOD <br/>    2)  <br/>  <strong>D</strong> is the given desired value for the output node (as the &#34;trainer&#34;, <br/>    you provide this value when training). <br/> <br/>We will use an common example throughout this section. Lets say that we want <br/>  the network to classify each sample as either type 0, 1, 2, 3, or 4. (5 total <br/>  classes)  <br/><strong>METHOD 1 -- One output neuron for all classes</strong> <br/>The object here is to train the network so that the neuron&#39;s output activation <br/>  value <strong>A</strong>, (usually between 0 and 1), can be divided into a specified number <br/>  of classes. <br/><span id="49147802.56"><a href="http://clemens.bytehammer.com/papers/backprop/scale.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/scale.gif" border="0"  onload="document.getElementById('49147802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('49147802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/scale.gif target=_blank >打開圖片失敗.</a>'" > <br/>=====Identification==== <br/>To get the class index <strong>Ci</strong> of a given activation value <strong>A</strong>, you <br/>  would use the formula: <br/>(EQU 7)<strong>       Ci</strong> = floor(<strong>A / </strong>(1.0 <br/>  / <strong>Cc</strong>)) <br/>Using our example, the following mapping shows how to convert an activation <br/>  value <strong>A</strong> into the corresponding class index <strong>Ci</strong>: <br/><strong>A</strong> Range         Class Index <br/>  (<strong>Ci</strong>)<br/> <br/>  0.00-0.20 --&gt; 0<br/> <br/>  0.21-0.40 --&gt; 1<br/> <br/>  0.41-0.60 --&gt; 2<br/> <br/>  0.61-0.80 --&gt; 3<br/> <br/>  0.81-1.00 --&gt; 4 <br/>You can use this code to convert the output neuron&#39;s activation value <strong>A</strong> <br/>  into a class index <strong>Ci</strong>. <br/>[blockquote] <br/>  // given the output neuron&#39;s activation output (dAct), <br/>    and the # of classes, return it&#39;s corresponding index<br/> <br/>    static int ClassGetIndex(double dAct, int nNumClasses) {<br/> <br/>              return (int)(dAct <br/>    / (1.0 / (double)nNumClasses));<br/> <br/>    } <br/>[/blockquote] <br/>So for example, if the network&#39;s output node&#39;s activation value <strong>A</strong> is <br/>  0.34, then to find the corresponding index we use (EQU 7): <br/>In our example there are 5 total classes (0 to 4), so <strong>Cc</strong> is 5.<br/> <br/>  <strong>Ci</strong> = floor(0.43 / (1.0 / 5))<br/> <br/>  <strong>Ci</strong> = 1 <br/>**note that we can easily check using the above map to see that 0.21 &lt; 0.34 <br/>  &lt; 0.40<br/> <br/>  <br/> <br/>  int nClassIdx = GetClassIndex(0.43, 5); // puts type 1 into nClassIdx. <br/>=====Training==== <br/>When training the network, you would use the value that is in the &#34;middle&#34; <br/>  of a class division to determine the desired value (<strong>D</strong>). When training, <br/>  you know Ci, and want to find out what value D should be to ensure optimal training <br/>  so that accurate identification is possible when the same inputs are used later. <br/>  To get <strong>D</strong>, you would use the formula: <br/>(EQU 8)    <strong> D</strong> = (<strong>Ci</strong> * (1.0 / <strong>Cc</strong>)) <br/>  + (1.0 / <strong>Cc</strong> / 2.0) <br/>Here is a mapping table for our example: <br/><strong>Ci</strong>       <strong>D</strong><br/> <br/>  0 --&gt; 0.1<br/> <br/>  1 --&gt; 0.3<br/> <br/>  2 --&gt; 0.5<br/> <br/>  3 --&gt; 0.7<br/> <br/>  4 --&gt; 0.9<br/> <br/> <br/>You can use the following code to convert class index <strong>Ci</strong> to a desired <br/>  value <strong>D</strong> <br/>[blockquote] <br/>  // given a class index and the # of classes, returns <br/>    the &#34;desired&#34; value<br/> <br/>    static double ClassGetDesired(int nClassIdx, int nClassCnt) {<br/> <br/>               return (nClassIdx <br/>    * (1.0 / (double)nClassCnt)) + (1.0 / (double)nClassCnt / 2.0);<br/> <br/>    } <br/>[/blockquote] <br/>So in our example, if you were training and you happen to know that a certain <br/>  set of inputs are supposed to correspond to class index 3, you would use EQU <br/>  8 to find out what value should be used for <strong>D</strong> during backward propagation <br/>  training. <br/>In our example there are 5 total classes (0 to 4), so <strong>Cc</strong> is 5.<strong><br/> <br/>  D</strong> = (3 * (1.0 / 5)) + (1.0 / 5 / 2.0)<br/> <br/>  <strong>D</strong> = 0.7 <br/>double dDesired = ClassGetDesired(3, 5); // puts 0.7 into dDesired <br/><strong>METHOD 2 -- One output neuron for each class</strong> <br/>The object is to use multiple output neurons, where each output neuron corresponds <br/>  to a specific class and the &#34;winner&#34; is the one with the largest value. <br/><span id="76647802.56"><a href="http://clemens.bytehammer.com/papers/backprop/method2.gif" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://clemens.bytehammer.com/papers/backprop/method2.gif" border="0"  onload="document.getElementById('76647802.56').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('76647802.56').innerHTML='<a href=http://clemens.bytehammer.com/papers/backprop/method2.gif target=_blank >打開圖片失敗.</a>'" > <br/>=====Identification==== <br/>In our example, for identification, we would use the following mapping scheme: <br/>LLLLH --&gt; 0<br/> <br/>  LLLHL --&gt; 1<br/> <br/>  LLHLL --&gt; 2<br/> <br/>  LHLLL --&gt; 3<br/> <br/>  HLLLL --&gt; 4 <br/>Where H is the largest value, and the L&#39;s are low values. <br/>To get the class index <strong>Ci</strong> of a given set of activation values <strong>A</strong>, <br/>  you would look at the activation value for each neuron and determine the index <br/>  of the largest one. The output neuron with the highest activation value is considered <br/>  the &#34;winner&#34;. <br/>For coding, lets put each output neuron&#39;s activation value into a slot in a <br/>  dynamically allocated array. Then we can find the largest value in the array <br/>  and get its index to convert an activation value <strong>A</strong> into a class index <br/>  <strong>Ci</strong>. <br/>[blockquote] <br/>  // given the neural network&#39;s outputs, and # of classes,<br/> <br/>    // returns the class index that most closely matches the neural nets outputs<br/> <br/>    //<br/> <br/>    // ex: given [0.001][0.0012][0.987][0.0211], nClassCnt == 4, returns 2 since <br/>    the value of index 2 is the largest<br/> <br/>    static int ClassGetIndex(double* Outputs, int nClassCnt) {<br/> <br/>              double dLargestVal <br/>    =DBL_MIN;<br/> <br/>              int nLargestIdx <br/>    = 0;<br/> <br/>              for (int I = 0; <br/>    I &lt; nClassCnt; I++) {<br/> <br/>                        if <br/>    (Outputs[I] &gt; dLargestVal) { dLargestVal = Outputs[I]; nLargestIdx = I; <br/>    }<br/> <br/>              }<br/> <br/>              return nLargestIdx;<br/> <br/>    } <br/>[/blockquote] <br/>So for example if the 5 output neuron activation values <strong>{A}</strong> are: <br/>     0       1       2       3       4<br/> <br/>  {0.01, 0.05, 0.98, 0.13, 0.02} <br/>The corresponding class index <strong>Ci</strong> would be 2 since 0.98 is the largest <br/>  value and is in slot 2. <br/>=====Training==== <br/>For training, you would simply give a desired value <strong>D</strong> of 1 for the neuron <br/>  corresponding to the index you want to activate with the given training pattern, <br/>  and 0 for all the other neurons. <br/>0 --&gt; 00001<br/> <br/>  1 --&gt; 00010<br/> <br/>  2 --&gt; 00100<br/> <br/>  3 --&gt; 01000<br/> <br/>  4 --&gt; 10000 <br/>Say you want the network to output class index <strong>Ci</strong> of type 3 for a given <br/>  input set. The output nodes should use the desired values of {0, 0, 0, 1, 0} <br/>  for<br/> <br/>  back-propagation. <br/>I use the following C++ functions to translate between desired and activation <br/>  values when using METHOD 2:<br/> <br/>  **Note, strings are used instead of arrays here because most of the time they&#39;re <br/>  in string format being read from/written to a file. The strings could easily <br/>  be replaced with an array or a list. <br/>[blockquote] <br/>  // given a class index and the # of classes,<br/> <br/>    // returns a string containing the desired outputs separated by strDelim<br/> <br/>    // (this is usually written to a training file)<br/> <br/>    // ex: given nClassIdx == 2, nClassCnt = 4, strDelim = &#34;¦&#34; <br/>    --&gt; returns &#34;0¦0¦1¦0&#34;<br/> <br/>    static CString ClassGetOutputString(int nClassIdx, int nClassCnt, CString <br/>    strDelim) {<br/> <br/>              CString strRet <br/>    = &#34;&#34;;<br/> <br/>              for (int I = 0; <br/>    I &lt; nClassCnt - 1; I++) {<br/> <br/>                        if <br/>    (nClassIdx == I) { strRet += &#34;1&#34; + strDelim; } else { strRet += <br/>    &#34;0&#34; + strDelim; }<br/> <br/>              }<br/> <br/>              if (nClassIdx <br/>    == I) { strRet += &#34;1&#34;; } else { strRet += &#34;0&#34;; }<br/> <br/>              return strRet;<br/> <br/>    } <br/>  // given a string such as &#34;0¦0¦1¦0&#34;, <br/>    returns 2 because the 1 corresponds to index 2<br/> <br/>    // returns -1 on error<br/> <br/>    static int ClassGetOutputIndex(CString strOutputs) {<br/> <br/>              int nNum = 0; <br/>    char ch;<br/> <br/>              for (int I = 0; <br/>    I &lt; strOutputs.GetLength(); I++) {<br/> <br/>                        ch <br/>    = strOutputs[I];<br/> <br/>                        if <br/>    (ch == &#39;1&#39;) { return nNum; } else if (ch == &#39;0&#39;) { nNum++; }<br/> <br/>              }<br/> <br/>              return -1;<br/> <br/>    } <br/>  [/blockquote] <br/><strong>Conclusion</strong> <br/>I&#39;ve found that METHOD 2 seems to be more accurate for most applications, but <br/>  it requires more nodes, which increases memory requirements. METHOD 2 is also <br/>  less susceptible to precision round-off error. As for speed, I&#39;m not sure which <br/>  one trains faster. Each epoch takes longer using METHOD 2, but METHOD 2 doesn&#39;t <br/>  seem to require as many epochs to get a good separation.<br/> <br/> <br/><strong><u>Additional Introductory Information</u></strong> <br/> <br/>  <a target="_blank" href="http://home.cc.umanitoba.ca/~umcorbe9/perceptron.html">http://home.cc.umanitoba.ca/~umcorbe9/perceptron.html</a> <br/>    A perceptron java applet that lets you step through an example. <br/>  <a target="_blank" href="http://www.dontveter.com/bpr/public2.html">http://www.dontveter.com/bpr/public2.html</a> <br/>    -- walks through an example of the XOR network. I found it extremely helpful. <br/>    Sometimes an example is worth more than 1000 greek variables. <br/>  <a target="_blank" href="http://www.ece.ubc.ca/~elec592/PDFfiles/7.0.pdf">http://www.ece.ubc.ca/~elec592/PDFfiles/7.0.pdf</a> <br/>    -- gives some insight as to how the back-propagation method is derived, although <br/>    I think it&#39;s a bit of an overkill.<br/> <br/>   <br/> </div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.bkkss.com/default.asp?id=433</link>
			<title><![CDATA[Image resize]]></title>
			<author>wbccccc#gmail.com(wbc)</author>
			<category><![CDATA[日志]]></category>
			<pubDate>Sat,17 Oct 2009 12:30:26 +0800</pubDate>
			<guid>http://www.bkkss.com/default.asp?id=433</guid>	
		<description><![CDATA[<object width="425" height="344">&nbsp;&nbsp; <br /><embed height="344" type="application/x-shockwave-flash" width="425" src="http://www.youtube.com/v/vIFCV2spKtg&amp;hl=en&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object>]]></description>
		</item>
		
			<item>
			<link>http://www.bkkss.com/default.asp?id=432</link>
			<title><![CDATA[Music from Stalin vs. Martians]]></title>
			<author>wbccccc#gmail.com(wbc)</author>
			<category><![CDATA[<b>媒體</b>]]></category>
			<pubDate>Sun,11 Oct 2009 16:01:29 +0800</pubDate>
			<guid>http://www.bkkss.com/default.asp?id=432</guid>	
		<description><![CDATA[<p>馬田的心事</p>
<p><img alt="" src="http://stalinvsmartians.com/my_little_airport500.jpg" /></p>
<p>[wma]http://stalinvsmartians.com/ost/my_little_airport.mp3[/wma]</p>
<p>&nbsp;</p>
<p>about the game: </p>
<p><a href="http://www.youtube.com/watch?v=IRQnzlscCLg">http://www.youtube.com/watch?v=IRQnzlscCLg</a></p>
<p>see more:</p>
<p><a href="http://stalinvsmartians.com/en/av.html">http://stalinvsmartians.com/en/av.html</a></p>]]></description>
		</item>
		
			<item>
			<link>http://www.bkkss.com/default.asp?id=430</link>
			<title><![CDATA[Blue Screen casued by afd.sys]]></title>
			<author>wbccccc#gmail.com(wbc)</author>
			<category><![CDATA[日志]]></category>
			<pubDate>Fri,02 Oct 2009 15:58:06 +0800</pubDate>
			<guid>http://www.bkkss.com/default.asp?id=430</guid>	
		<description><![CDATA[買了個新HDD，裝入了windows 7 build 7000， 網絡資源下載速度過快（+3MB/s）則出現藍屏：提示是afd.sys 。<br/>從開機后，win7也挺智能，problem shooting找到是因為 NIC問題。并給了個官網地址讓我下載。<br/>裝好立即正常了。<br/><br/>我的lan card:Atheros L1 Gigabit Ethernet 10/100/1000Base-T<br/><br/>B.T.W. 昨日國慶很精彩。]]></description>
		</item>
		
			<item>
			<link>http://www.bkkss.com/default.asp?id=429</link>
			<title><![CDATA[自動MP3搜集播放器]]></title>
			<author>wbccccc#gmail.com(wbc)</author>
			<category><![CDATA[文章]]></category>
			<pubDate>Mon,28 Sep 2009 00:33:51 +0800</pubDate>
			<guid>http://www.bkkss.com/default.asp?id=429</guid>	
		<description><![CDATA[n年沒發貼，今日就多post幾個啦。。<br/>個標題實在難聽，也想不到個順口的，隨便啦。。。<br/>相信很多人都沒有對本站那破爛的music player起眼，但各位又有無發現本站荒廢幾世紀，但player裏面的歌曲卻不停在添加？理論上來說，本人是不會那麼勤勞天天加音樂的。<br/>年初，本人無聊之際，自己喜歡聽歌，但比較懶，於是寫了該自動獲取并添加音樂的播放器。<br/>工作流程如下：<br/>設定了一個主論壇URL (音樂都來自論壇，常update，有描述)<br/>讀取論壇某版的所有帖子的列表<br/>分別進入每個文章，尋找MP3 URL， 并截取文章標題作為MP3音樂的名稱<br/>測試MP3 URL的可用性，如果可用則將標題轉為繁體，并將URL寫入Database(XML),同時記錄該版面ID，防止以後重複獲取<br/>設定更新Application參數： 每日<br/>執行后輸出：document.write(&#39;69 new music found,21 are valid!&#39;)<br/><br/><br/>有興趣的就下載去玩玩<br/>歡迎傳播及繼續開發...<br/><br/>程式：ASP.net(VB.net)<br/><img src="http://www.bkkss.com/images/download.gif" alt="下載文件" style="margin:0px 2px -4px 0px"/> <a  id="file_2100"  href="http://www.bkkss.com/showfile.asp?FileID=2100" target="_blank">點擊下載此文件<script>if(ids.indexOf('2100|')==-1) ids+='2100|';</script></a><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.bkkss.com/default.asp?id=428</link>
			<title><![CDATA[Excellent &amp; free WPF/Silverlight Chart control]]></title>
			<author>wbccccc#gmail.com(wbc)</author>
			<category><![CDATA[文章]]></category>
			<pubDate>Mon,28 Sep 2009 00:19:56 +0800</pubDate>
			<guid>http://www.bkkss.com/default.asp?id=428</guid>	
		<description><![CDATA[http://www.visifire.com/silverlight_charts_gallery.php<br/><br/><span id="53147802.78"><a href="http://www.bkkss.com/showfile.asp?fileid=2099" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://www.bkkss.com/showfile.asp?fileid=2099" border="0"  onload="document.getElementById('53147802.78').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('53147802.78').innerHTML='<a href=showfile.asp?fileid=2099 target=_blank >打開圖片失敗.</a>'" ><br/><br/>Visifire is Dual Licensed<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.bkkss.com/images/quote.gif" style="margin:0px 2px -3px 0px" alt="隱藏內容"/> 隱藏內容</div><div class="UBBContent">該內容已經被本人隱藏,只有會員才允許查閱 <a href="http://www.bkkss.com/login.asp">登入</a> | <a href="http://www.bkkss.com/register.asp">註冊</a></div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.bkkss.com/default.asp?id=427</link>
			<title><![CDATA[Visual Studio 2008 無法卸載]]></title>
			<author>wbccccc#gmail.com(wbc)</author>
			<category><![CDATA[日志]]></category>
			<pubDate>Mon,28 Sep 2009 00:02:08 +0800</pubDate>
			<guid>http://www.bkkss.com/default.asp?id=427</guid>	
		<description><![CDATA[From http://coolwanglu.blogspot.com/2008/09/visual-studio-2008.html<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.bkkss.com/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用內容"/> 引用內容</div><div class="UBBContent">症狀是用Control Panel的uninstall/repair，或者源安裝盤，都在load某個component時掛掉，不能進入正常安裝界面，然後彈出對話框，提示“A Problem has been encountered while loading the setup components. Canceling setup.”<br/><br/>而Log中顯示錯誤<br/>MSITOSIT: [2] ERROR processed; exception was thrown for retail build<br/>Developer Comment: : has no associated directory, verify the Feature table is correct<br/>Build Time: Thu Dec 11 14:04:18 2003<br/>HRESULT: -2147467259<br/><br/>網上查了一下，有的說是SP1的問題，有的說是Kaspersky的問題，我這裏都不管用。<br/><br/>最後的解決辦法是找到源安裝盤的vs_setup.msi，用Admin進入cmd，運行msiexec /x vs_setup.msi，它似乎就什麼都不檢查，就能卸載了。<br/><br/>之後重裝也沒問題。</div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.bkkss.com/default.asp?id=426</link>
			<title><![CDATA[Google Apps Profiles API Client]]></title>
			<author>wbccccc#gmail.com(wbc)</author>
			<category><![CDATA[日志]]></category>
			<pubDate>Wed,29 Jul 2009 21:51:08 +0800</pubDate>
			<guid>http://www.bkkss.com/default.asp?id=426</guid>	
		<description><![CDATA[Reply From Google API team:<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.bkkss.com/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用內容"/> 引用內容</div><div class="UBBContent">To add additional information to domain users it is necessary to use the Profiles API. Since the release of this API, the Shared Contacts API should be use only for external contacts. For more information see:<br/>http://code.google.com/apis/apps/profiles/developers_guide_protocol.html</div></div><br/><br/>My output...<br/><span id="92947802.8"><a href="http://www.bkkss.com/showfile.asp?fileid=2072" target="_blank" title="新窗口中打開">請稍等，圖片正在下載中...</a></span><img alt="新窗口中打開" style="display:none" src="http://www.bkkss.com/showfile.asp?fileid=2072" border="0"  onload="document.getElementById('92947802.8').innerHTML='';this.style.display='block'" style="cursor: pointer" onerror="document.getElementById('92947802.8').innerHTML='<a href=showfile.asp?fileid=2072 target=_blank >打開圖片失敗.</a>'" ><br/><br/><img src="http://www.bkkss.com/images/download.gif" alt="下載文件" style="margin:0px 2px -4px 0px"/> <a  id="file_2076"  href="http://www.bkkss.com/showfile.asp?FileID=2076" target="_blank">Download<script>if(ids.indexOf('2076|')==-1) ids+='2076|';</script></a><br/><br/>Hope this will help.<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.bkkss.com/default.asp?id=425</link>
			<title><![CDATA[Google Shared Contacts Manager]]></title>
			<author>wbccccc#gmail.com(wbc)</author>
			<category><![CDATA[日志]]></category>
			<pubDate>Mon,20 Jul 2009 14:53:05 +0800</pubDate>
			<guid>http://www.bkkss.com/default.asp?id=425</guid>	
		<description><![CDATA[<p>核心代碼來自：<a href="http://code.google.com/p/google-shared-contacts-client/">http://code.google.com/p/google-shared-contacts-client/</a></p>
<p>想不到google gmail的企業級應用到現在還沒有正式出share contact manager，只是開放了部份API。<br />在web上面根本沒有任何管理UI。<br />API也好，起碼還可以管理。但有一個更不便的是，API做出的操作，不會立即在web內見到效果。據Google說效果會在24小時內可見。</p>
<p>如果等不急官方版shared contact manger,或許可以試試看我這個：<br /><a href="http://www.youtube.com/watch?v=UYsAUUeNEQw">http://www.youtube.com/watch?v=UYsAUUeNEQw</a><object width="480" height="385"><embed height="385" type="application/x-shockwave-flash" width="480" src="http://www.youtube.com/v/UYsAUUeNEQw&amp;hl=zh_CN&amp;fs=1&amp;color1=0xe1600f&amp;color2=0xfebd01&amp;hd=1" allowfullscreen="true" allowscriptaccess="always"></embed></object></p>
<p>&nbsp;</p>
<p>1.[down=showfile.asp?FileID=2097]Download and Install python-2.5.4.rar[/down]</p>
<p>2.[down=showfile.asp?FileID=2098]Download&nbsp;Manager with UI[/down]</p>
<p>&nbsp;</p>]]></description>
		</item>
		
			<item>
			<link>http://www.bkkss.com/default.asp?id=424</link>
			<title><![CDATA[VPN in Windows 7]]></title>
			<author>wbccccc#gmail.com(wbc)</author>
			<category><![CDATA[日志]]></category>
			<pubDate>Sun,05 Jul 2009 15:05:45 +0800</pubDate>
			<guid>http://www.bkkss.com/default.asp?id=424</guid>	
		<description><![CDATA[windows7的確很好用，可是去學校的VPN卻用不到了。error code 789<br/>想不到改改註冊表，就ok了:<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.bkkss.com/images/quote.gif" style="margin:0px 2px -3px 0px" alt="引用內容"/> 引用內容</div><div class="UBBContent"><br/>錯誤789：L2TP 連接嘗試失敗,因為安全層在與遠程計算機進行初始協商時遇到處理錯誤<br/><br/>增加注冊表項(以下操作均在客戶端完成)<br/><br/>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\Parameters<br/><br/>&#34;ProhibitIPSec&#34;=dword:00000001<br/><br/>然後重啟機器</div></div>]]></description>
		</item>
		
</channel>
</rss>