我想知道如何在这个tensorboard逻辑回归中添加准确度、精度和保存模型等指标。
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))
我是新来的,我只在tensorflow 1.x中得到了写日志的机会。with tf.Session as sess
从tensorflow离开,我迷失在其他的方式制作代码。
使用简单的Tensorflow V2,你的代码会像这样。
从创建模型开始,Logistic回归可以被看作是一个具有sigmoid激活的单层感知器,所以我们将添加一个输入层,输入的数量和特征的数量一样多,每个输出类添加一个具有sigmoid激活的输出层。
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。
现在我们可以这样 "编译 "模型。
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是你的训练数据集 val是验证数据集 test是测试数据集。
首先你要创建一个回调函数来更新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是你的损失函数,还可以选择met你的指标。
现在你可以像这样训练模型。
model.fit(train,epochs=100,callbacks=[tensorboard_callback],validation_data = val)
它将创建一个Tensorboard实例,你会看到终端的地址。你可以在浏览器中复制链接,然后看到它。
我看到你还在使用 "旧的 "Tensorflow v1的方式来编译和创建模型。如果你不使用particoular训练方法的话,使用model.compile和model.fit会更简单、更快速(在我看来)。例如,你不能用这种方式来greate GANs)。