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)