NLinker icon

TwoLayerNet example

NLinker | PRO | 04/13/19 11:58:42 AM UTC | 0 ⭐ | 941 👁️ | Never ⏰ | []
Python |

3.09 KB

|

None

|

0 👍

/

0 👎

def small_test():
    num_inputs = 5
    input_size = 4
    hidden_size = 10
    ouptut_size = 3
 
    np.random.seed(0)
    model = TwoLayerNet(input_size=input_size, hidden_size=hidden_size, output_size=ouptut_size, reg=0.0, std=1e-1)
 
    np.random.seed(1)
    x = 10 * np.random.randn(num_inputs, input_size)
    y = np.array([0, 1, 2, 2, 1])
 
    # scores = model.compute_loss_and_gradients(x, None)
    return x, y, model
 
x, y, model = small_test()
 
scores = model.compute_loss_and_gradients(x, None)
loss, grads = model.compute_loss_and_gradients(x, y, reg=0.05)
 
correct_loss = 1.30378789133
correct_scores = np.asarray([
  [-0.81233741, -1.27654624, -0.70335995],
  [-0.17129677, -1.18803311, -0.47310444],
  [-0.51590475, -1.01354314, -0.8504215 ],
  [-0.15419291, -0.48629638, -0.52901952],
  [-0.00618733, -0.12435261, -0.15226949]])
# print("model.w1 =", model.params['w1'])
# print("model.w2 =", model.params['w2'])
print("correct_loss - loss =", np.sum(np.abs(correct_loss - loss)))
print("scores - correct_scores =", np.sum(np.abs(scores - correct_scores)))
print("xy =", np.sum(x), np.sum(y))
print("net.params =", {k.lower(): np.sum(v) for k, v in model.params.items()})
print("net.grads =", {k.lower(): np.sum(v) for k, v in grads.items()})
# print("params = ", {k: v.shape for k, v in params.items()})
# print("grads = ", {k: v.shape for k, v in grads.items()})
 
def small_train(x, y, batch_size=200):
    x_val = x
    y_val = y
    
    learning_rate=0.1
    learning_rate_decay=0.95
    num_iters=200
    reg=0.005
    num_train = x.shape[0]
    iterations_per_epoch = max(num_train / batch_size, 1)
 
    loss_history = []
    train_acc_history = []
    val_acc_history = []
 
    for it in range(num_iters):
        idx = np.random.choice(num_train, batch_size, replace=True)
        x_batch = x[idx]
        y_batch = y[idx]
        loss, grads = model.compute_loss_and_gradients(x_batch, y=y_batch)
        loss_history.append(loss)
        model.params['w2'] += - learning_rate * grads['w2']
        model.params['b2'] += - learning_rate * grads['b2']
        model.params['w1'] += - learning_rate * grads['w1']
        model.params['b1'] += - learning_rate * grads['b1']
        if it % 100 == 0:
            print('iteration %d / %d: loss %f' % (it, num_iters, loss))
        
        if it % iterations_per_epoch == 0:
            # Check accuracy
            train_acc = (model.predict(x_batch) == y_batch).mean()
            val_acc = (model.predict(x_val) == y_val).mean()
            train_acc_history.append(train_acc)
            val_acc_history.append(val_acc)
            learning_rate *= learning_rate_decay
    # finish the loop
    return {
        'loss_history': loss_history,
        'train_acc_history': train_acc_history,
        'val_acc_history': val_acc_history,
    }
 
stats = small_train(x, y, batch_size=200)
 
print('Final training loss: ', stats['loss_history'][-1])
 
# plot the loss history
plt.plot(stats['loss_history'])
plt.xlabel('iteration')
plt.ylabel('training loss')
plt.title('Training Loss history')
plt.show()

Comments