如何将TensorFlow(v.2)Hub和tfrecords中预先训练好的KerasLayer结合起来?

我有23个班级的tfrecord,每个班级有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((),'width': tf.io.FixedLenFeature((),'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中的图像数量。

我完全不知所措。

shijy07 回答:如何将TensorFlow(v.2)Hub和tfrecords中预先训练好的KerasLayer结合起来?

正如kelkka所说,这不是错误,而只是警告。

在程序开始时,添加以下代码行可能会限制警告消息的打印。

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

该环境变量的其他值及其行为在下面提到:

  • 0 =已记录所有消息(默认行为)
  • 1 =未打印INFO消息
  • 2 =未打印INFO和WARNING消息
  • 3 =未打印INFO,WARNING和ERROR消息

有关控制警告消息的详细信息,请参阅此Stack Overflow Answer

,

我发现如果指定了要素提取器层的输出形状,则警告消息消失了,像这样:

 feature_extractor_layer = hub.KerasLayer(feature_extractor_url,input_shape=(224,224,3),output_shape=[1280])

对于您使用的特征提取器的实际输入和输出形状。培训过程将与警告一起运行。

本文链接:https://www.f2er.com/3033474.html

大家都在问