|
import tensorflow as tf |
|
print("TensorFlow version:", tf.__version__) |
|
|
|
from tensorflow.keras.layers import Dense, Flatten, Conv2D |
|
from tensorflow.keras import Model |
|
|
|
|
|
|
|
mnist = tf.keras.datasets.mnist |
|
|
|
(x_train, y_train), (x_test, y_test) = mnist.load_data() |
|
x_train, x_test = x_train / 255.0, x_test / 255.0 |
|
|
|
|
|
x_train = x_train[..., tf.newaxis].astype("float32") |
|
x_test = x_test[..., tf.newaxis].astype("float32") |
|
|
|
|
|
|
|
train_ds = tf.data.Dataset.from_tensor_slices( |
|
(x_train, y_train)).shuffle(10000).batch(32) |
|
|
|
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32) |
|
|
|
|
|
|
|
|
|
|
|
class UAF(Model): |
|
def __init__(self): |
|
super(UAF, self).__init__() |
|
self.A = tf.Variable(10.0, trainable=True) |
|
self.B = tf.Variable(0.0000012, trainable=True) |
|
self.C = tf.Variable(0.0000001, trainable=True) |
|
self.D = tf.Variable(9.0, trainable=True) |
|
self.E = tf.Variable(0.00000102, trainable=True) |
|
|
|
|
|
def call(self, input): |
|
P1 = (self.A*(input+self.B)) + (self.C * tf.math.square(input)) |
|
P2 = (self.D*(input-self.B)) |
|
|
|
P3 = tf.nn.relu(P1) + tf.math.log1p(tf.math.exp(-tf.math.abs(P1))) |
|
P4 = tf.nn.relu(P2) + tf.math.log1p(tf.math.exp(-tf.math.abs(P2))) |
|
|
|
return P3 - P4 + self.E |
|
|
|
|
|
|
|
class MyModel(Model): |
|
def __init__(self): |
|
super(MyModel, self).__init__() |
|
self.conv1 = Conv2D(32, 3, activation=None) |
|
self.flatten = Flatten() |
|
self.d1 = Dense(128, activation=None) |
|
self.d2 = Dense(10, activation=None) |
|
self.act0 = UAF() |
|
self.act1 = UAF() |
|
self.act2 = UAF() |
|
|
|
|
|
def call(self, x): |
|
x = self.conv1(x) |
|
x = self.act0(x) |
|
x = self.flatten(x) |
|
x = self.d1(x) |
|
x = self.act1(x) |
|
x = self.d2(x) |
|
return self.act2(x) |
|
|
|
|
|
model = MyModel() |
|
|
|
|
|
|
|
|
|
|
|
loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) |
|
|
|
optimizer = tf.keras.optimizers.Adam() |
|
|
|
|
|
|
|
train_loss = tf.keras.metrics.Mean(name='train_loss') |
|
train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy') |
|
|
|
test_loss = tf.keras.metrics.Mean(name='test_loss') |
|
test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy') |
|
|
|
|
|
|
|
|
|
@tf.function |
|
def train_step(images, labels): |
|
with tf.GradientTape() as tape: |
|
|
|
|
|
predictions = model(images, training=True) |
|
loss = loss_object(labels, predictions) |
|
gradients = tape.gradient(loss, model.trainable_variables) |
|
optimizer.apply_gradients(zip(gradients, model.trainable_variables)) |
|
|
|
train_loss(loss) |
|
train_accuracy(labels, predictions) |
|
|
|
|
|
@tf.function |
|
def test_step(images, labels): |
|
|
|
|
|
predictions = model(images, training=False) |
|
t_loss = loss_object(labels, predictions) |
|
|
|
test_loss(t_loss) |
|
test_accuracy(labels, predictions) |
|
|
|
|
|
EPOCHS = 20 |
|
|
|
for epoch in range(EPOCHS): |
|
|
|
train_loss.reset_states() |
|
train_accuracy.reset_states() |
|
test_loss.reset_states() |
|
test_accuracy.reset_states() |
|
|
|
for images, labels in train_ds: |
|
train_step(images, labels) |
|
|
|
for test_images, test_labels in test_ds: |
|
test_step(test_images, test_labels) |
|
|
|
print( |
|
f'Epoch {epoch + 1}, ' |
|
f'Loss: {train_loss.result()}, ' |
|
f'Accuracy: {train_accuracy.result() * 100}, ' |
|
f'Test Loss: {test_loss.result()}, ' |
|
f'Test Accuracy: {test_accuracy.result() * 100}' |
|
) |
|
|
|
|