def main(args): # 数据加载 (x_train, y_train), (x_test, y_test) = load_cifar(args.cifar_root) # 随机选择训练样本 train_num = x_train.shape[0] def next_batch(batch_size): idx = np.random.choice(train_num, batch_size) return x_train[idx], y_train[idx] # 网络 vgg = VGG(image_size=32, name='vgg11') opt = RmsProp(vgg.weights, lr=args.lr, decay=1e-3) # 加载权重 if args.checkpoint: weights = load_weights(args.checkpoint) vgg.load_weights(weights) print("load weights done") # 评估 if args.eval_only: indices = np.random.choice(len(x_test), args.eval_num, replace=False) print('{} start evaluate'.format( time.asctime(time.localtime(time.time())))) acc = get_accuracy(vgg, x_test[indices], ys=y_test[indices]) print('{} acc on test dataset is :{:.3f}'.format( time.asctime(time.localtime(time.time())), acc)) return # 训练 num_steps = args.steps for step in range(num_steps): x, y_true = next_batch(args.batch_size) # 前向传播 y_predict = vgg.forward(x.astype(np.float)) # print('y_pred: min{},max{},mean:{}'.format(np.min(y_predict, axis=-1), # np.max(y_predict, axis=-1), # np.mean(y_predict, axis=-1))) # print('y_pred: {}'.format(y_predict)) acc = np.mean( np.argmax(y_predict, axis=1) == np.argmax(y_true, axis=1)) # 计算loss loss, gradient = cross_entropy_loss(y_predict, y_true) # 反向传播 vgg.backward(gradient) # 更新梯度 opt.iterate(vgg) # 打印信息 print('{} step:{},loss:{:.4f},acc:{:.4f}'.format( time.asctime(time.localtime(time.time())), step, loss, acc)) # 保存权重 if step % 100 == 0: save_weights( os.path.join(args.save_dir, 'weights-{:03d}.pkl'.format(step)), vgg.weights)
from vgg import VGG import os model = VGG() print(model.summary()) weights = './model/emotion_best_weights.h5' if os.path.exists(weights): print("Loading weight") model.load_weights(weights) print("Saving model") model.save("./model/emotion_recognition.h5")