在每次迭代训练模型时打印输入

Posted

技术标签:

【中文标题】在每次迭代训练模型时打印输入【英文标题】:Print input while training model on every iteration 【发布时间】:2019-09-16 08:47:49 【问题描述】:

我想检查输入中的数据,或者检查某个层的输出。为此,我执行以下操作:

import tensorflow.keras.backend as K
import tensorflow as tf
import numpy as np

x = [[i, i * 3 + 1] for i in range(100)]
y = [2 * i + 1 for i in range(100)]
x = np.array(x)
y = np.array(y)

print_weights = tf.keras.callbacks.LambdaCallback(
    on_batch_end=lambda batch, logs: print(K.get_value(model.layers[1].input)))


def sobaka():
    a = tf.keras.Input(shape=(2,))
    b = tf.keras.layers.Dense(1)
    c = b(a)
    model = tf.keras.models.Model(a, c)
    optimizer = tf.keras.optimizers.Adam(lr=0.1)
    model.compile(loss='mean_squared_error', optimizer=optimizer, metrics=['accuracy'])
    return model


kek = tf.placeholder(tf.float32, shape=(2,))
model = sobaka()
model.fit(x, y, batch_size=1, epochs=2, callbacks=[print_weights])

所以每批(一个训练样本)都会打印输入张量。但是,我得到了一个错误:

您必须使用 dtype 为占位符张量“input_1”提供一个值 浮动和形状 [?,2]

请帮助我了解如何在我的代码中放置占位符。是否有任何可能的解决方案可以在每次迭代时打印信息? (例如,当批次为 10 时?)

【问题讨论】:

我觉得占位符的形状一定是( None , 2 ) 【参考方案1】:

一种选择是使用[自定义回调][1]

像这样:

class MyCallback(tf.keras.callbacks.Callback):

    def __init__(self, patience=0):
        super(MyCallback, self).__init__()

    def on_epoch_begin(self, epoch, logs=None):
        tf.print(self.model.get_weights())

model.fit(
        x_train, 
        y_train, 
        epochs=epochs,
        batch_size=batch_size,
        callbacks=[MyCallback()],
        validation_data=(x_test, y_test),
    )

【讨论】:

以上是关于在每次迭代训练模型时打印输入的主要内容,如果未能解决你的问题,请参考以下文章

每次迭代后保存spacy的NER模型

pytorch训练时前一次迭代的loss正常后一次迭代却报nan

如何在Django视图中使用for循环返回每次迭代[关闭]

Machine Learning With Spark学习笔记(在10万电影数据上训练使用推荐模型)

PyTorch:模型训练-模型参数parameters

PyTorch:模型训练-模型参数parameters