tf中自定义层实战(CIFAR10图像识别)

tf中自定义层实战(CIFAR10图像识别)

1. 思路

  • 预处理函数
  • 加载数据集与数据预处理
  • 自定义层
  • 自定义模型网络
  • 训练测试(基于keras高层API)
  • 保存模型并加载

2. 代码

import tensorflow as tf
from tensorflow.keras import datasets, layers, optimizers, Sequential, metrics
from tensorflow import keras
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'


def pre_process(x, y):
    x = tf.cast(x, dtype=tf.float32) / 255.
    y = tf.cast(y, dtype=tf.int32)
    return x, y


batch_size = 128
(x, y), (x_test, y_test) = datasets.cifar10.load_data()
y = tf.squeeze(y)  # y和y_test的shape为[50k,1]和[10k,1],需要降维为[50k]和[10k]
y = tf.one_hot(y, depth=10)
y_test = tf.squeeze(y_test)
y_test = tf.one_hot(y_test, depth=10)
train_db = tf.data.Dataset.from_tensor_slices((x, y))
train_db = train_db.map(pre_process).shuffle(10000).batch(batch_size)
test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_db = test_db.map(pre_process).batch(batch_size)
sample = next(iter(train_db))


class MyDense(layers.Layer):
    def __init__(self, input_dim, output_dim):
        super(MyDense, self).__init__()
        self.kernel = self.add_variable('w', [input_dim, output_dim])
        # 自定义层,此处不添加偏差(也可选择加入)
        # self.bias = self.add_variable('b', [output_dim])
    def call(self, inputs, training=None):
        x = inputs @ self.kernel
        return x

class MyModel(keras.Model):
    def __init__(self):
        super(MyModel, self).__init__()
        self.fc1 = MyDense(32*32*3, 256)
        self.fc2 = MyDense(256, 128)
        self.fc3 = MyDense(128, 64)
        self.fc4 = MyDense(64, 32)
        self.fc5 = MyDense(32, 10)
    def call(self, inputs, training=None):
        x = tf.reshape(inputs, [-1, 32*32*3])
        x = self.fc1(x)
        x = tf.nn.relu(x)
        x = self.fc2(x)
        x = tf.nn.relu(x)
        x = self.fc3(x)
        x = tf.nn.relu(x)
        x = self.fc4(x)
        x = tf.nn.relu(x)
        x = self.fc5(x)
        return x


Model = MyModel()
Model.compile(
    optimizer=optimizers.Adam(lr=1e-3),
    loss=tf.losses.CategoricalCrossentropy(from_logits=True),
    metrics=['accuracy']
)
Model.fit(train_db, epochs=20, validation_data=test_db, validation_freq=1)
Model.evaluate(test_db)


# 模型保存
Model.save_weights('Model_weights.ckpt')
del Model
print('saved')


# 模型加载
Model = MyModel()
Model.compile(
    optimizer=optimizers.Adam(lr=1e-3),
    loss=tf.losses.CategoricalCrossentropy(from_logits=True),
    metrics=['accuracy']
)
Model.load_weights('Model_weights.ckpt')
print('loaded')
Model.evaluate(test_db)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 TensorFlow 2.7 代码示例,用于解决 CIFAR-10 图像分类问题: ``` import tensorflow as tf from tensorflow.keras.datasets import cifar10 from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D from tensorflow.keras.optimizers import Adam # 加载 CIFAR-10 数据集 (x_train, y_train), (x_test, y_test) = cifar10.load_data() # 将像素值归一化到 0 到 1 之间 x_train = x_train / 255.0 x_test = x_test / 255.0 # 将标签转换为独热编码格式 y_train = tf.keras.utils.to_categorical(y_train, 10) y_test = tf.keras.utils.to_categorical(y_test, 10) # 构建模型 model = Sequential() model.add(Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(32, 32, 3))) model.add(Conv2D(32, (3, 3), activation='relu', padding='same')) model.add(MaxPooling2D((2, 2))) model.add(Dropout(0.25)) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(Conv2D(64, (3, 3), activation='relu', padding='same')) model.add(MaxPooling2D((2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(optimizer=Adam(learning_rate=0.0001), loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 history = model.fit(x_train, y_train, epochs=50, batch_size=128, validation_data=(x_test, y_test)) # 评估模型 score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) ``` 这个模型使用了两个卷积和两个池化,以及一个全连接和一个输出。使用了 Adam 优化器、分类交叉熵损失函数和准确率作为评估指标。在训练过程,使用了批量大小为 128,训练 50 个 epoch。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值