我编写了自定义的Keras层,称为Material
,并尝试在我的模型中使用它:
import tensorflow as tf
from tensorflow import keras
import numpy as np
class Material(keras.layers.Layer):
def __init__(self):
super().__init__()
self.table = tf.Variable(
initial_value=np.ones(shape=(6, 8, 8), dtype="float32"),
trainable=True,
)
self.k = tf.Variable(initial_value=8., trainable=True, dtype='float32')
def call(self, inp):
material_white = tf.reduce_sum(inp[..., 0] * self.table, axis=(-1, -2, -3))
material_black = tf.reduce_sum(inp[..., 1] * self.table, axis=(-1, -2, -3))
material_white = tf.maximum(material_white, .01)
material_black = tf.maximum(material_black, .01)
return tf.math.log(material_white / material_black) * self.k
def get_model() -> keras.Model:
inp = keras.Input((6, 8, 8, 2),)
material = Material()
out = keras.activations.sigmoid(material(inp))
return keras.Model(inputs=inp, outputs=out)
model = get_model()
model.compile(optimizer=keras.optimizers.Adam(learning_rate=.01), loss='mean_squared_error')
board_tables = np.random.sample((100000, 6, 8, 8, 2),)
outcome = np.random.sample((100000,),)
while 1:
model.fit(board_tables, outcome, batch_size=200, epochs=2)
由于某种原因,在每次fit
迭代(我指的是函数调用,而不是每个时期)后,它似乎会使用越来越多的RAM。在大约5GB时,内存使用增长减缓但仍然持续存在。这个问题在CPU和GPU上都存在。有人能解释一下发生了什么吗?我的自定义层有什么问题吗?
感谢任何建议。
(x, y)
,其中x
和y
是模型输入和期望输出的批次。然后执行dataset = tf.data.Dataset.from_generator(your_generator, output_types=(tf.float32, tf.float32))
(当然要使用正确的数据类型)。接下来执行model.fit(dataset, epochs=...)
。你还可以在fit
方法中提供steps_per_epoch
参数,以便在特定批次数之后停止训练,而不是等到生成器用尽。 - Усердный бобёр