iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 12
0
AI & Data

從零.4開始我的深度學習之旅:從 用tf.data處理資料 到 用tf.estimator或tf.keras 訓練模型系列 第 12

tensorflow 使用tf.estimator, tf.data常見錯誤

文章說明

文章分段

  1. 文章說明
  2. 錯誤列表

今天想要列出我之前遇到的tensorflow有關的錯誤。

錯誤列表

TypeError: local_variables_initializer() takes 0 positional arguments but 2 were given

原因:
model.ckpt-{step_number}檔案,
卻沒有名為checkpoint檔案

解法:
建立checkpoint

touch checkpoint # 創立checkpoint檔
vim checkpoint # 編輯checkpoint檔

寫入下面兩行

model_checkpoint_path: "model.ckpt-{step}"
all_model_checkpoint_paths: "model.ckpt-{step}"

要用的是哪個checkpoint檔案就把{step}替換掉

例如:要載入的是model.ckpt-803000,就替換成

model_checkpoint_path: "model.ckpt-803000"
all_model_checkpoint_paths: "model.ckpt-803000"

也有可能給錯checkpoint在的資料夾名稱,用print確認給的路徑是對的。

 
 

ValueError: validation_split argument is not supported when input x is a dataset or a dataset iterator. Received: x=<tensorflow.python.data.ops.iterator_ops.Iterator object at 0x12e99cb00>, validation_split=0.200000

原因:
在使用tf.keras API時,其訓練method的validation_split目前不支援tf.data型態的資料集。

解法:
自製一個valid dataset。

 
 

ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 array(s), but instead got the following list of 2 arrays: [<tf.Tensor 'IteratorGetNext:0' shape=(?, 256, 272, 1) dtype=float32>, <tf.Tensor 'IteratorGetNext:1' shape=(?, 256, 272, 1) dtype=int64>]...

原因:
keras model.fit不支援tf.data.Dataset轉成iterator的模式,他接受dataset,不要make_one_shot_iterator()

解法:

# last dataset map function return d, l, f, g

可以支援

iterator = dataset.make_one_shot_iterator()
data, label, filename, grade = iterator.get_next()

 
 

ValueError: class_weight not supported for 3+ dimensional targets.

解法:
要改用sample_weight,也就是說,label是pixel等級的,必須要把得到label shape,reshape成1維,再一一對不同label加入weight。

 
 

ValueError: If steps_per_epoch is set, the batch_size must be None.

解法:
擇一使用。

 
 

TypeError: _init_subclassed_network() got an unexpected keyword argument 'input' when using TensorFlow Keras

原因:
在建立model時有指名參數名稱。
原生keras的參數名稱與tf.keras的參數名稱不同造成。

解法:

原生keras:

from keras import Model
model = Model(input=, output=)

tf.keras:

from tensorflow.keras import Model
model = Model(inputs=, outputs=)

 
 

tensorflow.python.framework.errors_impl.InvalidArgumentError: Could not parse example input, value: './datasets/BraTS2019/tfrecord/BraTS_2019_train.tfrecord'

 [[{{node ParseSingleExample/ParseSingleExample}} = ParseSingleExample[Tdense=[DT_STRING, DT_STRING, DT_STRING, DT_STRING, DT_STRING, DT_STRING], dense_keys=["image/encoded", "image/filename", "image/format", "image/grade", "image/segmentation/class/encoded", "image/segmentation/class/format"], dense_shapes=[[], [], [], [], [], []], num_sparse=0, sparse_keys=[], sparse_types=[]](arg0, ParseSingleExample/Const, ParseSingleExample/Const, ParseSingleExample/Const, ParseSingleExample/Const, ParseSingleExample/Const, ParseSingleExample/Const)]]
 [[node IteratorGetNext (defined at /Users/yenciliang/_School/script/keras_estimator/keras_train_with_tfrecord/datasets/data_generater.py:79)  = IteratorGetNext[output_shapes=[[?], [?]], output_types=[DT_STRING, DT_STRING], _device="/job:localhost/replica:0/task:0/device:CPU:0"](OneShotIterator)]]

原因:
可能用錯method來解析tfrecord

解法:
像是試圖用tf.data.Dataset.from_tensor_slices()來解析tfrecord,要用tf.data.TFRecordDataset()才對

資料來源:
https://www.tensorflow.org/api_docs/python/tf/data/Dataset


上一篇
二、教你怎麼看source code,找到核心程式碼 ep.5:trace code 2
下一篇
二、教你怎麼看source code,找到核心程式碼 ep.6:tensorflow的API琳瑯滿目
系列文
從零.4開始我的深度學習之旅:從 用tf.data處理資料 到 用tf.estimator或tf.keras 訓練模型30

尚未有邦友留言

立即登入留言