我有一个tfrecord,包含23个班级,每个班级有35张图像(总计805张)。我当前的tfrecord读取功能是:
def read_tfrecord(serialized_example):
feature_description = {
'image': tf.io.FixedLenFeature((), tf.string),
'label': tf.io.FixedLenFeature((), tf.int64),
'height': tf.io.FixedLenFeature((), tf.int64),
'width': tf.io.FixedLenFeature((), tf.int64),
'depth': tf.io.FixedLenFeature((), tf.int64)
}
example = tf.io.parse_single_example(serialized_example, feature_description)
image = tf.io.parse_tensor(example['image'], out_type=float)
image_shape = [example['height'], example['width'], example['depth']]
image = tf.reshape(image, image_shape)
label = tf.cast(example["label"], tf.int32)
image = image/255
return image, label
然后,我有一个make_dataset函数,如下所示:
def make_dataset(tfrecord, BATCH_SIZE, EPOCHS, cache=True):
files = tf.data.Dataset.list_files(os.path.join(os.getcwd(), tfrecord))
dataset = tf.data.TFRecordDataset(files)
if cache:
if isinstance(cache, str):
dataset = dataset.cache(cache)
else:
dataset = dataset.cache()
dataset = dataset.shuffle(buffer_size=FLAGS.shuffle_buffer_size)
dataset = dataset.map(map_func=read_tfrecord, num_parallel_calls=AUTOTUNE)
dataset = dataset.repeat(EPOCHS)
dataset = dataset.batch(batch_size=BATCH_SIZE)
dataset = dataset.prefetch(buffer_size=AUTOTUNE)
return dataset
这个make_dataset函数被传递到
train_ds = make_dataset(tfrecord=FLAGS.tf_record, BATCH_SIZE=BATCH_SIZE, EPOCHS=EPOCH)
image_batch, label_batch = next(iter(train_ds))
feature_extractor_layer = hub.KerasLayer(url, input_shape=IMAGE_SHAPE + (3,))
feature_batch = feature_extractor_layer(image_batch)
feature_extractor_layer.trainable = False
model = tf.keras.Sequential([feature_extractor_layer, layers.Dense(2048, input_shape=(2048,)), layers.Dense(len(CLASS_NAMES), activation='softmax')])
model.summary()
predictions = model(image_batch)
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=rate),
loss='categorical_crossentropy',
metrics=['acc'])
batch_stats_callback = CollectBatchStats()
STEPS_PER_EPOCH = np.ceil(image_count / BATCH_SIZE)
history = model.fit(image_batch, label_batch, epochs=EPOCH, batch_size=BATCH_SIZE, steps_per_epoch=STEPS_PER_EPOCH, callbacks=[batch_stats_callback])
该代码在某种意义上说是运行,它输出有关我有多少个时期和一些训练精度数据(为0,损失约100k)的常规信息。我得到的错误对我没有任何意义,因为它说:函数实例化在外部推理上下文中的索引:100处具有未定义的输入形状。您可以将数字替换为1000以下的数字(不知道它是否超过了我在tfrecord中拥有的图像数)。
我完全不知所措。
编辑:
看来我收到的这个“错误”不过是警告消息而已。我怀疑这与TensorFlow Hub的使用和可能渴望执行有关。我加了
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
文件的开头,警告已消失。
最佳答案
根据kelkka的规定,这不是错误,而只是警告。
在程序开始时,添加以下代码行可能会限制打印警告消息。
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
下面提到该环境变量的其他值及其行为:
0 =记录所有消息(默认行为)
1 =未打印INFO消息
2 =未打印INFO和WARNING消息
3 =未打印INFO,WARNING和ERROR消息
有关控制警告消息详细程度的更多信息,请参考此Stack Overflow Answer。