cafir100牛刀小试

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()

posted @ 2021-04-13 18:01  cyssmile  阅读(123)  评论(0)    收藏  举报