更新
虽然我很欣赏 AloneTogether 的回答,但我不喜欢我使用 take() 并且它与 model.fit 是分开的。
如果你想看的话,我在这里放了另一个答案。它涉及子类化模型。这还不错。
更新结束
我有一个简单的例子,一个有 8 列名为 feature_# 的镶木地板文件,每列填充 1 到 100
feature_1 feature_2 ... feature_8
1 1 1
2 2 2
... ... ...
99 99 99
100 100 100
我的模型:
all_cols = ["feature_1","feature_2","feature_3","feature_4","feature_5","feature_6","feature_7","feature_8"]
x_cols = ["feature_1","feature_2","feature_3","feature_4","feature_5","feature_6","feature_7"]
inputs = [Input(shape=(1,),name=col) for col in x_cols]
merged = Concatenate(axis=1)(inputs)
x = Dense(50, activation="relu")(merged)
x = Dense(20,activation="relu")(x)
outputs = Dense(101,activation="softmax")(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
opt = tf.keras.optimizers.Adam(learning_rate=.001)
model.compile(loss="sparse_categorical_crossentropy",\
optimizer=opt,metrics=['accuracy'])
我像这样使用 petastorm:
batch_size = 4
with make_batch_reader('%s/df_100.parquet' % data_dir, num_epochs=1,
schema_fields=all_cols) as train_reader:
with make_batch_reader('%s/df_100.parquet' % data_dir, num_epochs=1,
schema_fields=all_cols) as val_reader:
train_ds = make_petastorm_dataset(train_reader) \
.unbatch() \
.map(
lambda x: (tuple(getattr(x, col) for col in x_cols),getattr(x,"feature_8"))
) \
.batch(batch_size)
val_ds = make_petastorm_dataset(val_reader) \
.unbatch() \
.map(
lambda x: (tuple(getattr(x, col) for col in x_cols),
getattr(x,"feature_8"))
) \
.batch(batch_size)
对于这个简单的示例,我将相同的数据用于训练作为验证。我想确认整个数据集都进入了 model.fit() 所以我写了一个自定义回调
class MyCustomCallback(tf.keras.callbacks.Callback):
def __init__(self, train_data):
self.mylist = []
self.train_data = train_data
def on_train_batch_begin(self, batch, logs=None):
print(list(self.train_data.take(1).as_numpy_iterator())[0][0][0])
# and I pass the dataset to the custom callback:
callbacks.append(MyCustomCallback(train_ds))
不会打印所有值... 1 到 100。如果我在没有 model.fit 的情况下迭代数据集(简单的 for 循环),那么我确实得到了 1 到 100,所以我认为 take() 正在与model.fit,只是一个理论。
我也试过:
class MyCustomCallback(tf.keras.callbacks.Callback):
def on_train_batch_begin(self, batch, logs=None):
print(self.model.layers[0].input) # or .output
#or
#print(self.model.layers[0].get_weights())
但这并没有给我任何真正的价值,并且 get_weights() 打印出空数组
这是打印输入打印出来的内容:
KerasTensor(type_spec=TensorSpec(shape=(None, 1), dtype=tf.float32, name='feature_1'), name='feature_1', description="created by layer 'feature_1'")
我也尝试在图层的输入和输出上使用 K.eval() ,结果是一个 numpy 问题,任何急切的设置都不能解决这个问题。
我真的不认为这应该这么难。我只想在数据集进入训练之前达到峰值。
我玩弄了 repeat()、cache(),并在 model.fit 之前简单地迭代数据集,但我不喜欢这种情况发生在 model.fit 之前,除非它被缓存,否则它会重新洗牌, ETC...
但我也希望能够在任何时候任意查看模型,任何值,任何重量。我不觉得我可以访问这些东西,但觉得我应该可以。
任何帮助表示赞赏。
哦,使用 tensorflow 2.6.2 atm 和 tf.keras