def train_and_test(model, train_loader, test_loader, epochs, lr, momentum, log_interval): optimizer = optim.SGD(model.parameters(), lr=lr, momentum=momentum) criterion = nn.CrossEntropyLoss() for epoch in range(1, epochs + 1): train(model, train_loader, optimizer, criterion, epoch, log_interval) test(model, test_loader, criterion)
def _train(lr, batch_size, hidden_sizes, epoch_num, model_name): global is_training, trainingData, lock num_iters = int(epoch_num * 60000.0 / batch_size) net = Net(hidden_sizes = hidden_sizes, batch_size = batch_size, lr = lr) mndata = MNIST('./mnist') print("Loading mnist training set...") mnist_img, mnist_label = mndata.load_training() mnist_img = np.array(mnist_img) / 255.0 func.train(net, mnist_img, mnist_label, num_iters, join(MODEL_DIR, model_name + '.npy'), trainingData = trainingData, lock = lock, training_flag = is_training) print("Loading mnist testing set...") test_img, test_label = mndata.load_testing() test_img = np.array(test_img) / 255.0 lock.acquire() trainingData['eval'] = func.eval(net, test_img, test_label) is_training['value'] = False lock.release()
cnn = myUpSamplingAE(WIDTH // 2, HEIGHT // 2, CHANNELS) ### ここから下は,必要に応じて書き換えると良い ### # 追加条件の指定 conditions = {} conditions['in_channels'] = CHANNELS # 入力画像のチャンネル数が 3(カラー画像) conditions['out_channels'] = CHANNELS # 出力画像のチャンネル数も 3(カラー画像) conditions['input_scale'] = 0.5 # 本来のVGGFace2顔画像を縦横半分に(0.5倍)して入力画像とする # 学習処理 cnn = train( device=dev, # 使用するGPUのID,変えなくて良い model_dir=MODEL_DIR, # 一時ファイルを保存するフォルダ,変えなくて良い in_data=imgfiles, # モデルの入力データ,今回はVGGFace2顔画像(ただし縦横を半分にして使用) out_data=imgfiles, # モデルの出力データ,今回はVGGFace2顔画像 model=cnn, # 学習するネットワークモデル loss_func=nn.L1Loss(), # 損失関数,今回は mean absolute error batchsize=batchsize, # バッチサイズ epochs=epochs, # 総エポック数 stepsize=10, # 高速化のため,ミニバッチ10個につき1個しか学習に用いないことにする additional_conditions=conditions # 上で指定した追加条件 ) ### ここまで ### # 最終結果のモデルをファイルに保存 torch.save(cnn.to('cpu').state_dict(), model_filepath) print('', file=sys.stderr)
x_train, y_train, x_test = f.load_fashionmnist() # 訓練データとテストデータの読み込み # weights W = np.random.uniform(low=-0.08, high=0.08, size=(784, 10)).astype('float32') b = np.zeros(shape=(10, )).astype('float32') # # 学習データと検証データに分割 # x_train, x_valid, y_train, y_valid = train_test_split(x_train, y_train, test_size=0.1) for epoch in range(1000): x_train, y_train = shuffle(x_train, y_train) x_train_k, x_valid_k, y_train_k, y_valid_k = train_test_split( x_train, y_train, test_size=0.1) cost = f.train(x_train, y_train, W, b, eps=1.0) valid_cost, y_pred = f.valid(x_valid_k, y_valid_k, W, b) if epoch % 10 == 9 or epoch == 0: print( 'EPOCH: {}, Valid Cost: {:.3f}, Valid Accuracy: {:.3f}'.format( epoch + 1, valid_cost, accuracy_score(y_valid_k.argmax(axis=1), y_pred.argmax(axis=1)))) epochs.append(epoch + 1) valid_costs.append(valid_cost) valid_accuracies.append( accuracy_score(y_valid_k.argmax(axis=1), y_pred.argmax(axis=1))) fig = plt.figure()
device = f.device() # 选择训练模式(GPU) print('训练模式:', device, '模式') # 残差网络(18指定的是带有权重的18层,包括卷积层和全连接层,不包括池化层和BN层) # pretrained=True 使用预训练模型 # 使用resnet18模型 transfer_model = models.resnet18(pretrained=True) for param in transfer_model.parameters(): # 屏蔽预训练模型的权重,只训练最后一层的全连接的权重 param.requires_grad = False # 修改最后一层维数,即 把原来的全连接层 替换成 输出维数为2的全连接层 # 提取fc层中固定的参数 dim = transfer_model.fc.in_features # 设置网络中的全连接层为2 transfer_model.fc = nn.Linear(dim, 2) # 构建神经网络 net = transfer_model.to(device) # 分类问题——交叉熵损失函数 criterion = nn.CrossEntropyLoss() # 优化器——随机梯度下降 # 学习率lr=10^-3; optimizer = torch.optim.SGD(net.fc.parameters(), lr=lr) # optimizer = torch.optim.Adam(net.parameters(), lr=lr) for epoch in range(n_epoch): print('第{}次训练'.format(epoch + 1)) f.train(net, optimizer, device, criterion, train_loader) f.validate(net, device, val_loader) # 仅保存和加载模型参数 torch.save(net.state_dict(), save_path)
cnn = myDenoisingAE(WIDTH, HEIGHT, CHANNELS) ### ここから下は,必要に応じて書き換えると良い ### # 追加条件の指定 conditions = {} conditions['in_channels'] = CHANNELS # 入力画像のチャンネル数が 3(カラー画像) conditions['out_channels'] = CHANNELS # 出力画像のチャンネル数も 3(カラー画像) conditions['input_with_noise'] = 100 # 入力画像にごま塩ノイズを 100 点分挿入する # 学習処理 cnn = train( device=dev, # 使用するGPUのID,変えなくて良い model_dir=MODEL_DIR, # 一時ファイルを保存するフォルダ,変えなくて良い in_data=imgfiles, # モデルの入力データ,今回はCIFAR10物体画像(ただしごま塩ノイズを挿入) out_data=imgfiles, # モデルの出力データ,今回はCIFAR10物体画像 model=cnn, # 学習するネットワークモデル loss_func=nn.MSELoss(), # 損失関数,今回は mean squared error batchsize=batchsize, # バッチサイズ epochs=epochs, # 総エポック数 stepsize=10, # 高速化のため,ミニバッチ10個につき1個しか学習に用いないことにする additional_conditions=conditions # 上で指定した追加条件 ) ### ここまで ### # 最終結果のモデルをファイルに保存 torch.save(cnn.to('cpu').state_dict(), model_filepath) print('', file=sys.stderr)
# ネットワークモデルの作成 cnn = myCNN2(WIDTH, HEIGHT, n_classes) ### ここから下は,必要に応じて書き換えると良い ### # 追加条件の指定 conditions = {} conditions['in_channels'] = CHANNELS # 入力画像のチャンネル数が 3(カラー画像) # 学習処理 cnn = train( device=dev, # 使用するGPUのID,変えなくて良い model_dir=MODEL_DIR, # 一時ファイルを保存するフォルダ,変えなくて良い in_data=imgfiles, # モデルの入力データ,今回はMNIST画像 out_data=labels, # モデルの出力データ,今回はクラスラベル model=cnn, # 学習するネットワークモデル loss_func=nn.CrossEntropyLoss(), # 損失関数,今回は softmax cross entropy batchsize=batchsize, # バッチサイズ epochs=epochs, # 総エポック数 stepsize=10, # 高速化のため,ミニバッチ10個につき1個しか学習に用いないことにする additional_conditions=conditions # 上で指定した追加条件 ) ### ここまで ### # 学習結果のモデルをファイルに保存 torch.save(cnn.state_dict(), model_filepath) print('', file=sys.stderr)
"\n################ Training Phase 1 - ANN for {} Epochs ################\n" .format(epochs1)) ann_logs = { "train_acc_1": [], "train_acc_2": [], "test_acc_1": [], "test_acc_2": [] } best_acc = 0 for epoch in range(epochs1): print("============ ANN1 - epoch {} / {}".format( epoch + 1, epochs1)) _, train_acc = func.train(net, "ann", train_loader_1, optimizer, device, epoch + 1, loss_f=loss_ann) _, test_acc = func.test(net, "ann", test_loader_1, device, loss_f=loss_ann) utils.debug_print(debug) if save_k > 0 and (epoch + 1) % save_k == 0: func.save_model( net, os.path.join("saved_models", "train_seq", "ann_{}.pth".format(epoch + 1)))