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

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

ただいまの
回答率

87.79%

tensorflow のセッションの仕様に関して

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 586

score 4

前提・実現したいこと

入力データをRNNとCNNにより特徴抽出し,その特徴量をK-meansによりクラスタリングを行います.
K-meansのクラスタリング結果を正解ラベルとして,損失関数を計算しパラメータを更新することを目指しています.

発生している問題・エラーメッセージ

上記のことを再現する上で,一度特徴抽出までを eval により feed_dict し実行し,その実行結果でK-meansを行い正解ラベルを作り,
さらに,モデルのパラメータを更新させるために train_step を再び feed_dict し実行しています.
その結果グラフを自動生成する問題なのかなんのエラーメッセージもなく,gpuでの実行を行っていることを伝えるメッセージだけでプログラムが終了してしまいます.
このメッセージは通常に動作している時も表示されます.
いまいちtensorflowのsessionの特性がわからず,これが仕様なのか工夫すれば実現できるのか,わかる方がいればご教授していただきたいです.

2019-08-23 03:26:01.306046: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2019-08-23 03:26:01.543479: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:964] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-08-23 03:26:01.543992: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1432] Found device 0 with properties: 
name: GeForce RTX 2080 major: 7 minor: 5 memoryClockRate(GHz): 1.86
pciBusID: 0000:01:00.0
totalMemory: 7.76GiB freeMemory: 7.59GiB
2019-08-23 03:26:01.544005: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1511] Adding visible gpu devices: 0
2019-08-23 03:26:01.751846: I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-08-23 03:26:01.751877: I tensorflow/core/common_runtime/gpu/gpu_device.cc:988]      0 
2019-08-23 03:26:01.751882: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1001] 0:   N 
2019-08-23 03:26:01.752161: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 7308 MB memory) -> physical GPU (device: 0, name: GeForce RTX 2080, pci bus id: 0000:01:00.0, compute capability: 7.5)

該当のソースコード

def inference(x, n_batch, keep_prob, pool_size, filter_size, conv_stride, pool_stride,
    n_convs, input_len=None, n_in = None, n_hidden=None, n_out=None):
    def weight_variable(shape):
        initial = tf.truncated_normal(shape, stddev=0.01)
        return tf.Variable(initial, name='V')

    def bias_variable(shape):
        initial = tf.zeros(shape, dtype=tf.float32)
        return tf.Variable(initial, name='c')

    with tf.name_scope('cell_initial'):
        cell = tf.contrib.rnn.GRUCell(n_hidden)
        initial_state = cell.zero_state(tf.shape(x)[0], tf.float32)
        state = initial_state
        outputs = []

    with tf.variable_scope('RNN'):
        for t in range(input_len):
            if t > 0:
                tf.get_variable_scope().reuse_variables()
            (cell_output, state) = cell(x[:, t, :], state)

            outputs.append(cell_output)

    outputs = tf.reshape(outputs, [n_out, n_batch, n_hidden * input_len])

    V = weight_variable([n_out, n_hidden * input_len])
    c = bias_variable([n_out, n_hidden * input_len])

    rnn_output = outputs * V + c

    rnn_output = tf.transpose(rnn_output, [1, 2, 0])
    # convnet
    def conv1d(x, W, stride):
        return tf.nn.conv1d(x, W, stride=stride , padding='VALID')#x = [batch, in_width(input_len), in_channels(n_in)]
#(1, stride, 1)
    def max_pool(x, stride):
        return tf.layers.max_pooling1d(x, pool_size=pool_size, #[1, 3, 1]\
            strides=stride, padding='valid')#x = (batch, length, channels)

    def weight_variable_cnn(shape):
        initial = tf.truncated_normal(shape, stddev=0.01)
        return tf.Variable(initial, name='V')

    def bias_variable_cnn(shape):
        initial = tf.zeros(shape, dtype=tf.float32)
        return tf.Variable(initial, name='c')

    # conv layers
    with tf.variable_scope('CNN'):
        for n_conv in range(n_convs):
            if n_conv > 0:
                tf.get_variable_scope().reuse_variables()
            else:
                pool = rnn_output # Convへの初期値定義
                cnn_out_dim = input_len * n_hidden

            w_conv = weight_variable_cnn([filter_size[n_conv], n_in, n_out])
            b_conv = bias_variable_cnn([n_in])

            # 畳み込み層
            conv = tf.nn.relu(conv1d(pool, w_conv, conv_stride[n_conv]) + b_conv)
            # プーリング層
            pool = max_pool(conv, pool_stride[n_conv])

            cnn_out_dim = (cnn_out_dim - filter_size[n_conv]) // conv_stride[n_conv] + 1
            cnn_out_dim = (cnn_out_dim - pool_size) // pool_stride[n_conv] + 1
            print(cnn_out_dim)

    # 完全結合層(出力層)
    w_out = weight_variable_cnn([cnn_out_dim, cnn_out_dim])
    b_out = bias_variable_cnn([cnn_out_dim])

    cnn_out = tf.nn.relu(tf.matmul(tf.reshape(pool, [n_batch, cnn_out_dim]), w_out) + b_out) #(n_batch, cnn_out_dim, n_out)
    cnn_out_drop = tf.nn.dropout(cnn_out, keep_prob)

    return cnn_out_drop, cnn_out_dim


def loss(cnn_out, t, cnn_out_dim, n_clusters):
    def softmax_weight(shape):
        initial = tf.truncated_normal(shape, stddev=0.01)
        return tf.Variable(initial, name='V')

    def softmax_bias(shape):
        initial = tf.zeros(shape, dtype=tf.float32)
        return tf.Variable(initial, name='c')

    w_soft = softmax_weight([cnn_out_dim, n_clusters])
    b_soft = softmax_bias([n_clusters])

    softmax_input = tf.matmul(cnn_out, w_soft) + b_soft #[n_batch, n_cluster]
    softmax_output = tf.nn.softmax(softmax_input)

    with tf.variable_scope('loss'):
        cross_entropy = tf.reduce_mean(-tf.reduce_sum(t * tf.log(softmax_output), axis=1))
        return cross_entropy

def training(loss, learning_rate):
    with tf.variable_scope('train_step'):
        optimizer = \
            tf.train.AdamOptimizer(learning_rate=learning_rate, beta1=0.9, beta2=0.999)
        train_step = optimizer.minimize(loss)
        return train_step

x = tf.placeholder(tf.float32, shape=[None, input_len, n_in])
t = tf.placeholder(tf.float32, shape=[None, n_clusters])
n_batch = tf.placeholder(tf.int32, shape=[])
keep_prob = tf.placeholder(tf.float32, shape=[])

y, cnn_out_dim = inference(x, n_batch, keep_prob,
              input_len=input_len,
              n_hidden=n_hidden,
              n_in=n_in,
              n_out=n_out,
              pool_size=pool_size,
              filter_size=filter_size,
              conv_stride=conv_stride,
              pool_stride=pool_stride,
              n_convs=n_convs)

loss = loss(y, t, cnn_out_dim, n_clusters)
train_step = training(loss = loss, learning_rate = learning_rate)

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

input_data = eval_X[k * 24: (k + learning_data_day_len-1) * 24]
indices = np.array(range(input_data.shape[0]))
input_data_train, input_data_validation, indices_train, indices_validation = \
    train_test_split(input_data, indices, test_size = N_validation)

penalty = 0
for epoch in range(epochs):
    X_ = shuffle(input_data_train)
    if epoch == 0 or penalty > 3:
        tf.reset_default_graph()
        centroid = 'k-means++'
        penalty = 0
        print('reset')

    with tf.name_scope('train'):
        for h in range(n_batches):
            start = h * batch_size
            end = start + batch_size

            features = y.eval(
                session = sess,
                feed_dict={
                    x: X_[start:end],
                    n_batch: batch_size,
                    keep_prob: 0.5
                }
            )

            print(features)

            # KMeans
            kmeans_model = KMeans(n_clusters=n_clusters, init = centroid, n_jobs=-1).fit(features)
            labels = kmeans_model.labels_
            centroid = kmeans_model.cluster_centers_

            # 擬似ラベル作成(one hot)
            cent_one_hot = np.identity(n_clusters)[labels]
            print(cent_one_hot)

            sess.run(train_step, feed_dict={
                x: X_[start:end],
                t: cent_one_hot,
                n_batch: batch_size,
                keep_prob: 0.5,
                # centroid: centroid_
            })

    cross_loss = loss.eval(session = sess,
    feed_dict={
        cnn_out: features,
        t: cent_one_hot
    })

    if epoch != 0 and cross_loss > cross_loss_old and cross_loss > 1:
        penalty += 1

    cross_loss_old = cross_loss

    print('epoch:', epoch,
          ' validation loss:', cross_loss)

    if cross_loss < 0.01:
        break

試したこと

コードの途中にあるbreakが原因かとも思いましたが消去しても変わりませんでした.
また,print などを使ってどこまで実行できているか確認したところ, y.eval までは実行できていたのですが,
train_step は呼び出しもされずに終了してしまっているようです.
やはり複数回 feed を行うと正常に optimize が行われないのでしょうか.

補足情報(FW/ツールのバージョンなど)

tensorflow は gpu バージョンのものを使っています.
実行にはtensorflowが用意しているdockerのイメージを使用しています.

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

まだ回答がついていません

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

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

関連した質問

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