実現したいこと
プログラミング初心者です。
Google Driveで自然言語処理でマルチラベル分類を試している最中なのですが、学習の際に「InvalidArgumentError: Graph execution error:」というエラーが出てきてしまい、改善できなくて困っております。
model.summaryまでは問題なく動くのですが、fit_generatorがどうしてもうまくいきません。
理解が浅く大変申し訳ないのですが、どうかご教授していただければ幸いです。
よろしくお願いいたします。
前提
model.fit_generator(generator('df_train.pickle', batch_size), steps_per_epoch=4932//batch_size, validation_data=generator('df_test.pickle', batch_size), validation_steps=1645//batch_size, callbacks=[hist], epochs=1)
上記のコードの部分のpickleには、
df_train.pickle→(4932,2)
df_test.pickle(1645,2)でデータフレームが格納されています。
また、データフレームの列の0番目は符号化した文章、1番目はマルチラベルが格納されています。
発生している問題・エラーメッセージ
InvalidArgumentError Traceback (most recent call last) <ipython-input-38-2becdecf9c94> in <cell line: 134>() 133 134 if __name__ == "__main__": --> 135 train(True) 3 frames /usr/local/lib/python3.10/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name) 50 try: 51 ctx.ensure_initialized() ---> 52 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name, 53 inputs, attrs, num_outputs) 54 except core._NotOkStatusException as e: InvalidArgumentError: Graph execution error: Detected at node 'model_16/embedding_18/embedding_lookup' defined at (most recent call last): (省略) File "/usr/local/lib/python3.10/dist-packages/keras/utils/traceback_utils.py", line 96, in error_handler return fn(*args, **kwargs) File "/usr/local/lib/python3.10/dist-packages/keras/layers/core/embedding.py", line 272, in call out = tf.nn.embedding_lookup(self.embeddings, inputs) Node: 'model_16/embedding_18/embedding_lookup' indices[112,1] = 1723 is not in [0, 128) [[{{node model_16/embedding_18/embedding_lookup}}]] [Op:__inference_train_function_7121]
該当のソースコード
Python
1from keras.layers import Conv1D,Conv2D, BatchNormalization, Activation, Input,Flatten,MaxPooling1D 2from keras.layers import AveragePooling2D, GlobalAveragePooling2D, Dense, Embedding, Dropout 3from keras.models import Model 4from keras.callbacks import History 5from keras.optimizers import SGD 6import keras.backend as K 7 8import pandas as pd 9import numpy as np 10import pickle 11 12def create_network(): 13 max_length=128 14 embedding_size=128 15 filters=64 16 kernel_size = 3 17 18 input=Input(shape=(max_length)) 19 x=Embedding(max_length, embedding_size)(input) 20 21 x=Conv1D(filters,kernel_size, padding='same', activation='relu', strides=1)(x) 22 23 x=MaxPooling1D(pool_size=2)(x) 24 x=Flatten()(x) 25 26 x=Dense(50, activation="relu")(x) 27 x=Dropout(0.5)(x) 28 29 x=Dense(10, Activation('sigmoid'))(x) 30 31 return Model(input, x) 32 33 34# ジェネレーター 35def generator(df_path, batch_size): 36 with open(df_path, 'rb') as f: 37 df = pickle.load(f) 38 df = df.values 39 while True: 40 img_cahce, label_cache = [], [] 41 indices = np.arange(df.shape[0]) 42 np.random.shuffle(indices) 43 for i in indices: 44 img_cahce.append(df[i, 0]) #image 45 label_cache.append(df[i, 1]) #label 46 if len(img_cahce) == batch_size: 47 #X_batch = np.asarray(img_cahce, np.float32) / 255.0 48 #y_batch = np.asarray(label_cache, np.float32) 49 X_batch = np.asarray(img_cahce, np.float32) 50 y_batch = np.asarray(label_cache, np.float32) 51 img_cahce, label_cache = [], [] 52 yield X_batch, y_batch 53 54 55# 損失関数 56def categorical_loss(y_true, y_pred): 57 return K.categorical_crossentropy(y_true, y_pred) 58 59def binary_loss(y_true, y_pred): 60 bce = K.binary_crossentropy(y_true, y_pred) 61 return K.sum(bce, axis=-1) 62 63 64# 評価関数 65def total_acc(y_true, y_pred): 66 pred = K.cast(K.greater_equal(y_pred, 0.5), "float") 67 flag = K.cast(K.equal(y_true, pred), "float") 68 return K.prod(flag, axis=-1) 69 70def binary_acc(y_true, y_pred): 71 pred = K.cast(K.greater_equal(y_pred, 0.5), "float") 72 flag = K.cast(K.equal(y_true, pred), "float") 73 return K.mean(flag, axis=-1) 74 75 76 77def train(use_binary_loss): 78 model = create_network() 79 if use_binary_loss: 80 #モデルの設定 81 #SGD:ミニバッチ学習 82 model.compile(SGD(0.01, 0.9), loss=binary_loss, metrics=[total_acc, binary_acc]) 83 else: 84 model.compile(SGD(0.01, 0.9), loss=categorical_loss, metrics=[total_acc, binary_acc]) 85 86 hist = History() #学習経過 87 88 model.summary() #モデル確認 89 90 batch_size = 128 91 92 model.fit_generator(generator('df_train.pickle', batch_size), 93 steps_per_epoch=4932//batch_size, 94 validation_data=generator('df_test.pickle', batch_size), 95 validation_steps=1645//batch_size, 96 callbacks=[hist], epochs=1) 97 98 history = hist.history 99 100 #保存 101 with open(f"multiclass_binary_{use_binary_loss}.dat", "wb") as fp: 102 pickle.dump(history, fp) 103 104if __name__ == "__main__": 105 train(True)

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。