基于RNN的NLP机器翻译深度学习课程 | 附实战代码
作者 | 小宋是呢
来源 | CSDN博客
深度学习用的有一年多了,最近开始NLP自然处理方面的研发。刚好趁着这个机会写一系列 NLP 机器翻译深度学习实战课程。
本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署,将包括以下内容:(更新ing)
NLP机器翻译深度学习实战课程·零(基础概念)
NLP机器翻译深度学习实战课程·壹(RNN base)
NLP机器翻译深度学习实战课程·贰(RNN+Attention base)
NLP机器翻译深度学习实战课程·叁(CNN base)
NLP机器翻译深度学习实战课程·肆(Self-Attention base)
NLP机器翻译深度学习实战课程·伍(应用部署)
本系列教程参考博客:
https://me.csdn.net/chinatelecom08
开源地址:
https://github.com/xiaosongshine/MNT_RNN_Keras
个人主页:
http://www.yansongsong.cn/
0. 项目背景
在上个文章中,我们已经简单介绍了 NLP 机器翻译,这次我们将用实战的方式讲解基于 RNN 的翻译模型。
0.1 基于 RNN 的 seq2seq 架构翻译模型介绍
seq2seq 结构
基于 RNN 的 seq2seq 架构包含 encoder 和 decoder,decoder 部分又分train 和 inference 两个过程,具体结构如下面两图所示:
可以看出结构很简单(相较于 CNN 与 Attention base ),下面我们就通过代码的形式实现,来进一步探究理解模型内在原理。
1. 数据准备
1.1 下载数据
此网站 http://www.manythings.org/anki/ 上有许多翻译数据,包含多种语言,这里此教程选择的是中文到英语的数据集。
训练下载地址:
http://www.manythings.org/anki/cmn-eng.zip
解压 cmn-eng.zip,可以找到 cmn.txt 文件,内容如下:
# ========读取原始数据========
with open('cmn.txt', 'r', encoding='utf-8') as f: data = f.read()
data = data.split('\n')
data = data[:100]
print(data[-5:])
['Tom died.\t汤姆去世了。', 'Tom quit.\t汤姆不干了。', 'Tom swam.\t汤姆游泳了。', 'Trust me.\t相信我。', 'Try hard.\t努力。']
可以发现,每对翻译数据在同一行,左边是英文,右边是中文使用 \t 作为英语与中文的分界。
1.2 数据预处理
使用网络训练,需要我们把数据处理成网络可以接收的格式。
针对这个数据,具体来说就是需要把字符转换为数字(句子数字化),句子长度归一化处理。
句子数字化
可以参考我的这博客:『深度应用』NLP命名实体识别(NER)开源实战教程(https://blog.csdn.net/xiaosongshine/article/details/99622170),数据预处理的实现。
分别对英语与汉字做处理。
英文处理
因为英语每个单词都是用空格分开的(除了缩写词,这里缩写词当做一个词处理),还有就是标点符号和单词没有分开,也需要特殊处理一下
这里我用的是一个简单方法处理下,实现在标点前加空格:
def split_dot(strs,dots=", . ! ?"): for d in dots.split(" "): #print(d) strs = strs.replace(d," "+d) #print(strs) return(strs)
使用这个方法来把词个字典化:
ef get_eng_dicts(datas): w_all_dict = {} for sample in datas: for token in sample.split(" "): if token not in w_all_dict.keys(): w_all_dict[token] = 1 else: w_all_dict[token] += 1 sort_w_list = sorted(w_all_dict.items(), key=lambda d: d[1], reverse=True) w_keys = [x for x,_ in sort_w_list[:7000-2]] w_keys.insert(0,"<PAD>") w_keys.insert(0,"<UNK>") w_dict = { x:i for i,x in enumerate(w_keys) } i_dict = { i:x for i,x in enumerate(w_keys) } return w_dict,i_dict
中文处理
在处理中文时可以发现,有繁体也有简体,所以最好转换为统一形式:(参考地址:https://www.jianshu.com/p/64fecfad1157)
使用方法,把繁体转换为简体:
import opencc
cc = opencc.OpenCC('t2s')
s = cc.convert('這是什麼啊?')
print(s)
#这是什么啊?
再使用 jieba 分词的方法来从句子中分出词来:
def get_chn_dicts(datas): w_all_dict = {} for sample in datas: for token in jieba.cut(sample): if token not in w_all_dict.keys(): w_all_dict[token] = 1 else: w_all_dict[token] += 1 sort_w_list = sorted(w_all_dict.items(), key=lambda d: d[1], reverse=True) w_keys = [x for x,_ in sort_w_list[:10000-4]] w_keys.insert(0,"<EOS>") w_keys.insert(0,"<GO>") w_keys.insert(0,"<PAD>") w_keys.insert(0,"<UNK>") w_dict = { x:i for i,x in enumerate(w_keys) } i_dict = { i:x for i,x in enumerate(w_keys) } return w_dict,i_dict
下面进行 padding
def get_val(keys,dicts): if keys in dicts.keys(): val = dicts[keys] else: keys = "<UNK>" val = dicts[keys] return(val) def padding(lists,lens=LENS): list_ret = [] for l in lists: while(len(l)<lens): l.append(1) if len(l)>lens: l = l[:lens] list_ret.append(l) return(list_ret)
最后统一运行处理一下:
if __name__ == "__main__": df = read2df("cmn-eng/cmn.txt") eng_dict,id2eng = get_eng_dicts(df["eng"]) chn_dict,id2chn = get_chn_dicts(df["chn"]) print(list(eng_dict.keys())[:20]) print(list(chn_dict.keys())[:20]) enc_in = [[get_val(e,eng_dict) for e in eng.split(" ")] for eng in df["eng"]] dec_in = [[get_val("<GO>",chn_dict)]+[get_val(e,chn_dict) for e in jieba.cut(eng)]+[get_val("<EOS>",chn_dict)] for eng in df["chn"]] dec_out = [[get_val(e,chn_dict) for e in jieba.cut(eng)]+[get_val("<EOS>",chn_dict)] for eng in df["chn"]] enc_in_ar = np.array(padding(enc_in,32)) dec_in_ar = np.array(padding(dec_in,30)) dec_out_ar = np.array(padding(dec_out,30))
输出结果如下:
(TF_GPU) D:\Files\Prjs\Pythons\Kerases\MNT_RNN>C:/Datas/Apps/RJ/Miniconda3/envs/TF_GPU/python.exe d:/Files/Prjs/Pythons/Kerases/MNT_RNN/mian.py
Using TensorFlow backend. eng chn
0 Hi . 嗨。
1 Hi . 你好。
2 Run . 你用跑的。
3 Wait ! 等等!
4 Hello ! 你好。
save csv
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\xiaos\AppData\Local\Temp\jieba.cache
Loading model cost 0.788 seconds.
Prefix dict has been built succesfully.
['<UNK>', '<PAD>', '.', 'I', 'to', 'the', 'you', 'a', '?', 'is', 'Tom', 'He', 'in', 'of', 'me', ',', 'was', 'for', 'have', 'The']
['<UNK>', '<PAD>', '<GO>', '<EOS>', '。', '我', '的', '了', '你', '他', '?', '在', '汤姆', '是', '她', '吗', '我们', ',', '不', '很']
2. 构建模型与训练
2.1 构建模型与超参数
用的是双层 LSTM 网络
# =======预定义模型参数========
EN_VOCAB_SIZE = 7000
CH_VOCAB_SIZE = 10000
HIDDEN_SIZE = 256 LEARNING_RATE = 0.001
BATCH_SIZE = 50
EPOCHS = 100 # ======================================keras model==================================
from keras.models import Model
from keras.layers import Input, LSTM, Dense, Embedding,CuDNNLSTM
from keras.optimizers import Adam
import numpy as np def get_model(): # ==============encoder============= encoder_inputs = Input(shape=(None,)) emb_inp = Embedding(output_dim=128, input_dim=EN_VOCAB_SIZE)(encoder_inputs) encoder_h1, encoder_state_h1, encoder_state_c1 = CuDNNLSTM(HIDDEN_SIZE, return_sequences=True, return_state=True)(emb_inp) encoder_h2, encoder_state_h2, encoder_state_c2 = CuDNNLSTM(HIDDEN_SIZE, return_state=True)(encoder_h1) # ==============decoder============= decoder_inputs = Input(shape=(None,)) emb_target = Embedding(output_dim=128, input_dim=CH_VOCAB_SIZE)(decoder_inputs) lstm1 = CuDNNLSTM(HIDDEN_SIZE, return_sequences=True, return_state=True) lstm2 = CuDNNLSTM(HIDDEN_SIZE, return_sequences=True, return_state=True) decoder_dense = Dense(CH_VOCAB_SIZE, activation='softmax') decoder_h1, _, _ = lstm1(emb_target, initial_state=[encoder_state_h1, encoder_state_c1]) decoder_h2, _, _ = lstm2(decoder_h1, initial_state=[encoder_state_h2, encoder_state_c2]) decoder_outputs = decoder_dense(decoder_h2) model = Model([encoder_inputs, decoder_inputs], decoder_outputs) # encoder模型和训练相同 encoder_model = Model(encoder_inputs, [encoder_state_h1, encoder_state_c1, encoder_state_h2, encoder_state_c2]) # 预测模型中的decoder的初始化状态需要传入新的状态 decoder_state_input_h1 = Input(shape=(HIDDEN_SIZE,)) decoder_state_input_c1 = Input(shape=(HIDDEN_SIZE,)) decoder_state_input_h2 = Input(shape=(HIDDEN_SIZE,)) decoder_state_input_c2 = Input(shape=(HIDDEN_SIZE,)) # 使用传入的值来初始化当前模型的输入状态 decoder_h1, state_h1, state_c1 = lstm1(emb_target, initial_state=[decoder_state_input_h1, decoder_state_input_c1]) decoder_h2, state_h2, state_c2 = lstm2(decoder_h1, initial_state=[decoder_state_input_h2, decoder_state_input_c2]) decoder_outputs = decoder_dense(decoder_h2) decoder_model = Model([decoder_inputs, decoder_state_input_h1, decoder_state_input_c1, decoder_state_input_h2, decoder_state_input_c2], [decoder_outputs, state_h1, state_c1, state_h2, state_c2]) return(model,encoder_model,decoder_model)
2.2 模型配置与训练
自定义了一个 acc,便于显示效果,keras 内置的 acc 无法使用
import keras.backend as K
from keras.models import load_model def my_acc(y_true, y_pred): acc = K.cast(K.equal(K.max(y_true,axis=-1),K.cast(K.argmax(y_pred,axis=-1),K.floatx())),K.floatx()) return acc Train = True if __name__ == "__main__": df = read2df("cmn-eng/cmn.txt") eng_dict,id2eng = get_eng_dicts(df["eng"]) chn_dict,id2chn = get_chn_dicts(df["chn"]) print(list(eng_dict.keys())[:20]) print(list(chn_dict.keys())[:20]) enc_in = [[get_val(e,eng_dict) for e in eng.split(" ")] for eng in df["eng"]] dec_in = [[get_val("<GO>",chn_dict)]+[get_val(e,chn_dict) for e in jieba.cut(eng)]+[get_val("<EOS>",chn_dict)] for eng in df["chn"]] dec_out = [[get_val(e,chn_dict) for e in jieba.cut(eng)]+[get_val("<EOS>",chn_dict)] for eng in df["chn"]] enc_in_ar = np.array(padding(enc_in,32)) dec_in_ar = np.array(padding(dec_in,30)) dec_out_ar = np.array(padding(dec_out,30)) #dec_out_ar = covt2oh(dec_out_ar) if Train: model,encoder_model,decoder_model = get_model() model.load_weights('e2c1.h5') opt = Adam(lr=LEARNING_RATE, beta_1=0.9, beta_2=0.99, epsilon=1e-08) model.compile(optimizer=opt, loss='sparse_categorical_crossentropy',metrics=[my_acc]) model.summary() print(dec_out_ar.shape) model.fit([enc_in_ar, dec_in_ar], np.expand_dims(dec_out_ar,-1), batch_size=50, epochs=64, initial_epoch=0, validation_split=0.1) model.save('e2c1.h5') encoder_model.save("enc1.h5") decoder_model.save("dec1.h5")
64Epoch 训练结果如下:
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) (None, None) 0
__________________________________________________________________________________________________
input_2 (InputLayer) (None, None) 0
__________________________________________________________________________________________________
embedding_1 (Embedding) (None, None, 128) 896000 input_1[0][0]
__________________________________________________________________________________________________
embedding_2 (Embedding) (None, None, 128) 1280000 input_2[0][0]
__________________________________________________________________________________________________
cu_dnnlstm_1 (CuDNNLSTM) [(None, None, 256), 395264 embedding_1[0][0]
__________________________________________________________________________________________________
cu_dnnlstm_3 (CuDNNLSTM) [(None, None, 256), 395264 embedding_2[0][0] cu_dnnlstm_1[0][1] cu_dnnlstm_1[0][2]
__________________________________________________________________________________________________
cu_dnnlstm_2 (CuDNNLSTM) [(None, 256), (None, 526336 cu_dnnlstm_1[0][0]
__________________________________________________________________________________________________
cu_dnnlstm_4 (CuDNNLSTM) [(None, None, 256), 526336 cu_dnnlstm_3[0][0] cu_dnnlstm_2[0][1] cu_dnnlstm_2[0][2]
__________________________________________________________________________________________________
dense_1 (Dense) (None, None, 10000) 2570000 cu_dnnlstm_4[0][0]
==================================================================================================
Non-trainable params: 0
__________________________________________________________________________________________________
...
...
19004/19004 [==============================] - 98s 5ms/step - loss: 0.1371 - my_acc: 0.9832 - val_loss: 2.7299 - val_my_acc: 0.7412
Epoch 58/64
19004/19004 [==============================] - 96s 5ms/step - loss: 0.1234 - my_acc: 0.9851 - val_loss: 2.7378 - val_my_acc: 0.7410
Epoch 59/64
19004/19004 [==============================] - 96s 5ms/step - loss: 0.1132 - my_acc: 0.9867 - val_loss: 2.7477 - val_my_acc: 0.7419
Epoch 60/64
19004/19004 [==============================] - 96s 5ms/step - loss: 0.1050 - my_acc: 0.9879 - val_loss: 2.7660 - val_my_acc: 0.7426
Epoch 61/64
19004/19004 [==============================] - 96s 5ms/step - loss: 0.0983 - my_acc: 0.9893 - val_loss: 2.7569 - val_my_acc: 0.7408
Epoch 62/64
19004/19004 [==============================] - 96s 5ms/step - loss: 0.0933 - my_acc: 0.9903 - val_loss: 2.7775 - val_my_acc: 0.7414
Epoch 63/64
19004/19004 [==============================] - 96s 5ms/step - loss: 0.0885 - my_acc: 0.9911 - val_loss: 2.7885 - val_my_acc: 0.7420
Epoch 64/64
19004/19004 [==============================] - 96s 5ms/step - loss: 0.0845 - my_acc: 0.9920 - val_loss: 2.7914 - val_my_acc: 0.7423
3. 模型应用与预测
从训练集选取部分数据进行测试
Train = False if __name__ == "__main__": df = read2df("cmn-eng/cmn.txt") eng_dict,id2eng = get_eng_dicts(df["eng"]) chn_dict,id2chn = get_chn_dicts(df["chn"]) print(list(eng_dict.keys())[:20]) print(list(chn_dict.keys())[:20]) enc_in = [[get_val(e,eng_dict) for e in eng.split(" ")] for eng in df["eng"]] dec_in = [[get_val("<GO>",chn_dict)]+[get_val(e,chn_dict) for e in jieba.cut(eng)]+[get_val("<EOS>",chn_dict)] for eng in df["chn"]] dec_out = [[get_val(e,chn_dict) for e in jieba.cut(eng)]+[get_val("<EOS>",chn_dict)] for eng in df["chn"]] enc_in_ar = np.array(padding(enc_in,32)) dec_in_ar = np.array(padding(dec_in,30)) dec_out_ar = np.array(padding(dec_out,30)) #dec_out_ar = covt2oh(dec_out_ar) if Train: pass else: encoder_model,decoder_model = load_model("enc1.h5",custom_objects={"my_acc":my_acc}),load_model("dec1.h5",custom_objects={"my_acc":my_acc}) for k in range(16000-20,16000): test_data = enc_in_ar[k:k+1] h1, c1, h2, c2 = encoder_model.predict(test_data) target_seq = np.zeros((1,1)) outputs = [] target_seq[0, len(outputs)] = chn_dict["<GO>"] while True: output_tokens, h1, c1, h2, c2 = decoder_model.predict([target_seq, h1, c1, h2, c2]) sampled_token_index = np.argmax(output_tokens[0, -1, :]) #print(sampled_token_index) outputs.append(sampled_token_index) #target_seq = np.zeros((1, 30)) target_seq[0, 0] = sampled_token_index #print(target_seq) if sampled_token_index == chn_dict["<EOS>"] or len(outputs) > 28: break print("> "+df["eng"][k]) print("< "+' '.join([id2chn[i] for i in outputs[:-1]])) print()
测试结果如下:基本上都翻译正确了。
> I can understand you to some extent .
< 在 某种程度 上 我 能 了解 你 。 > I can't recall the last time we met .
< 我 想不起来 我们 上次 见面 的 情况 了 。 > I can't remember which is my racket .
< 我 不 记得 哪个 是 我 的 球拍 。 > I can't stand that noise any longer .
< 我 不能 再 忍受 那 噪音 了 。 > I can't stand this noise any longer .
< 我 无法 再 忍受 这个 噪音 了 。 > I caught the man stealing the money .
< 我 抓 到 了 这个 男人 正在 偷钱 。 > I could not afford to buy a bicycle .
< 我 买不起 自行车 。 > I couldn't answer all the questions .
< 我 不能 回答 所有 的 问题 。 > I couldn't think of anything to say .
< 我 想不到 要说 什么 话 。 > I cry every time I watch this movie .
< 我 每次 看 这部 电影 都 会 哭 。 > I did not participate in the dialog .
< 我 没有 参与 对话 。 > I didn't really feel like going out .
< 我 不是 很想 出去 。 > I don't care a bit about the future .
< 我 不在乎 将来 。
原文链接:
https://blog.csdn.net/xiaosongshine/article/details/99843848?utm_source=app
(*本文为 AI科技大本营转载文章,转载请联系作者)
◆
福利时刻
◆
入群参与每周抽奖~
扫码添加小助手,回复:大会,加入福利群,参与抽奖送礼!
AI ProCon 2019 邀请到了亚马逊首席科学家@李沐,在大会的前一天(9.5)亲授「深度学习实训营」,通过动手实操,帮助开发者全面了解深度学习的基础知识和开发技巧。还有 9大技术论坛、60+主题分享,百余家企业、千余名开发者共同相约 2019 AI ProCon!距离5折优惠票结束还有 3 天!
推荐阅读
大咖云集、精彩议题、独家内容,2019 AI ProCon震撼来袭!(日程出炉)
无需成对示例、无监督训练,CycleGAN生成图像简直不要太简单
从不温不火到炙手可热:语音识别技术简史
分析CVPR 2019论文关键词,我看到了计算机视觉的最新趋势 | 附代码
入门大爆炸式发展的深度学习,你先要了解这6个著名框架
用Python的算法工程师们,编码问题搞透彻了吗?
Python冷知识,不一样的技巧带给你不一样的乐趣
我是如何通过开源项目月入 10 万的?
撬动百亿台设备,让物联网“造”起来!
程序员离无人值班有多远?
你点的每个“在看”,我都认真当成了喜欢
相关文章:

trash-cli设置Linux 回收站
trash-cli 设置 Linux 回收站 trash-cli是一个使用 python 开发的软件包,包含 trash-put、restore-trash、trash-list、trash-empty、trash-rm等命令,我们可以通过这条命令,将文件移动到回收站,或者还原删除了的文件。 trash-cli的…

磁盘有时也不可靠
实验服务器的磁盘是最近买的,当卖家问我要普通的还是高级的, 我选择了普通,现在追悔莫及。今天的分析更加详细。首先发现每次实验,出错的文件都不一样,所以应该不是临界条件的问题。下表总结了出错的位置,原…

从原理到落地,七大维度详解矩阵分解推荐算法
作者 | gongyouliu编辑丨Zandy来源 | 大数据与人工智能 ( ID: ai-big-data)导语:作者在《协同过滤推荐算法》这篇文章中介绍了 user-based 和 item-based 协同过滤算法,这类协同过滤算法是基于邻域的算法(也称为基于内存的协同过…

libyuv库的使用
libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的,可在Windows、Linux、Mac、Android等操作系统,x86、x64、arm架构上进行编译运行,支持SSE、AVX、NEON等SIMD指令加速。下面说一下libyuv在Windows7VS2013 x6…

封装 vue 组件的过程记录
在我们使用vue的开发过程中总会遇到这样的场景,封装自己的业务组件。 封装页面组件前要考虑几个问题:1、该业务组件的使用场景 2、在什么条件下展示一些什么数据,数据类型是什么样的,及长度颜色等 3、如果是通用的内容,…
Service的基本组成
Service与Activity的最大区别就是一有界面,一个没有界面。 如果某些程序操作很消耗时间,那么可以将这些程序定义在Service之中,这样就可以完成程序的后台运行, 其实Service就是一个没有界面的Activity,执行跨进程访问也…
BP神经网络公式推导及实现(MNIST)
BP神经网络的基础介绍见:http://blog.csdn.net/fengbingchun/article/details/50274471,这里主要以公式推导为主。BP神经网络又称为误差反向传播网络,其结构如下图。这种网络实质是一种前向无反馈网络,具有结构清晰、易实现、计算…
AI应用落地哪家强?CSDN AI Top 30+案例评选等你来秀!
人工智能历经百年发展,如今迎来发展的黄金时期。目前,AI 技术已涵盖自然语言处理、模式识别、图像识别、数据挖掘、机器学习等领域的研究,在汽车、金融、教育、医疗、安防、零售、家居、文娱、工业等行业获得了令人印象深刻的成果。 在各行业…
安利Mastodon:属于未来的社交网络
我为Mastodon开发了一款安卓客户端,v1.0版本已经发布,欢迎下载使用 源码在这里:https://github.com/shuiRong/Gakki ??? 正文 Mastodon(长毛象)是什么? 是一个免费开源、去中心化、分布式的微博客社交网络,是微博、…

通过案例练习掌握SSH 的整合
1. SSH整合_方案01 ** 整合方案01 Struts2框架 Spring框架 在Spring框架中整合了Hibernate(JDBC亦可) 一些业务组件(Service组件)也可以放入Spring框架中迚行管理(昨天的例子) 1. 请求࿰…
tiny-cnn开源库的使用(MNIST)
tiny-cnn是一个基于CNN的开源库,它的License是BSD 3-Clause。作者也一直在维护更新,对进一步掌握CNN很有帮助,因此下面介绍下tiny-cnn在windows7 64bit vs2013的编译及使用。 1. 从https://github.com/nyanp/tiny-cnn下载源码࿱…

玩嗨的2亿快手“老铁”和幕后的极致视觉算法
作者 | Just出品 | AI科技大本营(ID:rgznai100)创立八年,短视频平台快手目前已经有超过两亿人在每天登陆使用,每天还有超过 1500 万条短视频被制作和上传,每天的累计观看数更是达到 150 亿。拥有如此庞大的用户数&…
lsmod命令详解
基础命令学习目录首页 原文链接:http://blog.sina.com.cn/s/blog_e6b2465d0101fuev.html lsmod——显示已载入系统的模块 lsmod 其实就是list modules的缩写,即 列出所有模块. 功能说明:显示已载入系统的模块。 语法:lsmod 说明&a…

javascript模块化、模块加载器初探
最常见网站的javascript架构可能是这样的: 一个底层框架文件,如jQuery一个网站业务框架文件,包含整站公用业务模块类(如弹框、ajax封装等)多个业务文件,包含每个具体页面有关系的业务代码为了减少一个HTTP请求,我们可能…

tiny-cnn执行过程分析(MNIST)
在http://blog.csdn.net/fengbingchun/article/details/50573841中以MNIST为例对tiny-cnn的使用进行了介绍,下面对其执行过程进行分析:支持两种损失函数:(1)、mean squared error(均方差);(2)、cross entropy(交叉熵)。在MNIST中使…

关于element的select多选选择器,数据回显的问题
关于element的select多选,数据回显的问题 在工作中遇到这样一个问题,新建表单时用element的select多选以后,在编辑的时候打开表单发现其他数据能正常显示,多选却无法正常回显。在网上找了很多后,终于解决了这个问题&am…

360金融发布Q2财报:净利6.92亿,同比增长114%,大数据与AI加持的科技服务是新亮点?
8月23日,360金融发布未经审计的2019年第二季度业绩报告。财务数据显示,2019年第二季度,360金融实现收入22.27亿元人民币,较2018年二季度9.79亿元增长128%;净利润为6.18亿元,而去年同期为净亏损1.42亿元&…

SPRING3.X JSON 406 和 中文乱码问题
2019独角兽企业重金招聘Python工程师标准>>> 简要 最近使用Spring3.2.3 版本 在使用 JSON message convertion 的时候,老是出现406 返回类型不匹配的问题,去网上google 了一番 也没有一个明确的说法,只能自己去调试。 Maven 依…
VLFeat开源库介绍及在VS2013中的编译
VLFeat是一个开源的计算机视觉算法库,内容主要包括feature detectors、feature extractors、k-means clustering、randomized kd-tree matching、super-pixelization。它是跨平台的,能够应用在Linux、Mac、Windows平台。它的License是BSD。 在VS2013中编…

人工智能写手,好用吗?
作者 | 王树义来源 | 玉树芝兰(ID:nkwangshuyi)1、印象之前给学生上课的时候,我介绍过利用循环神经网络,仿照作家风格进行创作的机器学习模型。不过,那模型写出来的东西嘛……我的评价是:望之&a…
表单系列之input number总结
各浏览器表现 <input type"number" /> chrome 除数字字符,只可输入e和.IE 除数字字符,其他字符均可输入,无报错Firefox 除数字字符,其他字符均可输入,但会报错移除箭头 //谷歌去除箭头 input::-webki…

Android中Service深入学习
概述 1、当用户在与当前应用程序不同的应用程序时,Service可以继续在后台运行。 2、Service可以让其他组件绑定,以便和它交互并进行进程间通信。 3、Service默认运行在创建它的应用程序的主线程中。 Service的使用主要是因为应用程序里面可能需要长时间地…
卷积神经网络(CNN)的简单实现(MNIST)
卷积神经网络(CNN)的基础介绍见http://blog.csdn.net/fengbingchun/article/details/50529500,这里主要以代码实现为主。CNN是一个多层的神经网络,每层由多个二维平面组成,而每个平面由多个独立神经元组成。以MNIST作为数据库,仿照…

Tensorflow源码解析5 -- 图的边 - Tensor
1 概述 前文两篇文章分别讲解了TensorFlow核心对象Graph,和Graph的节点Operation。Graph另外一大成员,即为其边Tensor。边用来表示计算的数据,它经过上游节点计算后得到,然后传递给下游节点进行运算。本文讲解Graph的边Tensor&…

物联网成网络安全防护新重点!
在昨天的 2019 北京网络安全大会上,工信部负责人表示,我国面向 5G 和车联网将建设网安防护体系,提升监测预警和应急响应能力。其中物联网设备已成为网安防护新重点。为什么工信部会这么重视物联网?物联网开发者的现状又是如何呢&a…

【分享】Java的几个重要词语
Java 是一种解释型语言,由SUN公司开发,基本上属于一个完全面向对象的语言,并且语言的设计仍然以简捷为重点。初学Java肯定会被一些名词给弄晕了,现在集中几个解释一下下。1、JVMJVM是Java Virtual Machine(Java虚拟机)的缩写&…
64位Ubuntu上编译32位程序操作步骤
1. 确认主机为64位架构的内核,应该输出为adm64,执行:$ dpkg --print-architecture2. 确认打开了多架构支持功能,应该输出为i386,执行:$ dpkg --print-foreign-architectures如果没有,…

分布式事务中间件 Fescar—RM 模块源码解读
2019独角兽企业重金招聘Python工程师标准>>> 前言 在SOA、微服务架构流行的年代,许多复杂业务上需要支持多资源占用场景,而在分布式系统中因为某个资源不足而导致其它资源占用回滚的系统设计一直是个难点。我所在的团队也遇到了这个问题&…

二维码检测哪家强?五大开源库测评比较
作者 | 周强来源 | 我爱计算机视觉(ID:aicvml)二维码已经进入人们的日常生活中,尤其是日本Denso Wave公司1994年发明的QR码,由于其易于检测、写入信息量大、提供强大的纠错机制,应用最为广泛,可…

linux 内核 出错-HP 方案
2019独角兽企业重金招聘Python工程师标准>>> SUPPORT COMMUNICATION - CUSTOMER ADVISORY Document ID: c03456595 Version: 1 Advisory: Red Hat Enterprise Linux 6 - "P4-Clockmod: Warning: EST-Capable CPU Detected" Messages Logged in /var/log…