将 TensorBoard 添加到应用程序

Add TensorBoard to application

我想知道如何将准确度、精确度和保存模型等指标添加到此张量板逻辑回归中:

from tensorflow.keras.datasets import fashion_mnist
from sklearn.model_selection import train_test_split
import tensorflow as tf

(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
x_train, x_test = x_train/255., x_test/255.

x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size=0.15)
x_train = tf.reshape(x_train, shape=(-1, 784))
x_test  = tf.reshape(x_test, shape=(-1, 784))

weights = tf.Variable(tf.random.normal(shape=(784, 10), dtype=tf.float64))
biases  = tf.Variable(tf.random.normal(shape=(10,), dtype=tf.float64))

def logistic_regression(x):
    lr = tf.add(tf.matmul(x, weights), biases)
    #return tf.nn.sigmoid(lr)
    return lr


def cross_entropy(y_true, y_pred):
    y_true = tf.one_hot(y_true, 10)
    loss = tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_pred)
    return tf.reduce_mean(loss)

def accuracy(y_true, y_pred):
    y_true = tf.cast(y_true, dtype=tf.int32)
    preds = tf.cast(tf.argmax(y_pred, axis=1), dtype=tf.int32)
    preds = tf.equal(y_true, preds)
    return tf.reduce_mean(tf.cast(preds, dtype=tf.float32))

def grad(x, y):
    with tf.GradientTape() as tape:
        y_pred = logistic_regression(x)
        loss_val = cross_entropy(y, y_pred)
    return tape.gradient(loss_val, [weights, biases])

n_batches = 10000
learning_rate = 0.01
batch_size = 128

dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
dataset = dataset.repeat().shuffle(x_train.shape[0]).batch(batch_size)

optimizer = tf.optimizers.SGD(learning_rate)

for batch_numb, (batch_xs, batch_ys) in enumerate(dataset.take(n_batches), 1):
    gradients = grad(batch_xs, batch_ys)
    optimizer.apply_gradients(zip(gradients, [weights, biases]))

    y_pred = logistic_regression(batch_xs)
    loss = cross_entropy(batch_ys, y_pred)
    acc = accuracy(batch_ys, y_pred)
    print("Batch number: %i, loss: %f, accuracy: %f" % (batch_numb, loss, acc))

我是 tensor 的新手,我只在 tensorflow 中获得写入日志 1.x 当 with tf.Session as sess 从 tensorflow 离开时我迷路了 以其他方式编写代码。

首先你必须创建一个回调函数来更新 Tensorboard:

tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=logdir,write_graph=True,update_freq='batch')

其中 logdir 是现有目录的字符串。

你可以像这样编译你的模型:

model.compile(optimizer=opt,loss=lss,metrics=met)

很明显 opt 是你的优化器,lss 你的损失函数并有选择地满足你的指标。

现在您可以像这样训练模型:

model.fit(train,epochs=100,callbacks=[tensorboard_callback],validation_data = val)

它将创建一个 Tensorboard 实例,您将在终端中看到地址。您可以在浏览器中复制 link 并查看它。

我看到您仍在使用 "old" Tensorflow v1 编译和创建模型的方式。如果您不使用特定的训练方法,则使用 model.compile 和 model.fit 更容易和更快(在我看来)。 (例如,您不能以这种方式生成 GAN)。

使用简单的 Tensorflow V2,您的代码将如下所示:

从模型创建开始,Logistic 回归可以看作是具有 sigmoid 激活的单层感知器,因此我们将添加一个具有与特征一样多的输入的输入层和一个每个输出都具有 sigmoid 激活的输出层 class.

input = tf.keras.Input(shape=(nfeatures))
output = tf.keras.layers.Dense(nclasses,activation='sigmoid')(input)

model = tf.keras.Model(inputs=input,outputs=output,name='MyLinearRegression')

然后我们创建优化器和损失函数:

opt = tf.keras.optimizers.Adadelta()
lss = tf.keras.losses.categorical_crossentropy
met = tf.keras.metrics.Accuracy()

您必须根据标签(是否热编码)使用 categorica_crossentropy 或 sparse_categorical_crossentropy。对于这种损失,您可能需要将激活更改为 softmax。

现在我们可以这样 "compile" 模型:

model.compile(optimizer=opt,loss=lss,metrics=met)
model.summary()

现在我们可以创建 TensorBoard 回调:

tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=logdir,write_graph=True,update_freq='batch')

然后像这样训练:

model.fit(train,epochs=100,callbacks=[tensorboard_callback],validation_data = val)

如果您的数据集是 numpy 数据集,您可以像这样创建一个 TF 数据集:

dataset = tf.data.Dataset.from_tensor_slices((features,labels))

train = dataset.take(train_size)
test = dataset.skip(train_size).batch(batchsize)
val = test.skip(test_size).batch(batchsize)
test = test.take(test_size).batch(batchsize)

其中 train 是您的训练数据集,验证验证数据集并测试测试数据集。