🐛 visual changement & bug fix in test/json.nas & optimize test/bp.nas

This commit is contained in:
ValKmjolnir 2022-05-30 21:27:24 +08:00
parent 882ecac100
commit ab37495960
4 changed files with 28 additions and 12 deletions

View File

@ -633,10 +633,10 @@ void nasal_gc::info()
"hash ","upval","obj ", "hash ","upval","obj ",
"co " "co "
}; };
std::cout<<"\ngarbage collector info:\n"; std::cout<<"\ngarbage collector info\n";
for(uint8_t i=vm_str;i<vm_type_size;++i) for(uint8_t i=vm_str;i<vm_type_size;++i)
std::cout<<" "<<name[i]<<" | "<<count[i]<<"\n"; std::cout<<" "<<name[i]<<" | "<<count[i]<<"\n";
std::cout<<"\nmemory allocator info(max size):\n"; std::cout<<"\nmemory allocator info(max size)\n";
for(uint8_t i=vm_str;i<vm_type_size;++i) for(uint8_t i=vm_str;i<vm_type_size;++i)
std::cout<<" "<<name[i]<<" | "<<initialize[i]+size[i]*increment[i]<<"(+"<<size[i]<<")\n"; std::cout<<" "<<name[i]<<" | "<<initialize[i]+size[i]*increment[i]<<"(+"<<size[i]<<")\n";
} }

View File

@ -363,7 +363,7 @@ void nasal_vm::opcallsort(const uint64_t* arr)
opcall.end(), opcall.end(),
[](op& a,op& b){return a.second>b.second;} [](op& a,op& b){return a.second>b.second;}
); );
std::cout<<"\noperands call info:"; std::cout<<"\noperands call info";
uint64_t total=0; uint64_t total=0;
for(auto& i:opcall) for(auto& i:opcall)
{ {
@ -386,7 +386,7 @@ void nasal_vm::die(std::string str)
inline bool nasal_vm::condition(nasal_ref val) inline bool nasal_vm::condition(nasal_ref val)
{ {
if(val.type==vm_num) if(val.type==vm_num)
return val.value.num; return val.num();
else if(val.type==vm_str) else if(val.type==vm_str)
{ {
double num=str2num(val.str().c_str()); double num=str2num(val.str().c_str());

View File

@ -11,6 +11,16 @@ var new_neuron=func()
}; };
} }
var tanh=func(x)
{
var (a,b)=(math.exp(x),math.exp(-x));
return (a-b)/(a+b);
}
var difftanh=func(x)
{
x=tanh(x);
return 1-x*x;
}
var sigmoid=func(x) var sigmoid=func(x)
{ {
return 1/(1+math.exp(-x)); return 1/(1+math.exp(-x));
@ -21,7 +31,7 @@ var diffsigmoid=func(x)
return x*(1-x); return x*(1-x);
} }
var (inum,hnum,onum,lr)=(2,4,1,0.1); var (inum,hnum,onum)=(2,4,1);
var training_set=[[0,0],[0,1],[1,0],[1,1]]; var training_set=[[0,0],[0,1],[1,0],[1,1]];
var expect=[0,1,1,0]; var expect=[0,1,1,0];
@ -30,8 +40,8 @@ for(var i=0;i<hnum;i+=1)
{ {
append(hidden,new_neuron()); append(hidden,new_neuron());
for(var j=0;j<inum;j+=1) for(var j=0;j<inum;j+=1)
append(hidden[i].w,2*rand()); append(hidden[i].w,rand()>0.5?-2*rand():2*rand());
hidden[i].bia=5*rand(); hidden[i].bia=rand()>0.5?-5*rand():5*rand();
} }
var output=[]; var output=[];
@ -39,8 +49,8 @@ for(var i=0;i<onum;i+=1)
{ {
append(output,new_neuron()); append(output,new_neuron());
for(var j=0;j<hnum;j+=1) for(var j=0;j<hnum;j+=1)
append(output[i].w,2*rand()); append(output[i].w,rand()>0.5?-2*rand():2*rand());
output[i].bia=5*rand(); output[i].bia=rand()>0.5?-5*rand():5*rand();
} }
var forward=func(x) var forward=func(x)
@ -51,7 +61,7 @@ var forward=func(x)
hidden[i].in=hidden[i].bia; hidden[i].in=hidden[i].bia;
for(var j=0;j<inum;j+=1) for(var j=0;j<inum;j+=1)
hidden[i].in+=hidden[i].w[j]*input[j]; hidden[i].in+=hidden[i].w[j]*input[j];
hidden[i].out=sigmoid(hidden[i].in); hidden[i].out=tanh(hidden[i].in);
} }
for(var i=0;i<onum;i+=1) for(var i=0;i<onum;i+=1)
{ {
@ -70,7 +80,7 @@ var run=func(vec)
hidden[i].in=hidden[i].bia; hidden[i].in=hidden[i].bia;
for(var j=0;j<inum;j+=1) for(var j=0;j<inum;j+=1)
hidden[i].in+=hidden[i].w[j]*input[j]; hidden[i].in+=hidden[i].w[j]*input[j];
hidden[i].out=sigmoid(hidden[i].in); hidden[i].out=tanh(hidden[i].in);
} }
for(var i=0;i<onum;i+=1) for(var i=0;i<onum;i+=1)
{ {
@ -94,7 +104,7 @@ var backward=func(x)
hidden[i].diff=0; hidden[i].diff=0;
for(var j=0;j<onum;j+=1) for(var j=0;j<onum;j+=1)
hidden[i].diff+=output[j].w[i]*output[j].diff; hidden[i].diff+=output[j].w[i]*output[j].diff;
hidden[i].diff*=diffsigmoid(hidden[i].in); hidden[i].diff*=difftanh(hidden[i].in);
} }
for(var i=0;i<hnum;i+=1) for(var i=0;i<hnum;i+=1)
{ {

View File

@ -226,6 +226,8 @@ var JSON=func(){
var member=func(hash) var member=func(hash)
{ {
var name=token.content; var name=token.content;
if(token.type==j_rbrace)
return;
if(token.type==j_str) if(token.type==j_str)
match(j_str); match(j_str);
else else
@ -316,6 +318,10 @@ var ss=JSON.stringify({
m3:[114514], m3:[114514],
m4:{year:1919,month:8,date:10} m4:{year:1919,month:8,date:10}
}, },
emptyhash:{},
emptyvec:[],
empty:[{}],
empty_an:[[[[[[{}]]]]]],
function:func(){} function:func(){}
}); });
println(ss); println(ss);