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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

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

Python

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

Q&A

1回答

5666閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2017/12/17 05:53

編集2017/12/17 07:32

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

###参考にしたサイト
Recognizing Textual EntailmentをLSTMで解く
keras-attention-mechanism

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

TypeError: 'Tensor' object is not callable

###該当のソースコード

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4import os 5import numpy as np 6import pandas as pd 7 8import keras.backend as K 9 10from keras.preprocessing.text import Tokenizer 11from keras.preprocessing import sequence 12 13from keras.layers.core import * 14from keras.layers.recurrent import LSTM 15 16from keras.models import Sequential, Model 17from keras.layers import Input, Dense, Embedding, Dropout, LSTM 18from keras.layers.normalization import BatchNormalization 19from keras.layers.advanced_activations import PReLU 20from keras.layers import merge 21from keras.utils import np_utils 22 23from keras.callbacks import TensorBoard 24from keras.callbacks import EarlyStopping, ModelCheckpoint 25 26from gensim.models import KeyedVectors 27 28np.random.seed(6162) 29 30# =====data preprocess===== 31train_df = pd.read_csv("SNLI/snli_1.0/snli_1.0_train.txt", sep="\t", header=0) 32dev_df = pd.read_csv("SNLI/snli_1.0/snli_1.0_dev.txt", sep="\t", header=0) 33test_df = pd.read_csv("SNLI/snli_1.0/snli_1.0_test.txt", sep="\t", header=0) 34 35# rm y label "-" line and fillna 36train_df = train_df[train_df["gold_label"] != "-"].fillna("") 37dev_df = dev_df[dev_df["gold_label"] != "-"].fillna("") 38test_df = test_df[test_df["gold_label"] != "-"].fillna("") 39 40tokenizer = Tokenizer() 41tokenizer.fit_on_texts(train_df["sentence1"]) 42tokenizer.fit_on_texts(train_df["sentence2"]) 43tokenizer.fit_on_texts(dev_df["sentence1"]) 44tokenizer.fit_on_texts(dev_df["sentence2"]) 45tokenizer.fit_on_texts(test_df["sentence1"]) 46tokenizer.fit_on_texts(test_df["sentence2"]) 47 48seq_train1 = tokenizer.texts_to_sequences(train_df["sentence1"]) 49seq_train2 = tokenizer.texts_to_sequences(train_df["sentence2"]) 50seq_dev1 = tokenizer.texts_to_sequences(dev_df["sentence1"]) 51seq_dev2 = tokenizer.texts_to_sequences(dev_df["sentence2"]) 52seq_test1 = tokenizer.texts_to_sequences(test_df["sentence1"]) 53seq_test2 = tokenizer.texts_to_sequences(test_df["sentence2"]) 54 55maxlen = 78 56 57X_train1 = sequence.pad_sequences(seq_train1, maxlen=maxlen) 58X_train2 = sequence.pad_sequences(seq_train2, maxlen=maxlen) 59X_train = [X_train1, X_train2] 60 61y_label = {"contradiction":0, "entailment":1, "neutral":2} 62y_train = [y_label[i] for i in train_df["gold_label"]] 63y_train = np_utils.to_categorical(y_train, 3) 64 65X_dev1 = sequence.pad_sequences(seq_dev1, maxlen=maxlen) 66X_dev2 = sequence.pad_sequences(seq_dev2, maxlen=maxlen) 67X_dev = [X_dev1, X_dev2] 68 69y_dev = [y_label[i] for i in dev_df["gold_label"]] 70y_dev = np_utils.to_categorical(y_dev, 3) 71 72X_test1 = sequence.pad_sequences(seq_test1, maxlen=maxlen) 73X_test2 = sequence.pad_sequences(seq_test2, maxlen=maxlen) 74X_test = [X_test1, X_test2] 75 76y_test = [y_label[i] for i in test_df["gold_label"]] 77y_test = np_utils.to_categorical(y_test, 3) 78 79 80# =====preapare embedding matrix===== 81word_index = tokenizer.word_index 82num_words = len(word_index) 83 84embeddings_index = {} 85with open("/SNLI/glove.840B.300d.txt") as f: 86 for line in f: 87 values = line.split() 88 word = values[0] 89 coefs = np.asarray(values[1:], dtype="float32") 90 embeddings_index[word] = coefs 91 92 93embedding_matrix = np.zeros((len(word_index) + 1, 200)) 94for word, i in word_index.items(): 95 embedding_vector = embeddings_index.get(word) 96 if embedding_vector is not None: 97 # words not found in embedding index will be all-zeros. 98 embedding_matrix[i] = embedding_vector 99 100 101# =====LSTM model===== 102batch_size = 512 103nb_epochs = 50 104lstm_dim = 200 105embedding_dim = 200 106max_features = 1000 107 108input1 = Input(shape=(batch_size,)) 109embed1 = Embedding(num_words + 1, 110 embedding_dim, 111 weights=[embedding_matrix], 112 trainable=False)(input1) 113model1 = LSTM(embedding_dim, recurrent_dropout=0.5, dropout=0.5)(embed1) 114 115input2 = Input(shape=(batch_size,)) 116embed2 = Embedding(num_words + 1, 117 embedding_dim, 118 weights=[embedding_matrix], 119 trainable=False)(input2) 120model2 = LSTM(embedding_dim, recurrent_dropout=0.5, dropout=0.5)(embed2) 121 122#--attention-- 123INPUT_DIM = 2 124TIME_STEPS = 20 125 126def attention_3d_block(inputs): 127 # inputs.shape = (batch_size, time_steps, input_dim) 128 input_dim = int(inputs.shape[2]) 129 a = Permute((2, 1))(inputs) 130 a = Reshape((input_dim, TIME_STEPS))(a) # this line is not useful. It's just to know which dimension is what. 131 a = Dense(TIME_STEPS, activation='softmax')(a) 132 a_probs = Permute((2, 1), name='attention_vec')(a) 133 output_attention_mul = merge([inputs, a_probs], name='attention_mul', mode='mul') 134 return output_attention_mul 135 136inputs = Input(shape=(TIME_STEPS, INPUT_DIM,)) 137# hidden = merge([model1, model2, K.learning_phase()], name='hidden_layer', mode="concat")(inputs) 138hidden = merge([model1, model2], name='hidden_layer', mode="concat")(inputs) 139lstm_units = 32 140lstm_out = LSTM(lstm_units, return_sequences=True)(hidden) 141attention_mul = attention_3d_block(lstm_out) 142attention_mul = Flatten()(attention_mul) 143output = Dense(1, activation='sigmoid')(attention_mul) 144model = Model(input=[inputs], output=output) 145#------------- 146model.compile(loss="categorical_crossentropy", 147 optimizer="adam", 148 metrics=["accuracy"] 149 ) 150 151 152model.fit(X_train, y_train, 153 batch_size=batch_size, 154 epochs=nb_epochs, 155 validation_data=(X_dev, y_dev), 156 shuffle=True, 157 ) 158 159#--attention-- 160attention_vectors = [] 161for i in range(300): 162 attention_vector = np.mean(get_activations(m, 163 X_test, 164 print_shape_only=True, 165 layer_name='attention_vec')[0], axis=2).squeeze() 166 print('attention =', attention_vector) 167 assert (np.sum(attention_vector) - 1.0) < 1e-5 168 attention_vectors.append(attention_vector) 169 170attention_vector_final = np.mean(np.array(attention_vectors), axis=0) 171#------------- 172 173y_pred = model.predict_classes(X_test, batch_size=batch_size).flatten() 174score, acc = model.evaluate(X_test, y_test, batch_size=batch_size) 175 176print() 177print("Test score:", score) 178print("Test accuracy:", acc)

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

投稿2017/12/17 07:14

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/17 07:26

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

2017/12/17 07:46

エラーのトレースバックはありませんか。
退会済みユーザー

退会済みユーザー

2017/12/17 07: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 となっています。
mkgrei

2017/12/17 07:56

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

2017/12/17 07:57

もしくは、 from keras.layers import Concatenate hidden = Concatenate()([model1, model2, inputs]) でしょうか。
退会済みユーザー

退会済みユーザー

2017/12/17 08:07

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問