代码补全快餐教程(1) - 30行代码见证奇迹

下面是我用30多行代码,包含了很多空行和注释的代码写成的代码补全模型。我们先看看效果吧。

补全效果案例

先来看个比较普通的(Python, Keras)

已知:

y_train = keras.utils.to_categorical(y_train, num_classes)\ny_test = keras.

补全之后是这样的:

y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

算法能够知道把括号中的y_train换成y_test

再看一个把我感动哭了的(Typescript, vscode)

输入如下:

text = "let disposable_begin_buffer = vscode.commands.registerCommand('extension.littleemacs.beginningOfBuffer',\nmove.beginningOfBuffer);\nlet disposable_end_buffer = vscode.commands."

输出是这样的:

let disposable_begin_buffer = vscode.commands.registerCommand('extension.littleemacs.beginningOfBuffer',move.beginningOfBuffer);
let disposable_end_buffer = vscode.commands.registerCommand('extension.littleemacs.endendOfBuffer',move.endendOfBuffer);

请注间这其中的难度,变量定义中用的是begin,而extension和move中用的都是beginning,算法能将其换成endend而保持OfBuffer不变。

函数的补全(Java)

输入如下:

public class Issue {\nprivate Long id;\nprivate String filename;\nprivate Long lineNum;\nprivate String issueString;\npublic Long getId() {

输出如下:

public class Issue {private Long id;
private String filename;
private Long lineNum;
private String issueString;
public Long getId() { return id; }

对于IntellJ IDEA来说这不算什么,但是对于完全不懂Java语言的文本模型,隔着几行其它变量能把return id给补全出来还是很了不起的

能看懂循环(Java, Android)

题目取自Android源代码:final int N = a.getIndexCount();\nfor (int i = 0; i < N; i++) {\nint index = a.

补全结果如下:

final int N = a.getIndexCount();
for (int i = 0; i < N; i++) {int attr = a.getAttribute(i);

从上下文看,鬼知道a是个啥类型,但是这个模型可以根据变量attr猜出来getAttribute。

话说我的attr想用a.getIndex获取怎么办?不用重新训练了,给模型写个例子就好了:

输入如下:

int attr = a.getIndex(i);\nfor (int i = 0; i < N; i++) {\nint attr = a.

补全的结果就是这样了:

int attr = a.getIndex(i);
for (int i = 0; i < N; i++) {int attr = a.getIndex(i);

还会给变量名做加法!(Python, Keras)

输入如下:

tower_1 = Conv2D(64, (1, 1), padding='same', activation='relu')(input_img)\ntower_1 = Conv2D(

见证奇迹的时刻到了:

tower_1 = Conv2D(64, (1, 1), padding='same', activation='relu')(input_img) tower_2 = Conv2D(64

也就是补完tower_1之后,算法不过瘾开始命名了一个tower_2继续补!
这对卷积一写好多层太方便了有没有?

这个加法对于变量名管用,对于下标变量也有效。
我们再来看个例子:

x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)

不管是用y_train还是x_test做补全时,shape后面的[0]就会被加1变成[1],在这里是不适用的,补完了需要手工补一下。

多语言支持 (common lisp)

为了证明不是针对Java和Python做的特殊优化,我们来个lisp的例子看下:

text = '(progn (setq a (func1 0)) (setq b'

输出如下:

(progn (setq a (func1 0)) (setq b (func2 0)) (setq c (func3 0)) (setq d (func4 0))

不但知道func1加1变func2,setq的变量,也从b变成c,d以此类推。

30行代码创造奇迹

上面这样神奇的功能,我们借助最新的神经网络自然处理的工具,只有30多行代码就可以搞定:

import torch
from transformers import GPT2Tokenizer, GPT2LMHeadModel# 加载词汇表
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')# 输入待补全的文本
text = 'int idx = a.getIndex(i);\nfor (int i = 0; i < N; i++) {\nint attr = a.'
predicted_text = text# 加载模型中预训练好的权值
model = GPT2LMHeadModel.from_pretrained('gpt2')# 每一个只能补一个token出来,补一句话需要多次,30次是我拍脑袋的
for i in range(0,30):# 以上次预测结果作为本次的输入,所谓的自回归indexed_tokens = tokenizer.encode(predicted_text)# 将读出的索引标记转化成PyTorch向量tokens_tensor = torch.tensor([indexed_tokens])# 设置为eval模式,这样就不会执行训练模式下的Dropout过程model.eval()# 使用GPU进行加速,诚实地讲速度不太快tokens_tensor = tokens_tensor.to('cuda')model.to('cuda')# 进行推理with torch.no_grad():outputs = model(tokens_tensor)predictions = outputs[0]# 获取预测的下一个子词predicted_index = torch.argmax(predictions[0, -1, :]).item()# 解码成我们都读懂的文本predicted_text = tokenizer.decode(indexed_tokens + [predicted_index])# 打印输入结果print(predicted_text)

用来自动写作

其实,上面所用的gpt-2模型,并不是给代码补全用的,用来自动写点的东西到时它的本业。

比如大家可以试试,给“To be or not to be"补全下,我的结果如下“To be or not to be, the only thing that matters is that you’re a good person.”
再比如“I have a dream that one day”,我的结果如下“I have a dream that one day I will be able to live in a world where I can be a part of something bigger than myself.”

如果不想写代码的话,可以直接在https://transformer.huggingface.co/doc/gpt2-large中去直接试验。
如下图所示,写代码写文字都可以:

安装环境

如果想试用上面的代码的话,只需要安装transformers库就好了。

pip install transformers

另外,transformers库依赖PyTorch或Tensorflow之一,我们上面的代码是基于PyTorch的,还需要安装一下PyTorch:

pip3 install torch torchvision

在Windows下安装命令稍有不同,需要指定版本号,例:

pip3 install torch===1.3.0 torchvision===0.4.1 -f https://download.pytorch.org/whl/torch_stable.html

代码补全快餐教程(1) - 30行代码见证奇迹相关推荐

  1. Tensorflow快餐教程(1) - 30行代码搞定手写识别

    摘要: Tensorflow入门教程1 去年买了几本讲tensorflow的书,结果今年看的时候发现有些样例代码所用的API已经过时了.看来自己维护一个保持更新的Tensorflow的教程还是有意义的 ...

  2. 正在启动python的代码补全客户端_Python交互模式下代码自动补全

    这个功能是以lib的形式提供的,配置写到home下的.pythonrc文件中, 并设置好环境变量让python启动时执行初始化: # ~/.pythonrc # enable syntax compl ...

  3. 太厉害了!30行代码抓取上万个小姐姐跳舞视频,有点飘了~

    点上方"菜鸟学Python",选择"星标" 第481篇原创干货,第一时间送达 大家好,我是菜鸟哥!这个我第481篇原创! 今天又给大家带来一个有趣的Python ...

  4. dev c++ 代码补全_学习干货——玩转DEV—C++

    DEV-C++使用指南 学习干货 <玩转DEV-C++> Design:常政华  2019 · 10 · 5  - 前言 - 工欲善其事必先利其器,更加了解我们的开发工具有利于提高开发效率 ...

  5. vscode插件快餐教程(5) - 代码补全

    vscode插件快餐教程(5) - 代码补全 上节我们介绍了lsp的基本框架和协议的三次握手. 下面我们先学习一个最简单的功能协议:给vscode发送一条通知. LSP窗口消息 在LSP协议中,跟窗口 ...

  6. 30行代码,带你分分钟创建神经网络!(附工具教程)

    来源:大数据文摘 作者:Per Haiald Borgen 本文长度为1612字,建议阅读3分钟 本文为你介绍如何使用Synaptic.js创建和训练神经网络. 本文含大量代码,如需原文请从文末来源链 ...

  7. IDL 文本编码、代码补全快捷方式、IDL doc、格式器、行号显示设置

    目录 1. 文本文件编码设置 2. 自动补全设置 3. IDL doc设置 4. 格式器设置 5. 显示行号 每种编程语言的某些设置(快捷键.显示风格)都大相径庭,因此需要需要对一些显示,使得更符合自 ...

  8. Vim代码补全插件:YouCompleteMe

    Vim的代码补全一般有两种实现方案: 1. 第一种是采用ctags + OmniCppComplete ,参考:http://blog.chinaunix.net/uid-20737871-id-34 ...

  9. Python程序员30行代码素描表白!网友:花里胡哨

    总有人说程序员不够浪漫!其实我们只是没时间而已,等我们有时间了,还有普通人什么事儿?最近就有一个小伙伴上热搜了! 原来他用Python给可爱的女朋友画了一幅素描!不到30行代码,一起来学学给她一个惊喜 ...

最新文章

  1. 蝉联IDC机器学习平台市场No.1 第四范式市场领先优势持续扩大
  2. NRF24L01跳频抗信道干扰功能探讨
  3. Win10(UEFI启动)安装Ubuntu18.04双系统
  4. Visio 2007中进行数据库建模时如何显示字段类型以及概念名称
  5. 程序中变量分布的区域总结 堆 栈 字符常量区 全局数据区 静态存储区
  6. java随机数函数生成指定区间的,意外的惊喜
  7. 安装Docker,配置阿里云加速和 docker-compose 国内镜像
  8. EasyExcel 并发读取文件字段并进行校验,数据写入到新文件,批量插入数据到数据库
  9. 互联网协议 — ECMP 等价多路径路由
  10. html2canvas ios 15.0截屏 变黑 页面刷新
  11. [小白slam攻略]ROVIO安装运行及保存轨迹用evo评估
  12. echarts大数据多图表绘制卡顿解决方案
  13. 国外问卷调查该怎么做?入门须知!
  14. 中国人工智能最高奖,颁给了这些人
  15. 25-方向传感器实现指南针
  16. 煤炭销售系统的设计与实现
  17. 正反馈、负反馈、电容器偶合、直偶、偏置
  18. etl mysql报错_etl工具
  19. 此程序将从您的计算机删除adobe,电脑中安装Adobe软件时提示该程序已安装的最佳解决方案...
  20. 什么是iBeacon

热门文章

  1. 【爱吃肉的阿C】使用URL类将文件下载到本地
  2. JavaScipt基础(持续更新)
  3. 中秋测试大礼包来了,送一个测试流量app~
  4. 三问新能源车险:亲自下场卖保险,意欲何为?
  5. 零基础学Arcgis系列教程
  6. 带登录页面的猜数字小游戏
  7. python开发html_Python开发——16.HTML
  8. 报时功能_厦门宝藏 | 海关大钟悠扬的鸣曲报时,承载着老厦门人无数的记忆!...
  9. matlab相关,来自一个初学者的收藏
  10. css3绘制十字架,纯css画十字架 8.21