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

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

ただいまの
回答率

90.62%

  • Python

    7436questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    5847questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Keras

    184questions

KerasでTypeErrorが出てしまいます。

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 684
退会済みユーザー

退会済みユーザー

前提・実現したいこと

KerasでRecognizing Textual Entailmentという問題をとこうと思い、以下のサイトを参考にコードを書いてみましたが、うまくいきません。
LSTMとAttentionを組み合わせようとしているのですが、TypeErrorが出てしまいます。

参考にしたサイト

Recognizing Textual EntailmentをLSTMで解く
keras-attention-mechanism

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

TypeError: 'Tensor' object is not callable

該当のソースコード

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import numpy as np
import pandas as pd

import keras.backend as K

from keras.preprocessing.text import Tokenizer
from keras.preprocessing import sequence

from keras.layers.core import *
from keras.layers.recurrent import LSTM

from keras.models import Sequential, Model
from keras.layers import Input, Dense, Embedding, Dropout, LSTM
from keras.layers.normalization import BatchNormalization
from keras.layers.advanced_activations import PReLU
from keras.layers import merge
from keras.utils import np_utils

from keras.callbacks import TensorBoard
from keras.callbacks import EarlyStopping, ModelCheckpoint

from gensim.models import KeyedVectors

np.random.seed(6162)

# =====data preprocess=====
train_df = pd.read_csv("SNLI/snli_1.0/snli_1.0_train.txt", sep="\t", header=0)
dev_df = pd.read_csv("SNLI/snli_1.0/snli_1.0_dev.txt", sep="\t", header=0)
test_df = pd.read_csv("SNLI/snli_1.0/snli_1.0_test.txt", sep="\t", header=0)

# rm y label "-" line and fillna
train_df = train_df[train_df["gold_label"] != "-"].fillna("")
dev_df = dev_df[dev_df["gold_label"] != "-"].fillna("")
test_df = test_df[test_df["gold_label"] != "-"].fillna("")

tokenizer = Tokenizer()
tokenizer.fit_on_texts(train_df["sentence1"])
tokenizer.fit_on_texts(train_df["sentence2"])
tokenizer.fit_on_texts(dev_df["sentence1"])
tokenizer.fit_on_texts(dev_df["sentence2"])
tokenizer.fit_on_texts(test_df["sentence1"])
tokenizer.fit_on_texts(test_df["sentence2"])

seq_train1 = tokenizer.texts_to_sequences(train_df["sentence1"])
seq_train2 = tokenizer.texts_to_sequences(train_df["sentence2"])
seq_dev1 = tokenizer.texts_to_sequences(dev_df["sentence1"])
seq_dev2 = tokenizer.texts_to_sequences(dev_df["sentence2"])
seq_test1 = tokenizer.texts_to_sequences(test_df["sentence1"])
seq_test2 = tokenizer.texts_to_sequences(test_df["sentence2"])

maxlen = 78

X_train1 = sequence.pad_sequences(seq_train1, maxlen=maxlen)
X_train2 = sequence.pad_sequences(seq_train2, maxlen=maxlen)
X_train = [X_train1, X_train2]

y_label = {"contradiction":0, "entailment":1, "neutral":2}
y_train = [y_label[i] for i in train_df["gold_label"]]
y_train = np_utils.to_categorical(y_train, 3)

X_dev1 = sequence.pad_sequences(seq_dev1, maxlen=maxlen)
X_dev2 = sequence.pad_sequences(seq_dev2, maxlen=maxlen)
X_dev = [X_dev1, X_dev2]

y_dev = [y_label[i] for i in dev_df["gold_label"]]
y_dev = np_utils.to_categorical(y_dev, 3)

X_test1 = sequence.pad_sequences(seq_test1, maxlen=maxlen)
X_test2 = sequence.pad_sequences(seq_test2, maxlen=maxlen)
X_test = [X_test1, X_test2]

y_test = [y_label[i] for i in test_df["gold_label"]]
y_test = np_utils.to_categorical(y_test, 3)


# =====preapare embedding matrix=====
word_index = tokenizer.word_index
num_words = len(word_index)

embeddings_index = {}
with open("/SNLI/glove.840B.300d.txt") as f:
    for line in f:
        values = line.split()
        word = values[0]
        coefs = np.asarray(values[1:], dtype="float32")
        embeddings_index[word] = coefs


embedding_matrix = np.zeros((len(word_index) + 1, 200))
for word, i in word_index.items():
    embedding_vector = embeddings_index.get(word)
    if embedding_vector is not None:
        # words not found in embedding index will be all-zeros.
        embedding_matrix[i] = embedding_vector


# =====LSTM model=====
batch_size = 512
nb_epochs = 50
lstm_dim = 200
embedding_dim = 200
max_features = 1000

input1 = Input(shape=(batch_size,))
embed1 = Embedding(num_words + 1,
                   embedding_dim,
                   weights=[embedding_matrix],
                   trainable=False)(input1)
model1 = LSTM(embedding_dim, recurrent_dropout=0.5, dropout=0.5)(embed1)

input2 = Input(shape=(batch_size,))
embed2 = Embedding(num_words + 1,
                   embedding_dim,
                   weights=[embedding_matrix],
                   trainable=False)(input2)
model2 = LSTM(embedding_dim, recurrent_dropout=0.5, dropout=0.5)(embed2)

#--attention--
INPUT_DIM = 2
TIME_STEPS = 20

def attention_3d_block(inputs):
    # inputs.shape = (batch_size, time_steps, input_dim)
    input_dim = int(inputs.shape[2])
    a = Permute((2, 1))(inputs)
    a = Reshape((input_dim, TIME_STEPS))(a) # this line is not useful. It's just to know which dimension is what.
    a = Dense(TIME_STEPS, activation='softmax')(a)
    a_probs = Permute((2, 1), name='attention_vec')(a)
    output_attention_mul = merge([inputs, a_probs], name='attention_mul', mode='mul')
    return output_attention_mul

inputs = Input(shape=(TIME_STEPS, INPUT_DIM,))
# hidden = merge([model1, model2, K.learning_phase()], name='hidden_layer', mode="concat")(inputs)
hidden = merge([model1, model2], name='hidden_layer', mode="concat")(inputs)
lstm_units = 32
lstm_out = LSTM(lstm_units, return_sequences=True)(hidden)
attention_mul = attention_3d_block(lstm_out)
attention_mul = Flatten()(attention_mul)
output = Dense(1, activation='sigmoid')(attention_mul)
model = Model(input=[inputs], output=output)
#-------------
model.compile(loss="categorical_crossentropy",
              optimizer="adam",
              metrics=["accuracy"]
              )


model.fit(X_train, y_train,
          batch_size=batch_size,
          epochs=nb_epochs,
          validation_data=(X_dev, y_dev),
          shuffle=True,
          )

#--attention--
attention_vectors = []
for i in range(300):
    attention_vector = np.mean(get_activations(m,
                                               X_test,
                                               print_shape_only=True,
                                               layer_name='attention_vec')[0], axis=2).squeeze()
    print('attention =', attention_vector)
    assert (np.sum(attention_vector) - 1.0) < 1e-5
    attention_vectors.append(attention_vector)

attention_vector_final = np.mean(np.array(attention_vectors), axis=0)
#-------------

y_pred = model.predict_classes(X_test, batch_size=batch_size).flatten()
score, acc = model.evaluate(X_test, y_test, batch_size=batch_size)

print()
print("Test score:", score)
print("Test accuracy:", acc)

試したこと

参考にしたサイトでは、Sequentialモデルを使用していましたが、Functional APIに変更しました。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

hidden = merge([model1, model2, K.learning_phase()], name='hidden_layer', mode="concat")(inputs)
のK.learning_phase()がTypeErrorの原因です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/17 16:26

    回答ありがとうございます!
    K.learning_phase()を削除したところ、
    TypeError: 'Tensor' object is not callable
    という別のエラーが出てしまいました。
    もし原因がわかれば教えていただけたら嬉しいです。
    よろしくお願いします。

    キャンセル

  • 2017/12/17 16:46

    エラーのトレースバックはありませんか。

    キャンセル

  • 2017/12/17 16:51

    Traceback (most recent call last):
    File "snli-LSTM-attention.py", line 179, in <module>
    hidden = merge([model1, model2], name='hidden_layer', mode="concat")(inputs)
    TypeError: 'Tensor' object is not callable
    となっています。

    キャンセル

  • 2017/12/17 16:56

    正しくは、
    hidden = merge([model1, model2, inputs], name='hidden_layer', mode="concat")
    だったりしませんか。

    キャンセル

  • 2017/12/17 16:57

    もしくは、
    from keras.layers import Concatenate
    hidden = Concatenate()([model1, model2, inputs])
    でしょうか。

    キャンセル

  • 2017/12/17 17:07

    回答ありがとうございます。
    from keras.layers import Concatenate
    hidden = Concatenate()([model1, model2, inputs])
    でいけそうです。
    また躓いたら、よろしくお願いします。

    キャンセル

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

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

関連した質問

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

  • Python

    7436questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    5847questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Keras

    184questions