Esempio n. 1
0
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
    
    
Esempio n. 2
0
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
Esempio n. 3
0
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