根据ResNet50网络的结构图,参考开源代码,完成的一部分网络构建
在查找数据集的过程中找到了使用python爬虫获取数据的方法(但还未决定是否使用)
目前遇到的问题:在图像识别的算法中尚未遇到大问题
代码
# conv_block部分
def conv_block(input_tensor, filters, stride):
# 分别接收卷积核的个数,即特征图的个数
filter1, filter2, filter3 = filters
# ==1== 正向传播部分
# 卷积层
x = layers.Conv2D(filter1, kernel_size=(1,1), strides=stride)(input_tensor)
# BN层
x = layers.BatchNormalization()(x)
# 激活层
x = layers.Activation('relu')(x)
# 卷积层
x = layers.Conv2D(filter2, kernel_size=(3,3), strides=(1,1), padding='same')(x)
# BN层
x = layers.BatchNormalization()(x)
# 激活函数
x = layers.Activation('relu')(x)
# 卷积层
x = layers.Conv2D(filter3, kernel_size=(1,1), strides=(1,1))(x)
# BN层
x = layers.BatchNormalization()(x)
# ==2== shotcut部分
# 卷积层
shotcut = layers.Conv2D(filter3, kernel_size=(1,1), strides=stride)(input_tensor)
# BN层
shotcut = layers.BatchNormalization()(shotcut)
# ==3== 两部分组合
x = layers.add([x, shotcut])
# 激活函数
x = layers.Activation('relu')(x)
# 返回结果
return x
# identity_block部分
def iden_block(input_tensor, filters):
# 接收卷积核的个数
filter1, filter2, filter3 = filters
# ==1== 正向传播
# 卷积层
x = layers.Conv2D(filter1, kernel_size=(1,1), strides=(1,1))(input_tensor)
# BN层
x = layers.BatchNormalization()(x)
# 激活函数
x = layers.Activation('relu')(x)
# 卷积层
x = layers.Conv2D(filter2, kernel_size=(3,3), strides=(1,1), padding='same')(x)
# BN层
x = layers.BatchNormalization()(x)
# 激活函数
x = layers.Activation('relu')(x)
# 卷积层
x = layers.Conv2D(filter3, kernel_size=(1,1), strides=(1,1))(x)
# BN层
x = layers.BatchNormalization()(x)
# ==2== 结合
x = layers.add([x, input_tensor])
# 激活函数
x = layers.Activation('relu')(x)
return x
# 本体
def resnet50(input_shape=[224,224,3], output_shape=10):
# 输入层
inputs = keras.Input(shape=input_shape) #[224,224,3]
# padding,上下左右各三层
x = layers.ZeroPadding2D((3,3))(inputs)
# 卷积层
x = layers.Conv2D(64, kernel_size=(7,7), strides=(2,2))(x) #[112,112,64]
# BN层
x = layers.BatchNormalization()(x) #[112,112,64]
# relu层
x = layers.Activation('relu')(x) #[112,112,64]
# 池化层
x = layers.MaxPool2D(pool_size=(3,3), strides=(2,2))(x) #[55,55,64]
# block1
x = conv_block(x, [64, 64, 256], stride=(1,1)) #[55,55,256]
x = iden_block(x, [64, 64, 256]) #[55,55,256]
x = iden_block(x, [64, 64, 256]) #[55,55,256]
# block2
x = conv_block(x, [128, 128, 256], stride=(2,2)) #[28,28,512]
x = iden_block(x, [128, 128, 256]) #[28,28,512]
x = iden_block(x, [128, 128, 256]) #[28,28,512]
x = iden_block(x, [128, 128, 256]) #[28,28,512]
# block3
x = conv_block(x, [256, 256, 1024], stride=(2,2)) #[14,14,1024]
x = iden_block(x, [256, 256, 1024]) #[14,14,1024]
x = iden_block(x, [256, 256, 1024]) #[14,14,1024]
x = iden_block(x, [256, 256, 1024]) #[14,14,1024]
x = iden_block(x, [256, 256, 1024]) #[14,14,1024]
x = iden_block(x, [256, 256, 1024]) #[14,14,1024]
# block4
x = conv_block(x, [512, 512, 2048], stride=(2,2)) #[7,7,2048]
x = iden_block(x, [512, 512, 2048]) #[7,7,2048]
x = iden_block(x, [512, 512, 2048]) #[7,7,2048]
# 平均池化层
x = layers.AveragePooling2D(pool_size=(7,7))(x) #[1,1,2048]
# Flatten层
x = layers.Flatten()(x) #[None,2048]
# 输出层,不做softmax
outputs = layers.Dense(output_shape)(x)
# 构建模型
model = Model(inputs=inputs, outputs=outputs)
# 返回模型
return model
# 创建restnet-50
model = resnet50()
# 查看网络结构
model.summary()
暂定前端使用选定Web框架——SSM框架,并正在通过网上的资源学习如何搭建
SSM框架是spring、spring MVC 、和mybatis框架的整合,是标准的MVC模式。标准的SSM框架有四层,分别是dao层(mapper),service层,controller层和View层。使用spring实现业务对象管理,使用spring MVC负责请求的转发和视图管理,mybatis作为数据对象的持久化引擎。
使用IDEA配置了java web所需要的环境,使用tomcat进行网页的测试,配置了一个本地服务器用以进行网站的登录。编写了一些基础的xml文件和jsp文件进行环境变量的配置,然后进行网页的登录。在配置完环境后就可以使用tomcat进行网站的登录,观察前端的效果,由于刚开始进行开发,所以先制作了一个简单的登录界面
主干网络:EfficientNet-B3。最后一层添加maxpool,和avgpool进行拼接,增加特征表示。
数据增强:mixup)
主要集中于具体代码的编写和环境的配置。尤其是在网络上找到的现有资源配置不兼容,以及许多代码语句无法理解。以前对java web使用的次数不是很多,对于jsp中一些常用的函数有些遗忘,所以还需要进行学习,了解jsp和java web的工作流程,设计出具有正确逻辑的网页。
继续学习有关内容,尝试搭建好前端平台。现在只是进行了java web环境的搭建,为了使网页能顺利运行还需要和前端代码配合,使网页能够具有正确的逻辑。下一步准备制作出较为完整的网页并使其能够正确运行,并测试网页有没有Bug。
在后端获得的收获:的开发过程中我学习了如何进行java web的配置,使用tomcat配置了服务器,同时学习了xml和html文件的编写。对于我接下来的开发有很大的帮助。
蓝线为计划完成任务数,黑线为实际完成任务数,绿色为剩余任务数。