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