import os
os.chdir('/home/renwh/gaze/renwh/caffe_with_cudnnv3/')
import sys
sys.path.insert(0,'./python')
import caffe
from pylab import *
%matplotlib inline
caffe.set_device(0)
caffe.set_mode_gpu()
solver = caffe.SGDSolver('examples/mymodel/02/lenet_solver.prototxt')
#You can choose to load your model status
#solver.restore('examples/mymodel/03/lenet_iter_1001.solverstate')
# each output is (batch size, feature dim, spatial dim)
[(k, v.data.shape) for k, v in solver.net.blobs.items()]
# just print the weight sizes (not biases)
[(k, v[0].data.shape) for k, v in solver.net.params.items()]
solver.net.forward() # train net
solver.test_nets[0].forward() # test net (there can be more than one)
# we use a little trick to tile the first eight images
imshow(solver.test_nets[0].blobs['data'].data[:8, 0].transpose(1, 0, 2).reshape(36, 8*60), cmap='gray')
print solver.net.blobs['label'].data[:8]
solver.step(1)
imshow(solver.net.params['conv1'][0].diff[:, 0].reshape(4, 5, 5, 5)
.transpose(0, 2, 1, 3).reshape(4*5, 5*5), cmap='gray')
Show the conv1 weights pics.
Then, I will train the model, and log some information.
%%time
niter = 1000
test_interval = 25
# losses will also be stored in the log
train_loss = zeros(niter)
mean_error= zeros(int(np.ceil(niter / test_interval)))
output = zeros((niter, 8, 3))
# the main solver loop
for it in range(niter):
solver.step(1) # SGD by Caffe
# store the train loss
train_loss[it] = solver.net.blobs['loss'].data
# store the output on the first test batch
# (start the forward pass at conv1 to avoid loading new data)
solver.test_nets[0].forward(start='conv1')
output[it] = solver.test_nets[0].blobs['ip3'].data[:8]
if it % test_interval == 0:
# caculate the square error for each gaze vector
solver.test_nets[0].forward()
num_test = 100;
sub_error = zeros((num_test, 2))
square_error = zeros((num_test, 2))
sum_Euclidean_error = zeros(num_test)
gaze_3_l = zeros((num_test, 3));
gaze_3_i = zeros((num_test, 3));
gaze_2_l = zeros((num_test, 2));
gaze_2_i = zeros((num_test, 2));
gaze_3_l = solver.test_nets[0].blobs['gaze'].data[1:num_test+1];
gaze_3_i = solver.test_nets[0].blobs['ip3'].data[1:num_test+1];
gaze_2_l[:,0] = np.arcsin(-1*gaze_3_l[:,1])/np.pi*180;
gaze_2_l[:,1] = np.arctan2(-1*gaze_3_l[:,0],-1*gaze_3_l[:,2])/np.pi*180;
gaze_2_i[:,0] = np.arcsin(-1*gaze_3_i[:,1])/np.pi*180;
gaze_2_i[:,1] = np.arctan2(-1*gaze_3_i[:,0],-1*gaze_3_i[:,2])/np.pi*180;
for i in range(num_test):
sub_error[i,:] = np.subtract(gaze_2_l[i]
, gaze_2_i[i])
square_error[i,:] = np.square(sub_error[i,:])
sum_Euclidean_error[i] = np.sum(square_error[i,:],0)
sum_Euclidean_error[i] = np.sqrt(sum_Euclidean_error[i])
mean_error[it // test_interval] = np.sum(sum_Euclidean_error,0)/num_test
print 'Iteration', it, '. Mean error is', mean_error[it // test_interval]
_, ax1 = subplots()
ax2 = ax1.twinx()
ax1.plot(arange(niter), train_loss)
ax2.plot(test_interval * arange(len(mean_error)), mean_error, 'r')
ax1.set_xlabel('iteration')
ax1.set_ylabel('train loss')
ax2.set_ylabel('mean error')
**show you the train loss curve.
num_test = 1000
# (start the forward pass at conv1 to avoid loading new data)
solver.test_nets[0].forward(start='conv1')
solver.test_nets[0].forward()
#figure(figsize=(10, 5))
#imshow(solver.test_nets[0].blobs['data'].data[:num_test, 0].transpose(1, 0, 2).reshape(36, num_test*60), cmap='gray')
# print the label and train result
#for i in range(num_test):
# print solver.test_nets[0].blobs['label'].data[i,:3] ,'label<->ip3', solver.test_nets[0].blobs['ip3'].data[i]
print '--------------------------------------------------------------------------------------------------------------'
# caculate the square error for each gaze vector
sub_error = zeros((num_test, 2))
square_error = zeros((num_test, 2))
sum_Euclidean_error = zeros(num_test)
gaze_3_l = zeros((num_test, 3));
gaze_3_i = zeros((num_test, 3));
gaze_2_l = zeros((num_test, 2));
gaze_2_i = zeros((num_test, 2));
gaze_3_l = solver.test_nets[0].blobs['gaze'].data[:];
gaze_3_i = solver.test_nets[0].blobs['ip3'].data[:];
gaze_2_l[:,0] = np.arcsin(-1*gaze_3_l[:,1])/np.pi*180;
gaze_2_l[:,1] = np.arctan2(-1*gaze_3_l[:,0],-1*gaze_3_l[:,2])/np.pi*180;
gaze_2_i[:,0] = np.arcsin(-1*gaze_3_i[:,1])/np.pi*180;
gaze_2_i[:,1] = np.arctan2(-1*gaze_3_i[:,0],-1*gaze_3_i[:,2])/np.pi*180;
for i in range(num_test):
sub_error[i,:] = np.subtract(gaze_2_l[i]
, gaze_2_i[i])
square_error[i,:] = np.square(sub_error[i,:])
sum_Euclidean_error[i] = np.sum(square_error[i,:],0)
sum_Euclidean_error[i] = np.sqrt(sum_Euclidean_error[i])
print num_test,'test pic, mean error is ',np.sum(sum_Euclidean_error,0)/num_test,'degree'
_, ax1 = subplots()
ax1.plot(arange(num_test), sum_Euclidean_error,'bo', label='sampled')
ax1.set_xlabel('num_test')
ax1.set_ylabel('sum_Euclidean_error')
imshow(solver.net.params['conv1'][0].diff[:, 0].reshape(4, 5, 5, 5)
.transpose(0, 2, 1, 3).reshape(4*5, 5*5), cmap='gray')
figure(figsize=(10, 5))
imshow(solver.net.params['conv2'][0].diff[:, 0].reshape(3, 10, 5, 5)
.transpose(0, 2, 1, 3).reshape(3*5, 10*5), cmap='gray')
figure(figsize=(10, 5))
imshow(solver.net.params['conv3'][0].diff[:, 0].reshape(5, 10, 5, 5)
.transpose(0, 2, 1, 3).reshape(5*5, 10*5), cmap='gray')
figure(figsize=(20, 10))
imshow(solver.test_nets[0].blobs['conv1'].data[:8, :].reshape(8,20,32,56)
.transpose(0,2,1,3).reshape(8*32, 20*56), cmap='gray')
figure(figsize=(20, 10))
imshow(solver.test_nets[0].blobs['conv2'].data[:8, :].reshape(8, 30, 12, 24)
.transpose(0,2,1,3).reshape(8*12, 30*24), cmap='gray')
figure(figsize=(50, 25))
imshow(solver.test_nets[0].blobs['conv3'].data[:8, :].reshape(16, 25, 2, 8)
.transpose(0,2,1,3).reshape(16*2, 25*8), cmap='gray')
#solver.net.save('my_model.caffemodel') I do not know how to use this.
solver.snapshot() #SAVE MY MODEL IN THE DIR YOU DEFINE IN SOLVER FILE.