Freezing one weight cause the same result with unfreezing(Deep learning书的一个练习)
在神经网络训啦中,冻结某权重,总的误差依然会降为0的现象。
import numpy as np
import matplotlib. pyplot as plt
streetlights = np. array( [
[ 1 , 0 , 1 ] ,
[ 0 , 1 , 1 ] ,
[ 0 , 0 , 1 ] ,
[ 1 , 1 , 1 ] ,
[ 0 , 1 , 1 ] ,
[ 1 , 0 , 1 ]
] )
walk_vs_stop = np. array( [ 0 , 1 , 0 , 1 , 1 , 0 ] )
alpha = 0.1
def predict ( X, W) :
return np. dot( X, W)
weight = np. array( [ 0.5 , 0.48 , - 0.7 ] )
error = [ ]
w = [ [ 0.5 , 0.48 , - 0.7 ] ]
for i in range ( 6 ) :
pre = predict( streetlights[ i] , weight)
err = ( pre - walk_vs_stop[ i] ) ** 2
delta = pre - walk_vs_stop[ i]
weight_delta = streetlights[ i] * delta * alpha
weight = weight - weight_delta
if i != 5 :
w. append( weight)
error. append( np. array( err) )
print ( error)
print ( w)
fig, ax = plt. subplots( )
ax. scatter( range ( 6 ) , error)
plt. xlabel( 'run_times' )
plt. ylabel( 'error' )
plt. show( )
[array(0.04), array(1.44), array(0.3136), array(0.147456), array(0.68425984), array(0.03080727)]
[[0.5, 0.48, -0.7], array([ 0.52, 0.48, -0.68]), array([ 0.52, 0.6 , -0.56]), array([ 0.52 , 0.6 , -0.504]), array([ 0.5584, 0.6384, -0.4656]), array([ 0.5584 , 0.72112, -0.38288])]
weight = np. array( [ 0.5 , 0.48 , - 0.7 ] )
error = [ ]
w = [ [ 0.5 , 0.48 , - 0.7 ] ]
for i in range ( 6 ) :
pre = predict( streetlights[ i] , weight)
err = ( pre - walk_vs_stop[ i] ) ** 2
delta = pre - walk_vs_stop[ i]
weight_delta = streetlights[ i] * delta * alpha
weight_delta[ 2 ] = 0
weight = weight - weight_delta
if i != 5 :
w. append( weight)
error. append( np. array( err) )
print ( error)
print ( w)
fig, ax = plt. subplots( )
ax. scatter( range ( 6 ) , error)
plt. xlabel( 'run_times' )
plt. ylabel( 'error' )
plt. show( )
[array(0.04), array(1.4884), array(0.49), array(0.334084), array(1.08201604), array(0.01493284)]
[[0.5, 0.48, -0.7], array([ 0.52, 0.48, -0.7 ]), array([ 0.52 , 0.602, -0.7 ]), array([ 0.52 , 0.602, -0.7 ]), array([ 0.5778, 0.6598, -0.7 ]), array([ 0.5778 , 0.76382, -0.7 ])]
看到这两次输出的weight结果差别不大,说明第三个weight确实不怎么影响结果,换个weight试试,还是error还是降低到了0……,控制两个呢
weight = np. array( [ 0.5 , 0.48 , - 0.7 ] )
error = [ ]
w = [ [ 0.5 , 0.48 , - 0.7 ] ]
for i in range ( 6 ) :
pre = predict( streetlights[ i] , weight)
err = ( pre - walk_vs_stop[ i] ) ** 2
delta = pre - walk_vs_stop[ i]
weight_delta = streetlights[ i] * delta * alpha
weight_delta[ 1 ] = 0
weight = weight - weight_delta
if i != 5 :
w. append( weight)
error. append( np. array( err) )
print ( error)
print ( w)
fig, ax = plt. subplots( )
ax. scatter( range ( 6 ) , error)
plt. xlabel( 'run_times' )
plt. ylabel( 'error' )
plt. show( )
[array(0.04), array(1.44), array(0.3136), array(0.254016), array(0.94789696), array(0.04586451)]
[[0.5, 0.48, -0.7], array([ 0.52, 0.48, -0.68]), array([ 0.52, 0.48, -0.56]), array([ 0.52 , 0.48 , -0.504]), array([ 0.5704, 0.48 , -0.4536]), array([ 0.5704 , 0.48 , -0.35624])]
weight = np. array( [ 0.5 , 0.48 , - 0.7 ] )
error = [ ]
w = [ [ 0.5 , 0.48 , - 0.7 ] ]
for i in range ( 6 ) :
pre = predict( streetlights[ i] , weight)
err = ( pre - walk_vs_stop[ i] ) ** 2
delta = pre - walk_vs_stop[ i]
weight_delta = streetlights[ i] * delta * alpha
weight_delta[ 0 ] = 0
weight_delta[ 1 ] = 0
weight = weight - weight_delta
if i != 5 :
w. append( weight)
error. append( np. array( err) )
print ( error)
print ( w)
fig, ax = plt. subplots( )
ax. scatter( range ( 6 ) , error)
plt. xlabel( 'run_times' )
plt. ylabel( 'error' )
plt. show( )
[array(0.04), array(1.44), array(0.3136), array(0.274576), array(0.94400656), array(0.02118771)]
[[0.5, 0.48, -0.7], array([ 0.5 , 0.48, -0.68]), array([ 0.5 , 0.48, -0.56]), array([ 0.5 , 0.48 , -0.504]), array([ 0.5 , 0.48 , -0.4516]), array([ 0.5 , 0.48 , -0.35444])]