import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, optimizers, models, Sequential,datasets
config = tf.compat.v1.ConfigProto(gpu_options=tf.compat.v1.GPUOptions(allow_growth=True))
sess = tf.compat.v1.Session(config=config)
conv_net = [
#unit1
layers.Conv2D(64,kernel_size=[3,3],strides=1, padding='same',activation='relu'),
layers.Conv2D(64,kernel_size=[3,3],strides=1, padding='same',activation='relu'),
layers.MaxPool2D(pool_size=[2,2],strides=2,padding='same'),
# unit2
layers.Conv2D(128, kernel_size=[3, 3], strides=1, padding='same',activation='relu'),
layers.Conv2D(128, kernel_size=[3, 3], strides=1, padding='same',activation='relu'),
layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),
# unit3
layers.Conv2D(256, kernel_size=[3, 3], strides=1, padding='same',activation='relu'),
layers.Conv2D(256, kernel_size=[3, 3], strides=1, padding='same',activation='relu'),
layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),
# unit4
layers.Conv2D(512, kernel_size=[3, 3], strides=1, padding='same',activation='relu'),
layers.Conv2D(512, kernel_size=[3, 3], strides=1, padding='same',activation='relu'),
layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),
# unit5
layers.Conv2D(512, kernel_size=[3, 3], strides=1, padding='same',activation='relu'),
layers.Conv2D(512, kernel_size=[3, 3], strides=1, padding='same',activation='relu'),
layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),
#32/(2**5) = 1
#result = [b, 1,1, 512]
]
def preprocess(x,y):
x=tf.cast(x, dtype=tf.float32)/255.
y=tf.cast(y,dtype=tf.int32)
return x,y
def load_data():
(x,y),(x_test,y_test)=datasets.cifar100.load_data();
y=tf.squeeze(y)
y_test=tf.squeeze(y_test)
db=tf.data.Dataset.from_tensor_slices((x,y))
db=db.map(preprocess).shuffle(50000).batch(64)
db_test=tf.data.Dataset.from_tensor_slices((x_test,y_test))
db_test=db_test.map(preprocess).batch(64)
return db,db_test
dense_net = [
layers.Dense(512,activation='relu'),
layers.Dense(256,activation='relu'),
layers.Dense(100,activation=None)
]
def main():
conv_network=Sequential(conv_net)
conv_network.build(input_shape=[None,32,32,3])
dense_network=Sequential(dense_net)
dense_network.build(input_shape=[None, 512])
trainable_variables = conv_network.trainable_variables + dense_network.trainable_variables
optimizer=optimizers.Adam(learning_rate=1e-4)
(db,db_test)=load_data()
#it=iter(db)
#sample=next(it)
#print(sample[1].shape)
for epoch in range(20):
for step,(x,y) in enumerate(db):
#print("x.shape,y.shape",x.shape,y.shape)
with tf.GradientTape() as tape:
out=conv_network(x)
out=tf.reshape(out,[-1,512])
logits=dense_network(out)
y_onehot=tf.one_hot(y,depth=100)
#print("y_one_hot shape",y_onehot.shape)
loss=tf.losses.categorical_crossentropy(y_onehot,logits,from_logits=True)
loss=tf.reduce_mean(loss)
greds=tape.gradient(loss, trainable_variables)
optimizer.apply_gradients(zip(greds,trainable_variables))
if step % 100 == 0:
print('loss:',float(loss))
#test
total_number=0
correct_number=0
for step,(x,y) in enumerate(db_test):
out=conv_network(x)
out=tf.reshape(out,[-1,512])
logits=dense_network(out)
y=tf.cast(y,dtype=tf.int32)
prod=tf.nn.softmax(logits,axis=1)
pred=tf.argmax(prod,axis=1)
pred=tf.cast(pred,dtype=tf.int32)
correct=tf.reduce_sum(tf.cast(tf.equal(pred,y),dtype=tf.int32))
correct_number += correct
total_number+=x.shape[0]
print("acc:",float(correct_number/total_number))
if __name__ == '__main__':
main()