【发布时间】:2022-02-01 23:33:38
【问题描述】:
我正在尝试使用自定义权重和无输入来拟合简单的直方图模型。它应该适合以下生成的数据的直方图:
train_data = [max(0,int(np.round(np.random.randn()*2+5))) for i in range(1000)]
模型定义为
d = 15
class hist_model(tf.keras.Model):
def __init__(self):
super(hist_model,self).__init__()
self._theta = self.add_weight(shape=[1,d],initializer='zero',trainable=True)
def call(self,x):
return self._theta
我遇到的问题是使用 model.fit 进行的训练不起作用:模型权重在训练期间根本没有变化。我试过了:
model = hist_model()
model.compile(optimizer = tf.keras.optimizers.SGD(learning_rate=1e-2),
loss="sparse_categorical_crossentropy")
history = model.fit(train_data,train_data,verbose=2,batch_size=1,epochs=10)
model.summary()
返回:
Epoch 1/3
1000/1000 - 1s - loss: 2.7080
Epoch 2/3
1000/1000 - 1s - loss: 2.7080
Epoch 3/3
1000/1000 - 1s - loss: 2.7080
Model: "hist_model_17"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
Total params: 15
Trainable params: 15
Non-trainable params: 0
________________________
我尝试为同一模型编写自定义训练循环,效果很好。这是自定义训练的代码:
optimizer = tf.keras.optimizers.SGD(learning_rate=1e-3)
loss_fn = keras.losses.SparseCategoricalCrossentropy(from_logits=True)
for epoch in range(3):
running_loss = 0
for data in train_data:
with tf.GradientTape() as tape:
loss_value = loss_fn(data,model(data))
running_loss += loss_value.numpy()
grad = tape.gradient(loss_value,model.trainable_weights)
optimizer.apply_gradients(zip(grad, model.trainable_weights))
print(f'Epoch {epoch} loss: {loss_value}')
我仍然不明白为什么 fit 方法不起作用。我错过了什么?谢谢!
【问题讨论】:
-
你能展示你的自定义循环吗?
-
@AloneTogether 现已添加
标签: python tensorflow keras