質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Python 2.7

    1259questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • TensorFlow

    669questions

pythonのプログラムのメモリについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 199

yone_yone

score 12

pythonのプログラムを実行していく上でメモリについてわからないことがありましたので質問させていただきます。
現在、pythonでプログラムを書いているのですが、おそらく自分のプログラムの構成の仕方が悪いせいで、メモリを多く使ってしまっています。
そこで、なるべくメモリを消費しないようなpythonのプログラムを作成したいと思っています。

以下が現在使っているpythonのプログラムコードとなっています。(長くなってしまい、読みづらかったらすみません。)

# -*- coding: utf-8 -*-
#@test {"output": "ignore"}
import tensorflow as tf
import numpy as np
import pandas as pd
import glob
import os
import math

def read_file(filename):
    ds_tmp = []
    with open(filename, 'r') as f:
        print(filename)
        for i in f:
            txt = i.split()
            txt = [ float(s) for s in txt]
            ds_tmp.append(txt)

        ds = np.array(ds_tmp)
        return ds


def process(label):
    train_filename = "../text/text2/input_train_{}.txt".format(label)
    test_filename = "../text/text2/input_test_{}.txt".format(label)
    train_data = read_file(train_filename)
    test_data = read_file(test_filename)
    y_train = train_data[:, 4:]/50.0 # 4列目のみを抽出
    x_train = train_data[:, :4] # 0~4列目を抽出
    y_test = test_data[:, 4:]/50.0
    x_test = test_data[:, :4]

    num_examples = y_train.shape[0]
    num_input = x_train.shape[1]

    bias_with_x = np.insert(x_train, 0, 1, axis=1).astype(np.float32)
    bias_with_x_test = np.insert(x_test, 0, 1, axis=1).astype(np.float32)

    num_hidden1 = 40
    num_hidden2 = 40
    training_steps = 25000
    learning_rate = 0.005
    lambda_2 = 0.00000001
    MAE_train_ave = 0
    MAE_test_ave = 0

    for seed in range(1,11):
        losses = []

        with tf.Session() as sess:
            # Set up all the tensors, variables, and operations.
            input = tf.constant(bias_with_x)
            target = tf.constant(np.transpose([y_train]).astype(np.float32))
            shape = [num_input+1, num_hidden1]
            n = shape[0] * shape[1]
            stddev = math.sqrt(2.0 / n)
            initial = tf.truncated_normal(shape=shape, stddev=stddev, seed=seed)
            weights = tf.Variable(initial, name=None)
            bias = tf.Variable(tf.random_uniform([num_hidden1], minval=-2.0, maxval=2.0, seed=seed))

            shape = [num_hidden1, num_hidden2]
            n = shape[0] * shape[1]
            stddev = math.sqrt(2.0 / n)
            initial = tf.truncated_normal(shape=shape, stddev=stddev, seed=seed)
            weights1 = tf.Variable(initial, name=None)
            bias1 = tf.Variable(tf.random_uniform([num_hidden2], minval=-2.0, maxval=2.0, seed=seed))

            shape = [num_hidden2, 1]
            n = shape[0] * shape[1]
            stddev = math.sqrt(2.0 / n)
            initial = tf.truncated_normal(shape=shape, stddev=stddev, seed=seed)
            weights2 = tf.Variable(initial, name=None)
            bias2 = tf.Variable(tf.random_uniform([1], minval=-2.0, maxval=2.0, seed=seed))
            tf.global_variables_initializer().run()

            y1 = tf.nn.relu(tf.matmul(input, weights))
            y2 = tf.nn.relu(tf.matmul(y1, weights1))
            yhat = tf.sigmoid(tf.matmul(y2, weights2))
            yerror = tf.subtract(yhat, target)
            loss1 = tf.nn.l2_loss(yerror)
            L2_sqr = tf.nn.l2_loss(weights) + tf.nn.l2_loss(weights1) + tf.nn.l2_loss(weights2)
            loss = loss1 + lambda_2 * L2_sqr

            input_test = tf.constant(bias_with_x_test)
            target_test = tf.constant(np.transpose([y_test]).astype(np.float32))
            y1_test = tf.nn.relu(tf.matmul(input_test, weights))
            y2_test = tf.nn.relu(tf.matmul(y1_test, weights1))
            yhat_test = tf.sigmoid(tf.matmul(y2_test, weights2))

            update_weights = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

            for i in range(training_steps):
                update_weights.run()
                losses.append(loss.eval())
            # Training is done, get the final values for the graphs
            betas = weights.eval()
            yhat = yhat.eval()
            error = np.sqrt(((y_train-yhat)*(y_train-yhat)).mean()) #RMSEの算出

            size = len(y_train)
            MAE = (np.sum(np.abs(y_train-yhat)))/size

            yhat_test = yhat_test.eval()
            size = len(y_test)
            MAE_test = (np.sum(np.abs(y_test-yhat_test)))/size

            global MAE_train_ave
            MAE_train_ave += MAE

            global MAE_test_ave
            MAE_test_ave += MAE_test

    Train = MAE_train_ave/10.0        
    Test = MAE_test_ave/10.0
    print('学習誤差 : %s' % Train)
    print('テスト誤差 : %s' % Test)


def main():
    with open('../text/text2/label_text2.txt', 'r') as label:
        a_list = [line.rstrip() for line in label]

    for label in a_list:
        process(label)

if __name__ == '__main__':
    main()


※ご回答いただいた内容に質問させていただくこともあるかと思いますので、
※よろしければご返信いただければと思います。 

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • YouheiSakurai

    2018/07/26 09:14

    1ステップ(or 数ステップ)ずつ処理を止めてメモリ使用量を観察してどこで使用量が増えているか特定すると良いですよ。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/07/26 12:13

    memory_profilerを使えばそれできますよ

    キャンセル

  • yone_yone

    2018/07/26 13:49

    アドバイスありがとうございます。実際に試してみます。

    キャンセル

回答 1

check解決した方法

0

memory_profilerというモジュールを使うことでプログラムの一行ごとに、使われているメモリ量が確認できるようです。
python:memory_profilerでプログラムのメモリ使用量を調べる

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 2.7

    1259questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • TensorFlow

    669questions