Tensorflow 卷积神经网络-VGG13 实现CIFAR10数据集分类

1. 下载CIFAR10数据集

import tensorflow as tf

(x,y), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
x = tf.convert_to_tensor(x, tf.float32)
x_test = tf.convert_to_tensor(x_test, tf.float32)
y_test = tf.convert_to_tensor(y_test, tf.int32)
y = tf.convert_to_tensor(y, tf.int32)
y = tf.squeeze(y,axis=1)
y_test = tf.squeeze(y_test,axis=1)
# print(x)
print(y)

train_db = tf.data.Dataset.from_tensor_slices((x,y))
train_db = train_db.shuffle(1000).batch(128)

test_db = tf.data.Dataset.from_tensor_slices((x_test,y_test))
test_db = test_db.batch(128)

2. 创建VGG13网络模型

conv_net = tf.keras.Sequential([
    tf.keras.layers.Conv2D(64, kernel_size=3, padding='same', activation=tf.nn.relu),
    tf.keras.layers.Conv2D(64, kernel_size=3, padding='same', activation=tf.nn.relu),
    tf.keras.layers.MaxPooling2D(pool_size=2,strides=2, padding='same'),

    tf.keras.layers.Conv2D(128, kernel_size=3, padding='same', activation=tf.nn.relu),
    tf.keras.layers.Conv2D(128, kernel_size=3, padding='same', activation=tf.nn.relu),
    tf.keras.layers.MaxPooling2D(pool_size=2,strides=2, padding='same'),

    tf.keras.layers.Conv2D(256, kernel_size=3, padding='same', activation=tf.nn.relu),
    tf.keras.layers.Conv2D(256, kernel_size=3, padding='same', activation=tf.nn.relu),
    tf.keras.layers.MaxPooling2D(pool_size=2,strides=2, padding='same'),

    tf.keras.layers.Conv2D(512, kernel_size=3, padding='same', activation=tf.nn.relu),
    tf.keras.layers.Conv2D(512, kernel_size=3, padding='same', activation=tf.nn.relu),
    tf.keras.layers.MaxPooling2D(pool_size=2,strides=2, padding='same'),

    tf.keras.layers.Conv2D(512, kernel_size=3, padding='same', activation=tf.nn.relu),
    tf.keras.layers.Conv2D(512, kernel_size=3, padding='same', activation=tf.nn.relu),
    tf.keras.layers.MaxPooling2D(pool_size=2,strides=2, padding='same'),

    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(256, activation=tf.nn.relu),
    tf.keras.layers.Dense(64, activation=tf.nn.relu),
    tf.keras.layers.Dense(10, activation=None)
])

conv_net.build(input_shape=[128,32,32,3])
conv_net.summary()

3. 训练模型

losscal = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
optimizer = tf.keras.optimizers.SGD(learning_rate=1e-3)
acc = tf.keras.metrics.Accuracy()

for step, (x, y) in enumerate(train_db):
    with tf.GradientTape() as tape:
        print(x.shape)
        y_pred = conv_net(x)
        print(y_pred.shape)
        # y_pred = fc_net(y_pred)

        y_onehot = tf.one_hot(y, depth=10)
        loss = losscal(y_pred=y_pred, y_true=y_onehot)

    acc.update_state(tf.argmax(y_pred, axis=1), y)
    grads = tape.gradient(loss, conv_net.trainable_variables)
    optimizer.apply_gradients(zip(grads, conv_net.trainable_variables))
    #输出训练结果
    if step % 10 == 0:
        print(step, 'loss:', float(loss), 'acc:', acc.result().numpy())
        acc.reset_states()

4. 测试模型

correct, total = 0, 0
for step, (x, y) in enumerate(test_db):
    y_pred = conv_net(x)
    y_pred = tf.argmax(y_pred, axis=1)
    y = tf.cast(y, tf.int64)
    
    correct += float(tf.reduce_sum(tf.cast(tf.equal(y_pred,y), tf.float32)))
    total += x.shape[0]

print('acc_test: ', correct/total)
发布了93 篇原创文章 · 获赞 2 · 访问量 3029

猜你喜欢

转载自blog.csdn.net/qq_40041064/article/details/104856916