簡體   English   中英

為什么在嘗試擬合 tensorflow model 時出現此錯誤:列表索引超出范圍

[英]Why do I get this error when trying to fit a tensorflow model: list index out of range

我一直在嘗試使用 tensorflow 上的數據管道創建一個人臉分類程序。 我使用的圖像都是彩色的,只有兩個類“me”和“not_me”; 我正在嘗試為我的臉制作個人臉分類器:這是我使用的代碼:

我首先加載數據集並將其拆分為訓練和驗證。

images_ds = tf.data.Dataset.list_files(dir + '\\*.jpg', shuffle=True)
image_count = len(os.listdir())
train_count = int(image_count*0.8)
train_ds = images_ds.take(train_count)
val_ds = images_ds.skip(train_count)

前兩個函數用於從我的驗證集和訓練集中獲取標簽和解碼圖像。

def get_labels(path):
    return tf.strings.split(path, '\\')[-2]
def decode_img(path):
    label = get_labels(path)
    img = tf.io.read_file(path)
    img = tf.io.decode_png(img, dtype=tf.uint8)
    img = tf.image.resize(img, [254, 254])
    return img, label

然后我用兩個列表創建一個訓練元組,一個用於標簽,一個用於圖像本身。 我覺得好像這是我 go 錯誤的地方,因為文檔要求數據是 (x, y) 而不是 ([x], [y]) 的管狀件,但我不太確定。

train_tensor = ([], [])
for img, label in train_ds.map(decode_img):
    train_tensor[0].append(img)
    train_tensor[1].append(label)

然后我為驗證集執行此操作!

val_tensor = ([], [])
for img, label in val_ds.map(decode_img):
    val_tensor[0].append(img)
    val_tensor[1].append(label)

現在都是 model 工作。 我正在使用 ResNet50 並進行一些遷移學習。

model_base = tf.keras.applications.resnet50.ResNet50(include_top=False, weights='imagenet', input_shape=(254, 254, 3))
for layers in model_base.layers:
    layers.trainable = False


global_avg_pooling = keras.layers.GlobalAveragePooling2D()(model_base.output)
output = keras.layers.Dense(2, activation='sigmoid')(global_avg_pooling)

face_classifier = keras.models.Model(inputs=model_base.input,
                                    outputs=output,
                                    name='ResNet50')


face_classifier.compile(loss='categorical_crossentropy',
                       optimizer=Adam(learning_rate=0.01),
                       metrics=['accuracy'])


epochs = 50
history = face_classifier.fit(train_tensor,
                             epochs=epochs,
                             validation_data=val_tensor)

嘗試編譯時出現此錯誤:

IndexError                                Traceback (most recent call last)
C:\Users\FLEXSU~1\AppData\Local\Temp/ipykernel_13852/468442092.py in <module>
      1 epochs = 50
----> 2 history = face_classifier.fit(train_tensor,
      3                              epochs=epochs,
      4                              validation_data=val_tensor)

~\anaconda3\envs\tf-gpu\lib\site-packages\tensorflow\python\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
   1131          training_utils.RespectCompiledTrainableState(self):
   1132       # Creates a `tf.data.Dataset` and handles batch and epoch iteration.
-> 1133       data_handler = data_adapter.get_data_handler(
   1134           x=x,
   1135           y=y,

~\anaconda3\envs\tf-gpu\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in get_data_handler(*args, **kwargs)
   1362   if getattr(kwargs["model"], "_cluster_coordinator", None):
   1363     return _ClusterCoordinatorDataHandler(*args, **kwargs)
-> 1364   return DataHandler(*args, **kwargs)
   1365 
   1366 

~\anaconda3\envs\tf-gpu\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in __init__(self, x, y, sample_weight, batch_size, steps_per_epoch, initial_epoch, epochs, shuffle, class_weight, max_queue_size, workers, use_multiprocessing, model, steps_per_execution, distribute)
   1152     adapter_cls = select_data_adapter(x, y)
   1153     self._verify_data_adapter_compatibility(adapter_cls)
-> 1154     self._adapter = adapter_cls(
   1155         x,
   1156         y,

~\anaconda3\envs\tf-gpu\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in __init__(self, x, y, sample_weights, sample_weight_modes, batch_size, epochs, steps, shuffle, **kwargs)
    255     inputs = pack_x_y_sample_weight(x, y, sample_weights)
    256 
--> 257     num_samples = set(int(i.shape[0]) for i in nest.flatten(inputs)).pop()
    258     _check_data_cardinality(inputs)
    259 

~\anaconda3\envs\tf-gpu\lib\site-packages\tensorflow\python\keras\engine\data_adapter.py in <genexpr>(.0)
    255     inputs = pack_x_y_sample_weight(x, y, sample_weights)
    256 
--> 257     num_samples = set(int(i.shape[0]) for i in nest.flatten(inputs)).pop()
    258     _check_data_cardinality(inputs)
    259 

~\anaconda3\envs\tf-gpu\lib\site-packages\tensorflow\python\framework\tensor_shape.py in __getitem__(self, key)
    894       else:
    895         if self._v2_behavior:
--> 896           return self._dims[key].value
    897         else:
    898           return self._dims[key]

IndexError: list index out of range

我不知道它是否回答了這個問題,但我在你的代碼中看到了一個問題。 當您進行二進制 class 分類時,您應該使用:

output = keras.layers.Dense(1, activation='sigmoid')(global_avg_pooling)

face_classifier.compile(loss='binary_crossentropy',
                       optimizer=Adam(learning_rate=0.01),
                       metrics=['accuracy'])

對於多類問題,您將使用output = keras.layers.Dense(n_class, activation='softmax')(global_avg_pooling)

此外,在您的代碼中,尚不清楚 output label 是字符串還是數字。

你是對的:

然后我用兩個列表創建一個訓練元組,一個用於標簽,一個用於圖像本身。 我覺得好像這是我 go 錯誤的地方,因為文檔要求數據是 (x, y) 的元組而不是 ([x], [y]) 進行擬合,但我不太確定。

您應該按如下方式定義數據(虛擬示例)

train_tensor_img = []
train_tensor_label = []
for _ in range(100):
    img, label = decode_img('')
    train_tensor_img.append(img)
    train_tensor_label.append(label)

val_tensor_img = []
val_tensor_label = []
for _ in range(20):
    img, label = decode_img('')
    val_tensor_img.append(img)
    val_tensor_label.append(label)

然后,

history = model.fit(x=np.array(train_tensor_img), y=np.array(train_tensor_label),
                             epochs=5,
                             validation_data=(np.array(val_tensor_img), np.array(val_tensor_label)))

它對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM