我正在Keras(tensorflow后端)构建一个简单的Sequential模型.在培训期间,我想检查各个培训批次和模型预测.因此,我正在尝试创建一个自定义Callback,以保存每个培训批次的模型预测和目标.但是,该模型不使用当前批次进行预测,而是使用整个训练数据.
我怎样才能将当前的培训批次交给Callback?
我如何访问Callbackself.predhis和self.targets中保存的批次和目标?
我当前的版本如下:
callback_list = [prediction_history((self.x_train, self.y_train))]
self.model.fit(self.x_train, self.y_train, batch_size=self.batch_size, epochs=self.n_epochs, validation_data=(self.x_val, self.y_val), callbacks=callback_list)
class prediction_history(keras.callbacks.Callback):
def __init__(self, train_data):
self.train_data = train_data
self.predhis = []
self.targets = []
def on_batch_end(self, epoch, logs={}):
x_train, y_train = self.train_data
self.targets.append(y_train)
prediction = self.model.predict(x_train)
self.predhis.append(prediction)
tf.logging.info("Prediction shape: {}".format(prediction.shape))
tf.logging.info("Targets shape: {}".format(y_train.shape))
Run Code Online (Sandbox Code Playgroud) 我编写了一个自定义 keras 回调来检查来自生成器的增强数据。(有关完整代码,请参阅此答案tf.data.Dataset。)但是,当我尝试对 a 使用相同的回调时,它给了我一个错误:
File "/path/to/tensorflow_image_callback.py", line 16, in on_batch_end
imgs = self.train[batch][images_or_labels]
TypeError: 'PrefetchDataset' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)
keras 回调通常只适用于生成器,还是与我编写回调的方式有关?有没有办法修改我的回调或数据集以使其工作?
我认为这个难题由三部分组成。我对其中任何一个和所有的改变持开放态度。首先是自定义回调类中的init函数:
class TensorBoardImage(tf.keras.callbacks.Callback):
def __init__(self, logdir, train, validation=None):
super(TensorBoardImage, self).__init__()
self.logdir = logdir
self.file_writer = tf.summary.create_file_writer(logdir)
self.train = train
self.validation = validation
Run Code Online (Sandbox Code Playgroud)
其次,on_batch_end同一个类中的函数
def on_batch_end(self, batch, logs):
images_or_labels = 0 #0=images, 1=labels
imgs = self.train[batch][images_or_labels]
Run Code Online (Sandbox Code Playgroud)
三、实例化回调
import tensorflow_image_callback
tensorboard_image_callback = tensorflow_image_callback.TensorBoardImage(logdir=tensorboard_log_dir, train=train_dataset, validation=valid_dataset)
model.fit(train_dataset,
epochs=n_epochs,
validation_data=valid_dataset,
callbacks=[
tensorboard_callback,
tensorboard_image_callback
])
Run Code Online (Sandbox Code Playgroud)
一些尚未让我找到答案的相关主题:
由于 RAM 内存的限制,我按照这些说明构建了一个生成器,该生成器绘制小批量并将它们传递到 Keras 的 fit_generator 中。但是即使我继承了序列,Keras 也无法使用多处理准备队列。
这是我的多处理生成器。
class My_Generator(Sequence):
def __init__(self, image_filenames, labels, batch_size):
self.image_filenames, self.labels = image_filenames, labels
self.batch_size = batch_size
def __len__(self):
return np.ceil(len(self.image_filenames) / float(self.batch_size))
def __getitem__(self, idx):
batch_x = self.image_filenames[idx * self.batch_size:(idx + 1) * self.batch_size]
batch_y = self.labels[idx * self.batch_size:(idx + 1) * self.batch_size]
return np.array([
resize(imread(file_name), (200, 200))
for file_name in batch_x]), np.array(batch_y)
Run Code Online (Sandbox Code Playgroud)
主要功能:
batch_size = 100
num_epochs = 10
train_fnames = []
mask_training = []
val_fnames = []
mask_validation …Run Code Online (Sandbox Code Playgroud)