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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python

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

解決済

TypeError: 'str' object is not callable

omugi
omugi

総合スコア0

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python

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

3回答

0評価

0クリップ

1404閲覧

投稿2020/04/24 18:17

編集2022/01/12 10:58

前提・実現したいこと

pythonで深層学習(CNN,LSTM)の勉強をしています。
jupyter notebookを使って、
サンプルコードの実装で以下のエラーが発生しました。

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

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-5-8c39078450c0> in <module> 70 71 #キャプションと画像の紐づけ ---> 72 descriptions = load_descriptions(doc) 73 74 #余計な記号を除去する関数 <ipython-input-5-8c39078450c0> in load_descriptions(doc) 65 image_desc = ' '.join(image_desc) #キャプションの単語を文字列に戻す 66 if image_id not in mapping: #その画像名が一つ目ならリストを作成 ---> 67 mapping[image_id] = list() 68 mapping[image_id].append(image_desc) #画像名にキャプションを紐づけてディクショナリに格納 69 return mapping TypeError: 'str' object is not callable

該当のソースコード

Python

# -*- coding: utf-8 -*- from os import listdir from pickle import dump from keras.applications.vgg16 import VGG16,preprocess_input from keras.preprocessing.image import load_img,img_to_array from keras.models import Model import string from pickle import load from keras.preprocessing.text import Tokenizer from keras.preprocessing.sequence import pad_sequences from keras.utils import to_categorical from numpy import array from keras.layers import Input,Dense,LSTM,Embedding,Dropout from keras.layers.merge import add from keras.callbacks import ModelCheckpoint image_directory = 'photo_data'#画像データのパスを指定すること caption_data = 'caption.txt'#キャプションデータのパスを指定すること train_data = 'train.txt'#トレーニングデータのパスを指定すること val_data = 'val.txt'#バリデーションデータのパスを指定すること # 指定したディレクトリ内の各写真から特徴を抽出する関数 def extract_features(directory): model = VGG16() model.layers.pop() model = Model(inputs=model.inputs, outputs=model.layers[-1].output) features = dict() #特徴を格納するためのディクショナリ for name in listdir(directory): filename = directory + '/' + name #ファイルから画像を読み込む image = load_img(filename, target_size=(224, 224)) #VGG16用に224×224に成形 image = img_to_array(image) #numpy配列に変換 image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2])) #モデルに読み込ませるために成形 image = preprocess_input(image) #VGGモデルに画像を読み込ませる feature = model.predict(image, verbose=0) #特徴抽出 image_id = name.split('.')[0] #画像の名前を取得 features[image_id] = feature #画像の名前と特徴を紐付け return features #特徴抽出 features = extract_features(image_directory) #特徴をpklファイルとして保存 dump(features, open('features.pkl', 'wb')) #ファイルを読み込む関数 def load_doc(filename): file = open(filename, 'r', encoding='utf-8') text = file.read() file.close() return text #キャプションデータの読み込み doc = load_doc(caption_data) ##---------エラーの該当場所---------------------- #キャプションと画像名を紐づけする関数 def load_descriptions(doc): mapping = dict() for line in doc.split('\n'): tokens = line.split() if len(line) < 2: continue image_id, image_desc = tokens[0], tokens[1:] #最初の単語を画像名、残り全てをキャプションとして読み込む image_id = image_id.split('.')[0] #ピリオドより手前を画像名とする image_desc = ' '.join(image_desc) #キャプションの単語を文字列に戻す if image_id not in mapping: #その画像名が一つ目ならリストを作成 mapping[image_id] = list() mapping[image_id].append(image_desc) #画像名にキャプションを紐づけてディクショナリに格納 return mapping #キャプションと画像の紐づけ descriptions = load_descriptions(doc) ##-------------------------------------------------------- #余計な記号を除去する関数 def clean_descriptions(descriptions): table = str.maketrans('', '', string.punctuation)#記号をリストアップ for key, desc_list in descriptions.items(): for i in range(len(desc_list)): desc = desc_list[i] desc = desc.split() #キャプションを単語に区切る desc = [w.translate(table) for w in desc] #記号を消去 desc_list[i] = ' '.join(desc) #キャプションの単語を文字列に戻す #余計な記号を除去する clean_descriptions(descriptions) #語彙が縮小されたキャプションを保存する関数 def save_descriptions(descriptions, filename): lines = list() for key, desc_list in descriptions.items(): for desc in desc_list: lines.append(key + ' ' + desc) data = '\n'.join(lines) file = open(filename, 'w', encoding='utf-8') file.write(data) file.close() #語彙が縮小されたキャプションをtxtファイルとして保存 save_descriptions(descriptions, 'descriptions.txt') #画像数のチェック print('Loaded: %d ' % len(descriptions)) #データセットの画像名のリストを作成する関数 def load_set(filename): doc = load_doc(filename) dataset = list() for line in doc.split('\n'): if len(line) < 1: continue identifier = line.split('.')[0] dataset.append(identifier) return set(dataset) #トレーニングデータの画像名のリスト作成 train = load_set(train_data) #バリデーションデータの画像名のリスト作成 val = load_set(val_data) #画像名とキャプションを紐付けたディクショナリを作成する関数 def load_clean_descriptions(filename, dataset):#引数datasetはtrainとかvalとか doc = load_doc(filename) descriptions = dict() for line in doc.split('\n'):#一行ずつ読み込む tokens = line.split() #空白で区切る image_id, image_desc = tokens[0], tokens[1:] #最初の単語を画像名、残り全てをキャプションとして読み込む if image_id in dataset: #画像名がデータセット中に指定されていれば以下を実行 if image_id not in descriptions: #その画像名が一つ目ならリストを作成 descriptions[image_id] = list() desc = 'startseq ' + ' '.join(image_desc) + ' endseq' #キャプションを開始語と終了語で囲む descriptions[image_id].append(desc) #ディクショナリに格納 return descriptions #トレーニングデータのキャプションと画像名を紐付ける train_descriptions = load_clean_descriptions('descriptions.txt', train) #バリデーションデータのキャプションと画像名を紐付ける val_descriptions = load_clean_descriptions('descriptions.txt', val) #画像の特徴量を読み込む関数 def load_photo_features(filename, dataset): all_features = load(open(filename, 'rb')) features = {k: all_features[k] for k in dataset}#画像名と特徴量を紐づけてディクショナリに格納 return features #トレーニングデータの特徴量と画像名を紐付ける train_features = load_photo_features('features.pkl', train) #バリデーションデータの特徴量と画像名を紐付ける val_features = load_photo_features('features.pkl', test) #キャプションのディクショナリをリストにする関数 def to_lines(descriptions): all_desc = list() for key in descriptions.keys(): [all_desc.append(d) for d in descriptions[key]] return all_desc #キャプションをKerasのTokenizerで扱うために変換する def create_tokenizer(descriptions): lines = to_lines(descriptions) tokenizer = Tokenizer() tokenizer.fit_on_texts(lines) return tokenizer #tokenizerを準備する tokenizer = create_tokenizer(train_descriptions) vocab_size = len(tokenizer.word_index) + 1 #最も多くの単語を含むキャプションの長さを計算する関数 def max_length(descriptions): lines = to_lines(descriptions) return max(len(d.split()) for d in lines) #最大シーケンス長を計算する max_length = max_length(train_descriptions) #画像と出力単語を紐づける関数 def create_sequences(tokenizer, max_length, descriptions, photos): X1, X2, y = list(), list(), list()#X1が入力画像、X2が入力語、yがX1とX2に対応する出力語 #各画像名でループ for key, desc_list in descriptions.items(): #各画像のキャプションでループ for desc in desc_list: #シーケンスをエンコードする seq = tokenizer.texts_to_sequences([desc])[0] #1つのシーケンスを複数のX、Yペアに分割する for i in range(1, len(seq)): #入力と出力のペアに分割する in_seq, out_seq = seq[:i], seq[i] #行列のサイズを最大の単語数に合わせる in_seq = pad_sequences([in_seq], maxlen=max_length)[0] #出力シーケンス out_seq = to_categorical([out_seq], num_classes=vocab_size)[0] #全てをarrayに格納 X1.append(photos[key][0]) X2.append(in_seq) y.append(out_seq) return array(X1), array(X2), array(y) #トレーニングデータの入力画像、入力語、出力語を紐付ける X1train, X2train, ytrain = create_sequences(tokenizer, max_length, train_descriptions, train_features) #バリデーションデータの入力画像、入力語、出力語を紐付ける X1val, X2val, yval = create_sequences(tokenizer, max_length, val_descriptions, val_features) #モデルを定義する関数 def define_model(vocab_size, max_length): #画像の特徴を入力するレイヤ inputs1 = Input(shape=(4096,)) fe1 = Dropout(0.5)(inputs1) fe2 = Dense(256, activation='relu')(fe1) #文章を入力するレイヤ inputs2 = Input(shape=(max_length,)) se1 = Embedding(vocab_size, 256, mask_zero=True)(inputs2) se2 = Dropout(0.5)(se1) se3 = LSTM(256)(se2) #上の二つの出力を統合する部分 decoder1 = add([fe2, se3]) decoder2 = Dense(256, activation='relu')(decoder1) outputs = Dense(vocab_size, activation='softmax')(decoder2) #モデルの定義.二つを入力にとって一つを出力する形になる model = Model(inputs=[inputs1, inputs2], outputs=outputs) model.compile(loss='categorical_crossentropy', optimizer='adam') return model #モデルの定義 model = define_model(vocab_size, max_length) #コールバックを定義する filepath = 'model-ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5' checkpoint = ModelCheckpoint(filepath, monitor='val_loss', verbose=1, save_best_only=True, mode='min') #学習 model.fit([X1train, X2train], ytrain, epochs=10, verbose=2, callbacks=[checkpoint], validation_data=([X1val, X2val], yval))

試したこと

エラー文で調べてみたのですが、
関数として使っていた名前を文字列で上書きしたことが原因。や
Stringに変換するstrではなくstrと言うオブジェクト(変数)が呼び出されているためにエラーが発生している。
などと書かれていました。
jupyterを再起動すれば治る、などもあり、試してみましたがダメでした。

深層学習、Python初心者で、画像キャンプションを試してみたくてソースコードを丸パクリしただけなので、
正直ソースコードで理解していません。

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

バージョン 3.7.6

サンプルコードが書いてあるサイト
http://pchun.work/%E7%94%BB%E5%83%8F%E3%82%AD%E3%83%A3%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90/

よろしくお願いします。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

kairi003
kairi003

2020/04/24 19:27

エラー箇所前でprint\(list\)してみてください
omugi
omugi

2020/04/25 04:24

print\(list\)すると、listには文字列が入っていました。 質問にあるソースコードより前の部分でデータセットの成形をしているのですが、 そこでfor文の変数としてlistを使っており、文字列を代入していました。 変数の名前を変えたらエラーを修正できました。 ありがとうございました。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python

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