# <center>21年美赛做题总结-编程的角度
## 1.lenet图像分类
1. 第一题:说明并讨论是否可以预测这种有害生物随时间的传播,以及精确程度如何
由于要预测,我们首先查看了数据集,发现positive的数量并不多并且大部分为不确定的或者是未被处理过的,
![输入图片说明](imgs/1.png)
于是我们看了第二题,‘仅使用提供的数据集文件和(可能)提供的图像文件来创建、分析和讨论预测错误分类可能性的模型‘,意思是要我们根据图像来对不确定的样本进行预测,于是就考虑先做第二题,先进行图像分类,因为要进行图像分类,所以就想到了要用神经网络,于是经过了...搜索,发现matlab有个可以进行**深度学习网络搭建的工具**可以使用下面的命令打开
```
deepNetworkDesigner
```
打开后就只需要把不同类别的图片放到不同的文件夹,使用类似于画流程图的方式搭建好网络就可以自动开始训练的,于是就考虑将不同类别的图片分到不同的文件夹下,要做到👈这点,首先需要通过GlobalID,将2021MCM_ProblemC_ Images_by_GlobalID文件中的FileName和2021MCMProblemC_DataSet.xlsx中的Lab Status放到一个表中,这块的编程如下:
% chubu1.m
```matlab
%用于将找到id和filename的对应关系,得到yongyutupianchuli.xlsx表格,表格备注在文件备注.xlsx中
%%
% 文件读取
[~,~,imgs]=xlsread('2021MCM_ProblemC_ Images_by_GlobalID.xlsx');
[~,~,details]=xlsread('2021MCMProblemC_DataSet.xlsx');
%%
usedforp{1,1}='GlobalID';
usedforp{1,2}='Lab Status';
usedforp{1,3}='FileName';
% 将图片表格里面id摘出来
imgsid=imgs(:,2);
imgname=imgs(:,1);
% 新表的索引
k=2;
unknow=[];
for i=2:4441
item=details{i,1};
index=find(strcmp(imgsid,item));
if length(index)==0
unknow=[unknow,i];
usedforp{k,1}=details{i,1};
usedforp{k,2}=details{i,4};
k=k+1;
continue;
end
indexl=length(index);
for j=1:indexl
usedforp{k,1}=imgsid{index(j),1};
usedforp{k,2}=details{i,4};
usedforp{k,3}=imgname{index(j),1};
k=k+1;
end
end
%%
% 存入表格
xlswrite('yongyutupianchuli.xlsx',usedforp,1);
```
**注:**
1. 非常重要!一个id可能对应多张图片,在搜索的时候一定要注意,最开始我没注意到,所以以为有些图片没有id,但实际是每张图片都有id,并且有的id没有图片,只有notes(关于这些怎么分类请看后文)
2. 那个看起来全是图片的文件夹里面有pdf和视频文件,这里我们是先根据文件名也就是使用上述程序先对不同文件分好类,然后在对应类的文件下把pdf中的图片取出,每个视频截三张图(这块取出和截图的时候要注意命名,因为还要通过文件名找到对应id
分好文件夹后(**分好的文件详见文件夹-'/处理后的data-classify2'**)就可以进行神经网络的搭建了,我最开始用一个叫sqeeze net,据说那个用来图像分类效果很好,但是我注意到它有68层,所以,,,后面它就把我的电脑跑崩了,于是我就换成了最基础的lenet-5来分类,下面是网络的流程图,对图片进行的增强(由于positive的样本实在太少,所以进行了增强)以及训练结果
![输入图片说明](imgs/lenet%E6%B5%81%E7%A8%8B%E5%9B%BE-2.png)
![输入图片说明](imgs/lenet%E5%A2%9E%E5%BC%BA.png)
![输入图片说明](imgs/lenet%E5%88%86%E7%B1%BB%E5%99%A8%E8%AE%AD%E7%BB%83%E7%BB%93%E6%9E%9C.png)
训练后**使用分类器对图像分类得到的分类结果详见表classify.xlsx**
------
------
## 2. LSTM文本分类
上面说到由于有些id(指globalid,以下出现同义)没有图片、pdf和视频,就没办法使用以上方法进行分类,于是就考虑使用文本分析,就使用了lstm根据notes对没有label(指最初就没有label的)进行分类,lstm的代码如下:
% lstmfenlei.py
```python
% lstm文本分类
import pandas as pd
import re
import json
import numpy as np
import nltk
from sklearn.metrics import accuracy_score, classification_report
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Embedding, LSTM, SpatialDropout1D
from sklearn.model_selection import train_test_split
from tensorflow.keras.callbacks import EarlyStopping
import jieba as jb
# 读入数据
comment_data=pd.read_excel('havelabel.xlsx')
# print(comment_data.shape)
# print(comment_data.head())
# 数据预处理删除所有记录中包含的空值或空字符串
comment_data=comment_data.dropna()
guolv=comment_data['Notes']!=' '
comment_data=comment_data[guolv]
# print(comment_data.shape)
# 将label转换成id0,1,2这样
comment_data['label_id']=comment_data['Lab Status'].factorize()[0]
comment_id = comment_data[['Lab Status', 'label_id']].drop_duplicates().sort_values('label_id').reset_index(drop=True)
# 加载停用词
stopwords = nltk.corpus.stopwords.words("english")
# 分词并过滤停用词
comment_data['cNotes']=comment_data['Notes'].apply(lambda x: " ".join([w for w in list(jb.cut(x)) if w not in stopwords]))
# print(comment_data)
# LSTM建模
MAX_NB_WORDS = 50000
# 每条cut_review最大的长度
MAX_SEQUENCE_LENGTH = 250
# 设置Embeddingceng层的维度
EMBEDDING_DIM = 100
tokenizer = Tokenizer(num_words=MAX_NB_WORDS, filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~', lower=True)
tokenizer.fit_on_texts(comment_data['cNotes'].values)
word_index = tokenizer.word_index
# print('共有 %s 个不相同的词语.' % len(word_index))
X = tokenizer.texts_to_sequences(comment_data['cNotes'].values)
# 填充X,让X的各个列的长度统一
X = pad_sequences(X, maxlen=MAX_SEQUENCE_LENGTH)
# 多类标签的onehot展开
Y = pd.get_dummies(comment_data['label_id']).values
# print(X.shape,Y.shape)
# print(X)
# print(Y)
# 拆分训练集和测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.10, random_state=42)
print(X_train.shape, Y_train.shape)
print(X_test.shape, Y_test.shape)
# 定义模型
model = Sequential()
model.add(Embedding(MAX_NB_WORDS, EMBEDDING_DIM, input_length=X.shape[1]))
model.add(SpatialDropout1D(0.2))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
# 模型训练
epochs = 5
batch_size = 64
history = model.fit(X_train, Y_train, epochs=epochs, batch_size=batch_size, validation_split=0.1,
callbacks=[EarlyStopping(monitor='val_loss', patience=3, min_delta=0.0001)])
accr = model.evaluate(X_test, Y_test)
print('Test set\n Loss: {:0.3f}\n Accuracy: {:0.3f}'.format(accr[0], accr[1]))
# LSTM模型的评估
y_pred = model.predict(X_test)
y_pred = y_pred.argmax(axis=1)
Y_test = Y_test.argmax(axis=1)
print('accuracy %s' % accuracy_score(y_pred, Y_test))
print(classification_report(Y_test, y_pred, target_names=comment_id['Lab Status'].values))
def predict(text):
txt = text
txt = [" ".join([w for w in list(jb.cut(txt.lower())) if w not in stopwords])]
seq = tokenizer.texts_to_sequences(txt)
padded = pad_sequences(seq, maxlen=MAX_SEQUENCE_LENGTH)
pred = model.predict(padded)
cat_id = pred.argmax(axis=1)[0]
return comment_id[comment_id.label_id == cat_id]['Lab Status'].values[0]
# 分类
unpro=pd.read_excel('unpro.xlsx')
# print(unpro['Notes'][len(unpro)-1])
# print()
unpro['nlplabel'] = unpro['Lab Status']
for i in range(len(unpro)):
unpro['nlplabel'][i]=predict(unpro['Note
没有合适的资源?快使用搜索试试~ 我知道了~
2021年美赛C题训练
共55个文件
sample:14个
xlsx:11个
png:7个
0 下载量 130 浏览量
2024-03-09
15:22:32
上传
评论
收藏 7.47MB ZIP 举报
温馨提示
2021年美赛C题训练
资源推荐
资源详情
资源评论
收起资源包目录
21C-meisai.zip (55个子文件)
21C-meisai
codes
colorset.py 926B
fenleilast.m 932B
ditu.m 4KB
lstmfenlei.py 4KB
chubu1.m 857B
yuce.py 3KB
处理后的data
yongyutupianchuli.xlsx 451KB
yuceresult.xlsx 14KB
classify.xlsx 95KB
classify2 131B
unprolabelnlp.xlsx 346KB
unpro.xlsx 332KB
positive.xlsx 10KB
lastfenlei.xlsx 109KB
havelabel.xlsx 285KB
.git
index 3KB
HEAD 23B
refs
heads
master 41B
tags
remotes
origin
HEAD 32B
objects
pack
pack-e7f66abf3c18d530f3f786841d5c0edf5bd4e5f4.rev 344B
pack-e7f66abf3c18d530f3f786841d5c0edf5bd4e5f4.pack 3.73MB
pack-e7f66abf3c18d530f3f786841d5c0edf5bd4e5f4.idx 3KB
info
description 73B
packed-refs 114B
info
exclude 240B
logs
HEAD 183B
refs
heads
master 183B
remotes
origin
HEAD 183B
hooks
post-update.sample 189B
sendemail-validate.sample 2KB
prepare-commit-msg.sample 1KB
commit-msg.sample 896B
pre-receive.sample 544B
update.sample 4KB
pre-commit.sample 2KB
pre-rebase.sample 5KB
applypatch-msg.sample 478B
fsmonitor-watchman.sample 5KB
push-to-checkout.sample 3KB
pre-applypatch.sample 424B
pre-push.sample 1KB
pre-merge-commit.sample 416B
config 303B
rawdata&problem
原始图片集的位置 131B
2021MCM_ProblemC_ Images_by_GlobalID.xlsx 179KB
2021MCMProblemC_DataSet.xlsx 608KB
文件备注.xlsx 10KB
imgs
keshihua1.png 56KB
地图可视化结果1-使用tableau.png 964KB
1.png 43KB
lenet流程图-1.png 18KB
lenet增强.png 82KB
lenet流程图-2.png 79KB
lenet分类器训练结果.png 223KB
README.md 18KB
共 55 条
- 1
资源评论
智光工作室
- 粉丝: 770
- 资源: 233
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功