PLearn 0.1
|
00001 // -*- C++ -*- 00002 00003 // PLearn (A C++ Machine Learning Library) 00004 // Copyright (C) 2003 Olivier Delalleau 00005 00006 // Redistribution and use in source and binary forms, with or without 00007 // modification, are permitted provided that the following conditions are met: 00008 // 00009 // 1. Redistributions of source code must retain the above copyright 00010 // notice, this list of conditions and the following disclaimer. 00011 // 00012 // 2. Redistributions in binary form must reproduce the above copyright 00013 // notice, this list of conditions and the following disclaimer in the 00014 // documentation and/or other materials provided with the distribution. 00015 // 00016 // 3. The name of the authors may not be used to endorse or promote 00017 // products derived from this software without specific prior written 00018 // permission. 00019 // 00020 // THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 00021 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00022 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 00023 // NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00024 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 00025 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00026 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00027 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00028 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00029 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00030 // 00031 // This file is part of the PLearn library. For more information on the PLearn 00032 // library, go to the PLearn Web site at www.plearn.org 00033 00034 00035 /* ******************************************************* 00036 * $Id: LiftOutputVariable.cc 6351 2006-10-25 19:05:45Z chapados $ 00037 * This file is part of the PLearn library. 00038 ******************************************************* */ 00039 00040 #include "LiftOutputVariable.h" 00041 00042 namespace PLearn { 00043 using namespace std; 00044 00047 PLEARN_IMPLEMENT_OBJECT( 00048 LiftOutputVariable, 00049 "The result is the output if the target is 1, and the opposite of the output " 00050 "otherwise. This variable is to be used with a LiftStatsCollector, in a" 00051 "stochastic gradient descent.", 00052 "NO HELP" 00053 ); 00054 00056 // LiftOutputVariable // 00058 LiftOutputVariable::LiftOutputVariable(Variable* netout, Variable* target) 00059 : inherited(netout,target,netout->length(),netout->width()) 00060 { 00061 build_(); 00062 } 00063 00064 void 00065 LiftOutputVariable::build() 00066 { 00067 inherited::build(); 00068 build_(); 00069 } 00070 00071 void 00072 LiftOutputVariable::build_() 00073 { 00074 if (input1 && input2) { 00075 // input1 and input2 are (respectively) netout and target from the constructor 00076 if(input1->size() != input2->size()) 00077 PLERROR("In LiftOutputVariable: netout and target must have the same size"); 00078 } 00079 } 00080 00082 // recomputeSize // 00084 void LiftOutputVariable::recomputeSize(int& l, int& w) const 00085 { 00086 //l=1, w=1; 00087 if(input1) 00088 { 00089 l=input1->length(); 00090 w=input1->width(); 00091 } 00092 } 00093 00095 // fprop // 00097 void LiftOutputVariable::fprop() 00098 { 00099 for(int i=0;i<size(); i++) 00100 { 00101 real output = input1->valuedata[i]; 00102 real target = input2->valuedata[i]; 00103 if(!is_missing(target)) 00104 { 00105 PLASSERT(fast_exact_is_equal(target, 0) || fast_exact_is_equal(target, 1.0)); 00106 if (fast_exact_is_equal(target, 1.0)) { 00107 if (fast_exact_is_equal(output, 0.0)) { 00108 // We need to make sure the output is positive. 00109 output = 1e-10; 00110 } 00111 valuedata[i] = output; 00112 } else { 00113 valuedata[i] = -output; 00114 } 00115 } 00116 else 00117 valuedata[i] = MISSING_VALUE; 00118 } 00119 } 00120 00121 void LiftOutputVariable::bprop() 00122 { 00123 // TODO Not really sure what to do here, bprop shouldn't be used anyway. 00124 // Actually it IS called, should investigate why and what it does. 00125 // PLWARNING("In LiftOutputVariable::bprop - You should not backprop on a LiftOutputVariable"); 00126 real gr = *gradientdata; 00127 for (int i=0; i<input1->size(); i++) 00128 { 00129 input1->gradientdata[i] += gr; 00130 } 00131 } 00132 00133 } // end of namespace PLearn 00134 00135 00136 /* 00137 Local Variables: 00138 mode:c++ 00139 c-basic-offset:4 00140 c-file-style:"stroustrup" 00141 c-file-offsets:((innamespace . 0)(inline-open . 0)) 00142 indent-tabs-mode:nil 00143 fill-column:79 00144 End: 00145 */ 00146 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=79 :