ResNet18代码实现(tensorflow,80行)

前言:

ResNet18的实现还是相对比较简单的,一共就18次卷积,从数据加载到最后完成验证不到80行

import tensorflow as tf
import pandas as pd
import numpy as np
from tensorflow.keras import layers
from sklearn.metrics import classification_report
import warnings
warnings.filterwarnings('ignore')

#数据导入
train_data = pd.read_csv('sign_train.csv')
test_data = pd.read_csv('sign_test.csv')

train_x = train_data.drop('label',axis=1).values
train_y = train_data['label'].values

test_x = test_data.drop('label',axis=1).values
test_y = test_data['label'].values

#数据归一化
train_x = train_x / 255
test_x = test_x / 255

train_x = train_x.reshape((-1, 28, 28, 1))
test_x = test_x.reshape((-1, 28, 28, 1))

#模型建立
def conv2d_bn(inpt, filters=64, kernel_size=(3,3), strides=1, padding='same'):
    '''卷积、归一化和relu三合一'''
    x = layers.Conv2D(filters=filters, kernel_size=kernel_size, strides=strides, padding=padding)(inpt)
    x = layers.BatchNormalization()(x)
    x = tf.keras.layers.Activation('relu')(x)
    return x

def basic_bottle(inpt, filters=64, kernel_size=(3,3), strides=1, padding='same', if_baisc=False):
    '''18中的4个basic_bottle'''
    x = conv2d_bn(inpt, filters=filters, kernel_size=kernel_size, strides=strides, padding=padding)
    x = conv2d_bn(x, filters=filters)
    if if_baisc==True:
        temp = conv2d_bn(inpt, filters=filters, kernel_size=(1,1), strides=2, padding='same')
        outt = layers.add([x, temp])
    else:
        outt = layers.add([x, inpt])
    return outt

def resnet18(class_nums):
    '''主模型'''
    inpt = layers.Input(shape=(28,28,1))
    #layer 1
    x = conv2d_bn(inpt, filters=64, kernel_size=(7,7), strides=2, padding='valid')
    x = layers.MaxPool2D(pool_size=(3,3), strides=2)(x)
    #layer 2
    x = basic_bottle(x, filters=64, kernel_size=(3,3), strides=1, padding='same', if_baisc=False)
    x = basic_bottle(x, filters=64, kernel_size=(3,3), strides=1, padding='same', if_baisc=False)
    #layer 3
    x = basic_bottle(x, filters=128, kernel_size=(3, 3), strides=2, padding='same', if_baisc=True)
    x = basic_bottle(x, filters=128, kernel_size=(3, 3), strides=1, padding='same', if_baisc=False)
    # layer 4
    x = basic_bottle(x, filters=256, kernel_size=(3, 3), strides=2, padding='same', if_baisc=True)
    x = basic_bottle(x, filters=256, kernel_size=(3, 3), strides=1, padding='same', if_baisc=False)
    # layer 5
    x = basic_bottle(x, filters=512, kernel_size=(3, 3), strides=2, padding='same', if_baisc=True)
    x = basic_bottle(x, filters=512, kernel_size=(3, 3), strides=1, padding='same', if_baisc=False)
    #GlobalAveragePool
    x = layers.GlobalAveragePooling2D()(x)
    x = layers.Dense(class_nums, activation='softmax')(x)
    model = tf.keras.Model(inputs=inpt, outputs=x)
    return model

#开始训练
class_num = len(set(train_y))+1
model = resnet18(class_num)
model.summary()
model.compile(optimizer=tf.keras.optimizers.Adam(),loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics=['accuracy'])
model.fit(train_x, train_y, batch_size=64, epochs=10, validation_split=0.2) #epochs可以调的大一点,如果你机器好的话

#验证结果
pred_y = model.predict(test_x)
last_pred = []
for i in range(pred_y.shape[0]):
    last_pred.append(pred_y[i].argmax())
last_pred = np.array(last_pred)
print(classification_report(test_y, last_pred))

  • 5
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是使用 TensorFlow 实现 ResNet-18 的示例代码: ```python import tensorflow as tf def conv_block(inputs, filters, kernel_size, strides, padding='same', activation=True): x = tf.keras.layers.Conv2D(filters=filters, kernel_size=kernel_size, strides=strides, padding=padding)(inputs) x = tf.keras.layers.BatchNormalization()(x) if activation: x = tf.keras.layers.ReLU()(x) return x def identity_block(inputs, filters, kernel_size): x = conv_block(inputs, filters=filters, kernel_size=kernel_size, strides=1) x = conv_block(x, filters=filters, kernel_size=kernel_size, strides=1, activation=False) x = tf.keras.layers.add([x, inputs]) x = tf.keras.layers.ReLU()(x) return x def resnet18(input_shape=(224, 224, 3), num_classes=1000): inputs = tf.keras.Input(shape=input_shape) # stage 1 x = conv_block(inputs, filters=64, kernel_size=7, strides=2) # stage 2 x = tf.keras.layers.MaxPooling2D(pool_size=3, strides=2, padding='same')(x) x = identity_block(x, filters=64, kernel_size=3) x = identity_block(x, filters=64, kernel_size=3) # stage 3 x = tf.keras.layers.MaxPooling2D(pool_size=3, strides=2, padding='same')(x) x = identity_block(x, filters=128, kernel_size=3) x = identity_block(x, filters=128, kernel_size=3) # stage 4 x = tf.keras.layers.MaxPooling2D(pool_size=3, strides=2, padding='same')(x) x = identity_block(x, filters=256, kernel_size=3) x = identity_block(x, filters=256, kernel_size=3) # stage 5 x = tf.keras.layers.MaxPooling2D(pool_size=3, strides=2, padding='same')(x) x = identity_block(x, filters=512, kernel_size=3) x = identity_block(x, filters=512, kernel_size=3) # final stage x = tf.keras.layers.GlobalAveragePooling2D()(x) x = tf.keras.layers.Dense(num_classes, activation='softmax')(x) return tf.keras.Model(inputs=inputs, outputs=x) ``` 在此示例中,我们定义了三个辅助函数: - `conv_block`:实现卷积层、批量归一化和 ReLU 激活函数。 - `identity_block`:实现 ResNet 的恒等块。 - `resnet18`:实现 ResNet-18 模型,它由一个卷积层、4 个恒等块和一个全局平均池化层组成。 在 `resnet18` 函数中,我们首先定义输入层,然后添加一个卷积层和批量归一化层。接下来,我们按照 ResNet 的结构,添加 4 个恒等块。最后,我们添加一个全局平均池化层和一个输出层,以便对输入进分类。 您可以使用以下代码来编译和训练模型: ```python model = resnet18() model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(train_dataset, epochs=10, validation_data=val_dataset) ``` 请注意,我们使用 `categorical_crossentropy` 作为损失函数,因为我们的目标是多类别分类。您可以根据您的需求更改此设置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值