通过简单神经网络识别猫图片

代码位置:https://github.com/lilihongjava/deep_learning/tree/master/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E8%AF%86%E5%88%AB%E7%8C%AB

数据预处理:

数据为H5文件,保存训练集有209张64x64的图像,训练集的图像对应的分类值(【0 | 1】,0表示不是猫,1表示是猫)

测试集里面的图像数据(本训练集有50张64x64的图像),测试集的图像对应的分类值(【0 | 1】,0表示不是猫,1表示是猫)

训练集_图片的维数 : (209, 64, 64, 3),每个像素点由(R,G,B)三原色构成的,所以要乘以3

训练集_标签的维数 : (1, 209)

测试集_图片的维数: (50, 64, 64, 3)

测试集_标签的维数: (1, 50)

预处理将训练和测试数据压缩为一个平坦的图像方便处理

训练集降维最后的维度: (12288, 209)
训练集_标签的维数 : (1, 209)
测试集降维之后的维度: (12288, 50)
测试集_标签的维数 : (1, 50)

逻辑回归公式介绍

识别猫项目本质上为逻辑回归,只不过通过神经网络来实现,公式为

python代码激活函数为,此项目中,训练集X维度为(12288, 209)209个样本,w为(12288,1),w^{T}为(1,12288),b维度为(1, 209),但在python中可以为一个实数,python会自动转换为(1, 209)--python广播。计算完A的维度为(1,209)

A = sigmoid(np.dot(w.T, X) + b)

所有训练样例求和来计算成本,为什么L损失函数是\mathcal{L}(a^{(i)}, y^{(i)}) = - y^{(i)} \log(a^{(i)}) - (1-y^{(i)} ) \log(1-a^{(i)})\tag{3},而不是\mathcal{L}(a^{(i)}, y^{(i)}) = \frac{1}{2}(a^{(i)}-y^{(i)})^{2},因为后面这个函数是非凸函数,可能找不到全局最优值

python代码为:

J = (- 1 / m) * np.sum(Y * np.log(A) + (1 - Y) * (np.log(1 - A))) 

逻辑回归的反向传播,关于w和b的偏导数,全局成本函数J是1到m损失函数求和的平均,所以J对w和b的求导也同样是各项损失函数对w和b导数的平均,单个样本dz求导是(a-y),dw求导是x(a-y),db求导是(a-y),所以m个样本的公式为:

dw=\frac1m\sum_{i=1}^mx^{(i)}(a^{(i)}-y^{(i)})

python代码为:

dw = (1 / m) * np.dot(X, (A - Y).T)
db = (1 / m) * np.sum(A - Y)

梯度下降

通过最小化成本函数 J来学习 w和b 。对于参数 θ ,更新规则是\theta = \theta - \alpha \text{ } d\theta,其中 α 是学习率

 

构建网络步骤

建立神经网络的主要步骤是:
1. 定义模型结构(例如输入特征的数量)
2. 初始化模型的参数
3. 循环:

3.1 计算当前损失(正向传播)

3.2 计算当前梯度(反向传播)

3.3 更新参数(梯度下降)

 

 

基于卷积神经网络(Convolutional Neural Network, CNN)的识别是一个经典的计算机视觉任务,通常用于图像分类。CNN特别适合处理网格结构的数据,如图片,因为它能够捕捉局部特征并进行空间不变性。以下是一个简单的Python代码框架,使用Keras库实现识别: ```python # 导入必要的库 import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense # 加载预处理好的狗数据集(如ImageNet) (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.cifar10.load_data() # 数据预处理 train_images = train_images / 255.0 test_images = test_images / 255.0 train_images = train_images.reshape(-1, 32, 32, 3) test_images = test_images.reshape(-1, 32, 32, 3) # 定义模型 model = Sequential([ Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)), MaxPooling2D((2, 2)), Conv2D(64, (3, 3), activation='relu'), MaxPooling2D((2, 2)), Flatten(), Dense(128, activation='relu'), Dense(2, activation='softmax') # 2类分类,一类是,一类是狗 ]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels)) # 评估模型 test_loss, test_accuracy = model.evaluate(test_images, test_labels) print(f"Test accuracy: {test_accuracy}") # 相关问题-- 1. 如何在实际应用中收集和标注狗图像数据? 2. 除了CIFAR-10,还有哪些常用的数据集可以训练识别模型? 3. 如何调整CNN架构以提高识别的性能?
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lovelife110

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值