def test_nn_regression(model, x_test, y_test): """ 回帰タイプのNNを学習させる @param model: NNの構造モデルオブジェクト @param x_test: テストデータの特徴量 @param y_test: テストデータの教師信号 @return: 予測結果のリスト、ロスのリスト """ # テストサンプル数 test_sample_size = len(x_test) sum_loss = 0 # 実際の出力クラスとその確信度 predicted_value_list = [] loss_list = [] for i in xrange(0, test_sample_size): x_batch = x_test[i:i+1] y_batch = y_test[i:i+1] # 順伝播させて誤差と予測値を算出 loss, predicted = forward_data_regression(model, x_batch, y_batch, train=False) # 結果の格納 predicted_value_list.append(float(cuda.to_cpu(predicted.data))) loss_list.append(float(cuda.to_cpu(loss.data))) sum_loss += float(cuda.to_cpu(loss.data)) return predicted_value_list, loss_list
def train_nn_regression(model, x_train, y_train, batchsize, epoch_num, test_flag=False, x_test=None, y_test=None, print_flag=False): """ 回帰タイプのNNを学習させる Adamと呼ばれるパラメータの最適化手法を使用 @param model: NNの構造モデルオブジェクト @param x_train: トレーニングデータの特徴量 @param y_train: トレーニングデータの教師信号 @param batchsize: 確率的勾配降下法で学習させる際の1回分のバッチサイズ @param epoch_num: エポック数(1データセットの学習繰り返し数) @keyword test_flag: テストデータの識別率を学習と同時並行して出力 """ # Adadeltaで学習 opts = optimizers.AdaDelta() # class typeと違うよ opts.setup(model) if print_flag: pace = 10 # 何epochごとに結果を出力するか if test_flag: pace = 10 # 何epochごとに結果を出力するか test_sample_size = len(x_test) #データ数 sample_num = len(x_train) #学習ループ # 識別率とロス sum_accuracy = 0 sum_loss = 0 for epoch in xrange(1, epoch_num + 1): # サンプルの順番をランダムに並び替える perm = np.random.permutation( sample_num) # permutationはshuffleと違い、新しいリストを生成する # 1epochにおける識別率 sum_accuracy_on_epoch = 0 sum_loss_on_epoch = 0 # データをバッチサイズごとに使って学習 # 今回バッチサイズは1なので、サンプルサイズ数分学習 for i in xrange(0, sample_num, batchsize): x_batch = x_train[perm[i:i + batchsize]] y_batch = y_train[perm[i:i + batchsize]] # 勾配(多分、偏微分分のgrad)を初期化 opts.zero_grads() # 順伝播させて誤差と予測結果を算出 loss, predicted = forward_data_regression(model, x_batch, y_batch) # 誤差逆伝播で勾配を計算 loss.backward() # 勾配(gradを使って本物のweight)を更新 opts.update() # ロスの算出 sum_loss_on_epoch += float(cuda.to_cpu(loss.data)) # 識別率とロスの積算 loss_on_epoch = sum_loss_on_epoch / (sample_num / batchsize) sum_loss += loss_on_epoch if print_flag: if epoch % pace == 0: print 'epoch', epoch print 'train now: loss={}'.format(loss_on_epoch) #print 'train mean: loss={}, accuracy={}'.format(sum_loss / epoch, sum_accuracy / epoch) # テストデータでの誤差と、正解精度を表示。汎化性能を確認。 ######################### if test_flag: if epoch % pace == 0: predicted_value_list, loss_list = test_nn_regression( model, x_test, y_test) print 'test: loss={}, teach={}, predicted={}'.format( np.average(loss_list), y_test, predicted_value_list) # test_sum_accuracy = 0 # test_sum_loss = 0 # # acc_t=np.zeros(((test_sample_size/batchsize), 5)) # for i in xrange(0, test_sample_size, batchsize): # x_batch = x_test[i:i+batchsize] # y_batch = y_test[i:i+batchsize] # # # 順伝播させて誤差と精度を算出 # loss, predicted = forward_data_reg(model, x_batch, y_batch, train=False) # acc_t[i][0]=float(cuda.to_cpu(loss.data)) # acc_t[i][1]=float(cuda.to_cpu(predicted.data)) # acc_t[i][2]=float(cuda.to_cpu(y_batch)) #教師信号 # # test_sum_loss += float(cuda.to_cpu(loss.data)) # # # テストデータでの誤差と、正解精度を表示 # print 'test: loss={}'.format(test_sum_loss / (test_sample_size / batchsize)) return opts
def train_nn_regression(model, x_train, y_train, batchsize, epoch_num, test_flag = False, x_test = None, y_test = None, print_flag = False): """ 回帰タイプのNNを学習させる Adamと呼ばれるパラメータの最適化手法を使用 @param model: NNの構造モデルオブジェクト @param x_train: トレーニングデータの特徴量 @param y_train: トレーニングデータの教師信号 @param batchsize: 確率的勾配降下法で学習させる際の1回分のバッチサイズ @param epoch_num: エポック数(1データセットの学習繰り返し数) @keyword test_flag: テストデータの識別率を学習と同時並行して出力 """ # Adadeltaで学習 opts = optimizers.AdaDelta() # class typeと違うよ opts.setup(model) if print_flag: pace = 10 # 何epochごとに結果を出力するか if test_flag: pace = 10 # 何epochごとに結果を出力するか test_sample_size = len(x_test) #データ数 sample_num = len(x_train) #学習ループ # 識別率とロス sum_accuracy = 0 sum_loss = 0 for epoch in xrange(1, epoch_num+1): # サンプルの順番をランダムに並び替える perm = np.random.permutation(sample_num) # permutationはshuffleと違い、新しいリストを生成する # 1epochにおける識別率 sum_accuracy_on_epoch = 0 sum_loss_on_epoch = 0 # データをバッチサイズごとに使って学習 # 今回バッチサイズは1なので、サンプルサイズ数分学習 for i in xrange(0, sample_num, batchsize): x_batch = x_train[perm[i:i+batchsize]] y_batch = y_train[perm[i:i+batchsize]] # 勾配(多分、偏微分分のgrad)を初期化 opts.zero_grads() # 順伝播させて誤差と予測結果を算出 loss, predicted = forward_data_regression(model, x_batch, y_batch) # 誤差逆伝播で勾配を計算 loss.backward() # 勾配(gradを使って本物のweight)を更新 opts.update() # ロスの算出 sum_loss_on_epoch += float(cuda.to_cpu(loss.data)) # 識別率とロスの積算 loss_on_epoch = sum_loss_on_epoch / (sample_num / batchsize) sum_loss += loss_on_epoch if print_flag: if epoch % pace == 0: print 'epoch', epoch print 'train now: loss={}'.format(loss_on_epoch) #print 'train mean: loss={}, accuracy={}'.format(sum_loss / epoch, sum_accuracy / epoch) # テストデータでの誤差と、正解精度を表示。汎化性能を確認。 ######################### if test_flag: if epoch % pace == 0: predicted_value_list, loss_list = test_nn_regression(model, x_test, y_test) print 'test: loss={}, teach={}, predicted={}'.format(np.average(loss_list), y_test, predicted_value_list) # test_sum_accuracy = 0 # test_sum_loss = 0 # # acc_t=np.zeros(((test_sample_size/batchsize), 5)) # for i in xrange(0, test_sample_size, batchsize): # x_batch = x_test[i:i+batchsize] # y_batch = y_test[i:i+batchsize] # # # 順伝播させて誤差と精度を算出 # loss, predicted = forward_data_reg(model, x_batch, y_batch, train=False) # acc_t[i][0]=float(cuda.to_cpu(loss.data)) # acc_t[i][1]=float(cuda.to_cpu(predicted.data)) # acc_t[i][2]=float(cuda.to_cpu(y_batch)) #教師信号 # # test_sum_loss += float(cuda.to_cpu(loss.data)) # # # テストデータでの誤差と、正解精度を表示 # print 'test: loss={}'.format(test_sum_loss / (test_sample_size / batchsize)) return opts