我一直在嘗試使用 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
然后我制作了一個帶有兩個串列的訓練元組,一個用于標簽,一個用于影像本身。我覺得這就是我出錯的地方,因為檔案要求資料是 (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)
現在都是模型作業。我正在使用 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
uj5u.com熱心網友回復:
我不知道它是否回答了問題,但我在您的代碼中看到了一個問題。在進行二元類分類時,您應該使用:
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)
此外,在您的代碼中,不清楚輸出標簽是字串還是數字。
uj5u.com熱心網友回復:
你是對的:
然后我制作了一個帶有兩個串列的訓練元組,一個用于標簽,一個用于影像本身。我覺得這就是我出錯的地方,因為檔案要求資料是 (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)))
它對我有用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/386606.html
