吴恩达深度学习课程第五章第二周编程作业(pytorch实现)
文章目录
- 前言
- 一、词向量运算
- 1.数据准备
- 2.余弦相似度
- 3.词类类比
- 二、表情生成器V1
- 三、表情生成器V2
- 1.构造嵌入层embedding_layer
- 2.Dataloader
- 3.构造LSTM
- 4.模型训练
- 5.实验结果
前言
本博客只是记录一下本人在深度学习过程中的学习笔记和编程经验,大部分代码是参考了【中文】【吴恩达课后编程作业】Course 5 - 序列模型 - 第二周作业 - 词向量的运算与Emoji生成器这篇博客,对其代码实现了复现,但是原博客中代码使用的是tensorflow,而我在学习中主要用到的是pytorch,所以此次作业我使用pytorch框架来完成。代码或文字表述中还存在一些问题,请见谅,之前的博客也是主要参考这个大佬。下文中的完整代码已经上传到百度网盘中,提取码:00cz。
所以开始作业前,请大家安装好pytorch的环境,我代码是在服务器上利用gpu加速运行的,但是cpu版本的pytorch也能运行,只是速度会比较慢。
一、词向量运算
1.数据准备
训练得到词嵌入数据是需要消耗庞大的资源,这里我们就用已经训练好的glove词向量代替。
读取glove英文词向量:
def read_glove_vecs(glove_file):"""加载glove英文词向量:param glove_file: 文件路径:return:"""with open(glove_file, 'r', encoding="utf-8") as f:words = set()word_to_vec_map = {}for line in f:line = line.strip().split()curr_word = line[0]words.add(curr_word)word_to_vec_map[curr_word] = np.array(line[1:], dtype=np.float64)return words, word_to_vec_map
words:列表类型数据,记录了词典中的全部词
word_to_vec_map:字典类型,构造"词-词向量"键值对,可以方便的查找指定词的词向量
查看英文词向量:
words, word_to_vec_map = w2v_utils_pytorch.read_glove_vecs('data/glove.6B.50d.txt')
print(word_to_vec_map["hello"])
[-0.38497 0.80092 0.064106 -0.28355 -0.026759 -0.34532 -0.64253
-0.11729 -0.33257 0.55243 -0.087813 0.9035 0.47102 0.56657
0.6985 -0.35229 -0.86542 0.90573 0.03576 -0.071705 -0.12327
0.54923 0.47005 0.35572 1.2611 -0.67581 -0.94983 0.68666
0.3871 -1.3492 0.63512 0.46416 -0.48814 0.83827 -0.9246
-0.33722 0.53741 -1.0616 -0.081403 -0.67111 0.30923 -0.3923
-0.55002 -0.68827 0.58049 -0.11626 0.013139 -0.57654 0.048833
0.67204 ]
glove中包含了40000个英文单词的词向量,每个词向量的维度是50维。在了解数据的基本情况后,可以运用这些词向量做一些简单的计算了。
2.余弦相似度
根据余弦相似度的计算公式可以编程计算两个词的相似度情况,不清楚余弦相似度的可以自行百度:
def cosine_similarity(u, v):"""计算两个词向量的余弦相似度:param u:单词u的词向量:param v:单词v的词向量:return:"""dot = np.dot(u, v)norm_u = np.sqrt(np.sum(np.power(u, 2)))norm_v = np.sqrt(np.sum(np.power(v, 2)))distance = np.divide(dot, norm_v * norm_u)return distance
简单计算一些词的余弦相似度:
words, word_to_vec_map = w2v_utils_pytorch.read_glove_vecs('data/glove.6B.50d.txt')father = word_to_vec_map["father"]
mother = word_to_vec_map["mother"]
ball = word_to_vec_map["ball"]
crocodile = word_to_vec_map["crocodile"]
france = word_to_vec_map["france"]
italy = word_to_vec_map["italy"]
paris = word_to_vec_map["paris"]
rome = word_to_vec_map["rome"]print("cosine_similarity(father, mother) = ", w2v_utils_pytorch.cosine_similarity(father, mother))
print("cosine_similarity(ball, crocodile) = ",w2v_utils_pytorch.cosine_similarity(ball, crocodile))
print("cosine_similarity(france - paris, rome - italy) = ",w2v_utils_pytorch.cosine_similarity(france - paris, rome - italy))
cosine_similarity(father, mother) = 0.8909038442893616
cosine_similarity(ball, crocodile) = 0.27439246261379424
cosine_similarity(france - paris, rome - italy) = -0.6751479308174201
可以看出约相似的词,其词向量在空间中的夹角越小,计算得到的余弦相似度就越大,这也说明了glove词向量的质量比较优秀。
3.词类类比
当我们拥有优秀的词向量后可以完成词类类比任务:“A与B相比就类似于C与____相比一样”,比如:“男人与女人相比就像国王与 女皇 相比”。具体原理就是在词典中找到一个词D,使得vector(B)-vector(A) ≈\approx≈ vector(D)-vector©,依旧采用余弦公式计算两者的相似度。
def complete_analogy(word_a, word_b, word_c, word_to_vec_map):"""词类比问题:解决“A与B相比就类似于C与____相比一样”问题,比如“男人与女人相比就像国王与 女皇 相比一样”其实就是在词库里面找到一个词word_d满足:word_b - word-a 与 word_d - word_c 近似相等:param word_a:词a:param word_b:词b:param word_c:词c:param word_to_vec_map:词典:return:"""# 将单词转换为小写word_a, word_b, word_c = word_a.lower(), word_b.lower(), word_c.lower()# 找到单词的词向量e_a, e_b, e_c = word_to_vec_map[word_a], word_to_vec_map[word_b], word_to_vec_map[word_c]words = word_to_vec_map.keys()max_cosine_similarity = -100best_word = None# 遍历整个词典for word in words:if word in [word_a, word_b, word_c]:continuecosine_sim = cosine_similarity((e_b - e_a), (word_to_vec_map[word] - e_c))if cosine_sim > max_cosine_similarity:max_cosine_similarity = cosine_simbest_word = wordreturn best_word
简单测试一下:
triads_to_try = [('italy', 'italian', 'spain'), ('india', 'delhi', 'japan'), ('man', 'woman', 'boy'), ('small', 'smaller', 'large')]
for triad in triads_to_try:print('{} -> {} <====> {} -> {}'.format(*triad, w2v_utils_pytorch.complete_analogy(*triad, word_to_vec_map)))
italy -> italian <====> spain -> spanish
india -> delhi <====> japan -> tokyo
man -> woman <====> boy -> girl
small -> smaller <====> large -> larger
可以看出,glove词向量处理词类类比任务时效果还是非常好的。
原作业中提到了去除词向量中的偏见属于选学部分,本人还未完全理解,感兴趣的同学可以参考我前言中原博客中的内容。
二、表情生成器V1
表情生成器其实就是情感分类,本质上是多分类问题。在原作业中想要打印表情符号需要安装emoji包,这里我简化一下问题,只针对情感分类任务。
我们首先使用一个简单的前馈神经网络来完成这个分类任务,网络的结构如下:
1.将英文句子进行分词
2.将每个词转换成50维的glove向量,计算得到平均值,作为神经网络的输入
3.经过一层全连接层后,进行softmax操作,得到预测的分类结果
主控模型:
def model(X, Y, word_to_vec_map, learning_rate=0.01, num_iterations=400):np.random.seed(1)m = Y.shape[0]n_y = 5n_h = 50W = np.random.randn(n_y, n_h) / np.sqrt(n_h)b = np.zeros((n_y,))Y_oh = emo_utils.convert_to_one_hot(Y, C=n_y)for epoch in range(num_iterations):for i in range(m):avg = sentence_to_avg(X[i], word_to_vec_map)# 前向传播z = np.dot(W, avg) + ba = emo_utils.softmax(z)# 计算第i个训练的损失cost = -np.sum(Y_oh[i] * np.log(a))# 计算梯度dz = a - Y_oh[i]dW = np.dot(dz.reshape(n_y, 1), avg.reshape(1, n_h))db = dz# 更新参数W = W - learning_rate * dWb = b - learning_rate * dbif epoch % 100 == 0:print("第{epoch}轮,损失为{cost}".format(epoch=epoch, cost=cost))pred = emo_utils.predict(X, Y, W, b, word_to_vec_map)return pred, W, b
计算平均词向量:
def sentence_to_avg(sentence, word_to_vec_map):"""将句子转换为单词列表,提取Glove向量,取平均值:param sentence: 输入的句子:param word_to_vec_map: 词典:return:"""# 将句子拆成单词列表words = sentence.lower().split()# 初始化均值向量avg = np.zeros(50, )for w in words:avg = avg + word_to_vec_map[w]avg = np.divide(avg, len(words))return avg
训练测试模型:
words, word_to_vec_map = w2v_utils_pytorch.read_glove_vecs('data/glove.6B.50d.txt')
pred, W, b = model(X_train, Y_train, word_to_vec_map)
print("=====训练集====")
pred_train = emo_utils.predict(X_train, Y_train, W, b, word_to_vec_map)
print("=====测试集====")
pred_test = emo_utils.predict(X_test, Y_test, W, b, word_to_vec_map)
X_my_sentences = np.array(["i adore you", "i love you", "funny lol", "lets play with a ball", "food is ready", "you are not happy"])
Y_my_labels = np.array([[0], [0], [2], [1], [4], [3]])pred = emo_utils.predict(X_my_sentences, Y_my_labels, W, b, word_to_vec_map)
emo_utils.print_predictions(X_my_sentences, pred)
训练结果如下:
第0轮,损失为1.952049881281007
Accuracy: 0.3484848484848485
第100轮,损失为0.07971818726014794
Accuracy: 0.9318181818181818
第200轮,损失为0.04456369243681379
Accuracy: 0.9545454545454546
第300轮,损失为0.03432267378786059
Accuracy: 0.9696969696969697
=====训练集====
Accuracy: 0.9772727272727273
=====测试集====
Accuracy: 0.8571428571428571i adore you ❤️
i love you ❤️
funny lol
吴恩达深度学习课程第五章第二周编程作业(pytorch实现)相关推荐
- Operations on word vectors-v2 吴恩达老师深度学习课程第五课第二周编程作业1
吴恩达老师深度学习课程第五课(RNN)第二周编程作业1, 包含答案 Operations on word vectors Welcome to your first assignment of thi ...
- 吴恩达深度学习 | (24) 序列模型专项第二周学习笔记
课程视频 吴恩达深度学习专项课程共分为五个部分,本篇博客将介绍第五部分序列模型专项的第二周课程:自然语言处理与词嵌入. 目录 1. 词汇表征 2. 使用词嵌入 3. 词嵌入的特性 4. 嵌入矩阵 5. ...
- 吴恩达深度学习课程第五课笔记——序列模型
文章目录 第五门课 序列模型 (Sequence Models) 第一周 循环序列模型(Recurrent Neural Networks) 1.1 为什么选择序列模型?(Why Sequence M ...
- 360题带你走进深度学习!吴恩达深度学习课程测试题中英对照版发布
吴恩达的深度学习课程(deepLearning.ai)是公认的入门深度学习的宝典,本站将课程的课后测试题进行了翻译,建议初学者学习.所有题目都翻译完毕,适合英文不好的同学学习. 主要翻译者:黄海广 内 ...
- github标星8331+:吴恩达深度学习课程资源(完整笔记、中英文字幕视频、python作业,提供百度云镜像!)...
吴恩达老师的深度学习课程(deeplearning.ai),可以说是深度学习入门的最热门课程,我和志愿者编写了这门课的笔记,并在github开源,star数达到8331+,曾经有相关报道文章.为解决g ...
- 吴恩达深度学习课程笔记之卷积神经网络(2nd week)
0 参考资料 [1] 大大鹏/Bilibili资料 - Gitee.com [2] [中英字幕]吴恩达深度学习课程第四课 - 卷积神经网络_哔哩哔哩_bilibili [3] 深度学习笔记-目录 ...
- 吴恩达深度学习课程的漫画版来了!(漫画、视频、笔记都可以下载了!)
吴恩达深度学习课程,个人认为是对初学者最友好的课程,非常系统.初学者如果希望快速入门,建议从这门课开始.由于是视频课,除了课程笔记之外,可以先看看课程漫画,更有助于理解. 尽管是英文版,但英文水平达到 ...
- 花书+吴恩达深度学习(二五)直面配分函数(CD, SML, SM, RM, NCE)
文章目录 0. 前言 1. 对数似然梯度 1.1 朴素 MCMC 算法 1.2 对比散度算法 CD 1.3 随机最大似然 SML 2. 伪似然 3. 得分匹配 SM 4. 比率匹配 RM 5. 去噪得 ...
- 花书+吴恩达深度学习(十五)序列模型之循环神经网络 RNN
目录 0. 前言 1. RNN 计算图 2. RNN 前向传播 3. RNN 反向传播 4. 导师驱动过程(teacher forcing) 5. 不同序列长度的 RNN 如果这篇文章对你有一点小小的 ...
- 神经网络隐藏层个数怎么确定_含有一个隐藏层的神经网络对平面数据分类python实现(吴恩达深度学习课程1第3周作业)...
含有一个隐藏层的神经网络对平面数据分类python实现(吴恩达深度学习课程1第3周作业): ''' 题目: 建立只有一个隐藏层的神经网络, 对于给定的一个类似于花朵的图案数据, 里面有红色(y=0)和 ...
最新文章
- 几种Linux包管理系统的命令对照
- Android Handler详细使用方法实例
- ETL工具框架开源软件
- hive中创建外部表分区表测试
- java poi 更新excel_在Java Apache POI中更新现有的Excel文件
- 对Spring事务一些问题的讨论
- linux终端模拟器app下载,3C终端模拟器app下载-3C终端模拟器v0.9最新版下载 - 91手游网...
- 【Flink】The class WC is an instance class, meaning it is not a member of a toplevel object
- 为了分析WebRTC, 重学Windows开发
- 文远知行公布自动驾驶运营路线图:全新升级自动驾驶方案,建立500辆规模的自动驾驶车队...
- android 人脸特征提取方法,qs_face_points_android
- 多处理器系统下的伪共享(false sharing)问题
- 集体智慧编程 简介
- 利用 LSTM 神经网络预测股价走势
- 英语四六级听力有线传输无线发射系统方案
- 前端jq实现视频跟图片一起混播
- Android 应用资源(一)
- 关于低版本IE浏览器无法显示图片的问题
- iphone换android手机铃声,在iPhone中换个自定义铃声要11个步骤 正常人受不了
- TouchGFX 中文字体添加(直入正题)
热门文章
- 联通iptv机顶盒中心服务器连接异常,联通iptv机顶盒连接安装 联通iptv机顶盒使用...
- 一些黑苹果四叶草引导常用的kext说明
- 计算机中缺少qt5quick.dll,qt5quick.dll
- QImage setPixel
- 动态规划之背包问题(优化版)
- 植物大战僵尸的java源代码_植物大战僵尸java源码
- Scratch(四十八):植物大战僵尸
- 《码出高效》个人总结1.1 二进制,按位运算
- 浪潮ssr服务器安全加固系统贵吗,浪潮SSR加固服务器安全
- 【小白视角】大数据基础实践(二)Hadoop环境搭建与测试