首页 文章 精选 留言 我的

精选列表

搜索[语义建模],共10000篇文章
优秀的个人博客,低调大师

Nature | AlphaFold3接触建模实现精准DNA碱基编辑

DNA碱基编辑技术能够在不引入DNA双链断裂的情况下实现单碱基精确修饰,是当前基因治疗和遗传疾病研究的重要工具。然而,脱靶编辑始终限制着其进一步应用。传统提高编辑器特异性的策略主要依赖结构经验设计或定向进化,不仅研发周期长,而且往往面临编辑活性与编辑精度难以兼顾的问题。研究人员提出了一种基于AlphaFold3的新型人工智能框架——ContactSeek,通过分析AlphaFold3预测得到的蛋白质—DNA—RNA复合物接触概率(Contact Probability,CP),寻找决定脱靶识别的关键接触区域及关键氨基酸,从而指导高精度碱基编辑器设计。研究首先建立了全新的dI-profiling测序方法,对腺嘌呤碱基编辑器(ABE)的全基因组脱靶位点进行系统检测,再将这些真实脱靶序列输入AlphaFold3进行预测。结果发现,相较于传统三维结构预测,接触概率能够更加敏感地反映靶点与脱靶之间微小但重要的相互作用差异。基于这一特点,ContactSeek成功筛选出多个决定编辑特异性的关键残基,并构建出兼具高活性和极低脱靶效应的新型ABE和CBE编辑器,展示了人工智能辅助精准基因编辑的新范式。

优秀的个人博客,低调大师

ERD Online 4.0.4 发布,元数据在线建模(免费、私有部署)

❝ fix(erd): 修改表名、模块名自定义提示 fix(erd): 支持自定义表名显示格式 fix(erd): 升级ant到5.0.1版本 fix(erd): 修复PDMan导入类型列为空 fix(erd): 增加类型列宽度,避免类型显示不全 fix(erd): 修复表设计报undefine异常 fix(erd): 修复版本比对,出现杂乱sql fix(erd): 修复表字段使用了数据库关键字导致不能执行 fix(erd): 修复同步数据源,获取的sql脚本不正确 fix(erd): 修复数据库逆向解析的模块,修改结构导致表清空 fix(erd): 修复无法重建基线bug,修复初始化基线sql脚本不一致问题 fix(erd): 修复模板编辑页光标会随着输入消失 fix(erd): 修改默认字段为小写 fix(erd): 增加本地启动环境变量 ❞ 变化一览 表名显示支持自定义,可以显示英文+中文 修复模板渲染bug 修复版本变更信息不准确 版本列表 版本比对 交流渠道 官方论坛:https://www.zerocode.net.cn/ ERD Online文档:https://portal.zerocode.net.cn/ ERD Online体验:https://erd.zerocode.net.cn/ 低代码LOCO体验:https://loco.zerocode.net.cn/

优秀的个人博客,低调大师

每日一博 | 使用 ML 和 DNN 建模的技巧总结

每个人都可以轻松地将数据放入任何模型机器学习或深度学习框架中。但是遵循最佳实践技巧可能有助于提升工作效率。以下是常见的一些方法。 本文内容 数据预处理 处理原始数据 使用张量 数据扩充 数据采样 模型训练 存储中间状态 虚拟周期 简化原则 定位问题 调试 定位问题 使用评价模型 数据转换 欠拟合 过拟合 生产 元数据关联 切换到推理模型 缩放成本 无状态模式 批处理 使用C++ 数据预处理(Data Preparation) 处理原始数据(Process Your Own Data) 因为消费者可能不知道开展数据处理和特征工程,所以数据分析师需要在模型内进行数据预处理。 以文本分类问题为例,使用BERT进行分类。数据分析师不能要求客户进行标记处理和特征整理。 以回归问题为例,时间是特征之一。在初始模型中,数据分析师只能使用星期几(如星期四)作为特征。经过几次迭代之后,星期几不再是一个好的特征因素,数据分析师只想使用日期(如31号)作为特征。而客户可能只提供了星期几的信息,而没有具体日期的信息,因此需要进行数据预处理。 以语音识别为例,消费者只能向数据分析师发送音频,而不能发送诸如Mel Cepstral Coefficient(MFCC)等经典特征数据。 因此,建议在代码中嵌入数据预处理,而不是要求客户机进行预处理。 使用张量(Use Tensor) 张量是一个N维数组,用于多维计算。它比使用Python字典或数组要快,深度学习框架(例如PyTorch或TensorFlow)的对象数据格式是tensor。 数据扩充(Data Augmentation) 缺少标记数据是从业者通常面临的挑战之一。迁移学习是克服这一问题的途径之一,计算机视觉从业者可以考虑使用ResNet,自然语言处理从业者可以考虑BERT。另一方面,可以生成合成数据以增加标记数据。albumentations和imgaug可以生成图像数据,而nlpaug可以生成文本数据。 如果你了解你的数据,你应该量身设计数据扩充方法。请记住,数据科学的黄金法则是garbage in garbage out。 数据采样(Sampling Same Data) 大多数情况下,我们希望随机抽取数据,以保持样本数据在训练集、测试集和验证集之间的概率分布是一致的。同时,也希望保持这种“随机”行为,使得我们可以在不同的时刻获得相同的训练集、测试集和验证集。 如果数据带有日期属性,则可以按日期拆分数据。 否则,可以更改随机种子,使其具有一致的随机行为。 import torchimport numpy as npimport randomseed = 1234random.seed(seed)np.random.seed(seed)torch.manual_seed(seed)torch.cuda.manual_seed(seed) 模型训练(Model Training) 存储中间状态(Saving Intermediate Checkpoint) 只是在训练完成后保存模型,通常具有以下几个缺点: 由于模型的复杂性、计算资源和训练数据的大小,整个模型训练过程可能需要几天或几周的时间。如果没有中间状态被存储,这将是非常危险的,因为机器可能会被意外关闭。 一般来说,较长训练能够获得更好的结果(例如,损失更少)。然而,可能会发生过度拟合。在大多数情况下,最后一个模型状态并不能提供最佳结果。我们大部分时间都需要使用中间状态的模型来进行生产。 使用检查-停止机制能够节省资金。注意到一个模型在几个周期内并没有改进,我们可以早点停止它以节省时间和资源。 理想情况下,我们可以连续性存储模型(例如,在每个epoch之后保存模型),但它需要大量的存储。事实上,我们建议只保留最好的模型(或最好的三个模型)和最后一个模型。 虚拟周期(Virtual Epoch) Epoch是模型训练中一个非常常见的参数。如果初始化不正确,可能会影响模型性能。 例如,如果我们有100万条记录,我们设置了5个epoch,那么总共有500万条的训练数据。三周后,我们又得到了50万条记录。如果我们使用相同的epoch进行模型训练,总训练数据将达到750万。问题是: 难以确定模型性能的改进是由于特定数据的数量增加还是总体数据的数量增加。 新的50万条数据使训练时间延长1小时甚至几天。它增加了机器故障的风险。 建议用虚拟epoch代替原始静态epoch。虚拟epoch可以根据训练数据的大小、期望epoch、批大小来计算得到。 通常的静态epoch如下: #originalnum_data = 1000 * 1000batch_size = 100num_step = 14 * 1000 * 1000num_checkpoint = 20steps_per_epoch = num_step//num_checkpoint#TensorFlow/ Kerasmodel.fit(x, epoch=num_checkpoint, steps_per_epoch=steps_per_epoch, batch_size=batch_size) 而虚拟epoch如下: num_data = 1000 * 1000num_total_data = 14 * 1000 * 1000batch_size = 100num_checkpoint = 20steps_per_epoch = num_total_data // (batch_size*num_checkpoint)#TensorFlow/ Kerasmodel.fit(x, epoch=num_checkpoint, steps_per_epoch=steps_per_epoch, batch_size=batch_size) 简化原则(Simple is Beauty) 从业者通常打算使用最先进的模型来构建初始模型。事实上,我们建议建立一个足够简单的模型作为基线模型。原因是: 我们总是需要一个基线模型来证明所提出的模型是正确的。 基线模型不需要在性能方面非常好,但它必须是可解释的。业务用户总是想知道预测结果的原因。 易于实施是非常重要的。客户不能等一年才能得到一个足够好的模型。我们需要建立一套模型,以便从投资者那里获得动力,在初始模型的基础上建立你的精彩模型。 以下是一些建议的不同领域的基线模型: 语音识别:可以使用经典特征,如mel frequency cepstral coefficient(MFCC)或 mel spectrogram features,而不是训练模型来获得向量表征(如增加嵌入层)。将这些特征传递给一个长短期记忆网络(LSTM)或卷积神经网络(CNN)和一个完全连接的层进行分类或预测。 计算机视觉:TODO。 自然语言处理:使用bag-of-words 或 classic word embeddings嵌入LSTM是一个很好的出发点,然后再转向其它模型,如BERT或XLNet。 调试(Debugging) 简化问题(Simplifying Problem) 有时,分类问题包括100万个数据和1000个类别。当模型性能低于理想值时,很难调试模型。糟糕的性能可能是由模型复杂性、数据质量或bug造成的。因此,建议简化问题,这样我们就可以保证它是无缺陷的。我们可以利用过度拟合问题来实现这一目标。 一开始,不需要对1000个类别进行分类,可以先对10个类别进行抽样,每个类别有100个数据,并训练模型。通过使用相同的训练数据集(或子集)作为评估数据集,能够过度拟合模型并获得良好的结果(例如,80甚至90+的精确度)。在这一基础上进行模型开发能够减少bug的出现。 使用评估模式(Using Eval Mode for Training) 如果评估模式的精度在前几个epoch中没有变化,通常可能是忘记在评估后重置为“训练”模式。 在Pytorch中,需要在训练和评估阶段转换训练模式以及评估模式。如果启用训练模式,批标准化、dropout或其他参数将受到影响。有时,数据分析师可能会在评估模式后忘记启用训练模式。 model = MyModel() # Default mode is training modefor e in range(epoch): # mode.train() # forget to enable train mode logits = model(x_train) loss = loss_func(logits, y_train) model.zero_grad() loss.backward() optimizer.step()mode.eval() # enable eval mode with torch.no_grad(): eval_preds = model(x_val) 数据转换(Data Shifting) 当训练数据集与评估/测试数据集存在显著差异时,需要进行数据转换。在计算机视觉任务中,可能大部分训练数据是白天的图片,而测试数据是夜间的图片。 如果发现训练损失/准确度和测试损失/准确度之间存在很大差异,可以从两个数据集中随机抽取一些样本进行检查。为了解决这个问题,可以考虑如下方法: 确保在训练、测试和预测数据集之间保持相似的数据分布。 如果可能,添加更多的训练数据。 通过利用相关库添加合成数据。考虑使用nlpaug(用于自然语言处理和声学任务)和imgaug(用于计算机视觉任务)。 欠拟合问题(Addressing Underfitting) 欠拟合是指训练误差大于期望误差。换言之,模型无法达到预期的性能。造成大误差的因素很多。要解决这个问题,可以从一个更简单的模型或者方法开始,看看它是否可以解决。 执行错误分析。通过LIME、SHAP或Anchor来解释你的模型,这样你就可以感觉到问题所在。 初始模型可能过于简单。增加模型的复杂性,例如增加长短期记忆(LSTM)层、卷积神经网络(CNN)层或完全连接(FC)层。 通过减少正则化层,稍微过拟合模型。Dropout和降低权重则可以防止过拟合。然后可以尝试移除这些正则化层,看看是否可以解决问题。 采用最先进的模型架构。考虑在自然语言处理(NLP)中使用转换器(如BERT或XLNet)。 引入合成数据。生成更多数据有助于提高模型性能,而无需任何人工操作。理论上,生成的数据应该共享同一个标签。它允许模型“看到”更多不同的数据,并最终提高鲁棒性。可以利用nlpaug和imgaug来执行数据扩充。 分配更好的超参数和优化器。可以考虑执行超参数调整,而不是使用默认/常规学习速率、epoch、batch size。考虑使用波束搜索、网格搜索或随机搜索来识别更好的超参数和优化器。这种方法相对简单,只需改变超参数,但可能需要较长的时间。 重新查看数据并引入额外的特征。 过拟合问题(Addressing Overfitting) 除了欠拟合,你还可能面临着过拟合的问题。过度拟合意味着你的模型太适合你的训练集,而对其他数据没有足够的适用性。换句话说,训练集准确性比验证集准确性要好。考虑以下解决方法: 执行错误分析。通过LIME、SHAP或Anchor来解释你的模型,这样你就可能发现问题所在。 增加更多的训练数据。 引入正则化层。Dropout(正则化层)和批处理标准化(normalization layer)通过删除一些输入和平滑输入来帮助减少过度拟合。 引入合成数据。生成更多数据有助于提高模型性能,而无需任何人工操作。 分配更好的超参数和优化器。 移除部分特征。 模型可能太过于复杂。可以减少模型复杂度。 生产(Production) 元数据联系(Meta Data Association) 在模型推出后,需要检查一些例外数据。一种方法是生成ID并将添加到数据库中。然而,它伴随着几个问题,也增加了故障排除的难度。以下是一些缺点: 影响系统的灵活性。从体系结构设计的角度来看,解耦是构建高柔性系统的途径之一。如果我们生成ID并将带有此ID的预测结果传递给客户,那么客户需要在其数据库中持久使用它。如果我们更改了格式或数据类型,需要通知所有使用者更新他们的数据库。 我们可能需要根据使用者的关键数据收集更多的元数据。额外的关键数据增加了连接的复杂性和存储消耗。 为了克服这个问题,预测结果应该直接与使用者的关键数据相关联。 转换为推理模型(Switch to Inference Mode) 使用Pytorch时,在将模型部署到生产环境中时,需要注意几个设置。前面提到了Pytorch中的eval,它使这些层(如Dropout、BatchNorm)在推理模式下工作,例如在推理阶段内不应用任何Dropout操作。它不仅能加快你的进程,而且能把所有的信息输入神经网络。 mode.eval() # enable eval modewith torch.no_grad(): eval_preds = model(x_val) 计算成本(Scalling Cost) 当尝试扩展API以处理更大的数据量时,有时可能会考虑使用GPU。的确,GPU虚拟机比CPU贵得多。然而,GPU带来了一些优势,例如计算时间更少,并且需要较少的VM来维持相同的服务级别。数据分析师应该试着评估一下GPU是否能节省一些钱。 无状态化(Stateless) 试着使你的API无状态化,这样你的API服务可以很容易地调整。无状态意味着不在API服务器(内存或本地存储)中保存任何中间结果。只需保持API服务器的简单性,并将结果返回给客户端,而无需在内存或本地存储中存储任何内容。 批处理(Batch Process) 预测一组数据通常比逐个预测更快。大多数现代机器学习或深度学习框架优化了预测性能(在速度方面)。你可能会注意到,切换到批处理模式预测对于效率有很大的改进。 使用C++ 虽然Python是机器学习领域中的主流语言,但与其他编程语言(如C++)相比,Python可能太慢了。如果希望低延迟的计算推理时间,可以考虑使用TorchScript。一般的方案是,你仍然可以在Python中训练你的模型,但是通过使用它生成C++兼容的模型。 作者:Edward Ma deephub翻译组:Oliver Lee 本文分享自微信公众号 - DeepHub IMBA(deephub-imba)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

Java并发编程实战系列5之基础构建模块

1 同步容器类 同步容器类包括Vector和HashTable,二者是早期JDK一部分,此外还包括在JDK 1.2中添加的一些功能相似的类,这些的同步封装器类是由Collections.synchronizedXxx等工厂方法创建的。这些类实现线程安全的方式是:将他们的状态封装起来,并对每个共有方法进行同步,使得每次只有一个线程能访问容器的状态。 1.1 同步容器类的问题 同步容器类都是线程安全的,但在某些情况可能需额外客户端加锁来保护复合操作。 容器上常见的复合操作包括: 迭代(反复访问元素,直到遍历完容器中所有元素) 跳转(根据指定顺序找到当前元素的下一个元素)以及条件运算 在同步容器类中,这些复合操作在没有客户端加锁的情况下,仍是线程安全的, 但当其他线程并发的修改容器时,他们可能会表现出意料之外的行为。 2 并发容器 Java5提供了多种并发容器来改进同步容器的性能。 同步容器将所有对容器状态的访问都串行化,以实现他们的线程安全性。 这种方法的代价是严重降低并发性,当多个线程竞争容器的锁时,吞吐量将严重降低。 并发容器是针对多个线程并发访问设计的。在Java 5中增加了 ConcurrentHashMap,用来替代同步且基于散列的Map,增加了对一些常见符合操作的支持,例如“若没有则添加”、替换以及有条件删除等。 CopyOnWriteArrayList,用于在遍历操作为主要操作的情况下代替同步的List。 copyOnWriteArrayList 和 copyOnWriteSet 一开始都共享同一个内容,当想要修改内容时,才会真正的把内容 copy 出去,形成一个新的内容后再改 比如:当我们往一个容器添加元素时,不直接往当前容器添加,而是先将容器进行 copy,复制出一个新容器,再往新容器里加元素。添加完之后,再将原容器引用指向新容器。 好处:对 copyOnWrite 容器进行并发读时,不需要加锁,因为当前容器不会增加新元素,读写分离 copyOnWriteArrayList#add要加锁,否则多线程时会 copy N 个副本 copyOnWrite 适合于 读多写少场景,但只能保证数据最终一致性,不保证实时一致性 若你希望写入马上被读到,不要用 copyOnWrite 容器 通过并发容器来代替同步容器,可以极大地提供伸缩性并降低风险。 2.1 CocurrentHashMap 同步容器在执行每个操作期间都持有一个锁。在一些操作中,例如HashMashMap.get或List.contains,可能包含大量的工作:当遍历散列桶或链表来查找某个特定的对象时,必须在许多元素上调用equals。在基于散列的容器中,如果hashCode不能很均匀的分布散列值,那么容器中的元素就不会均匀的分布在整个容器中。某些情况下,某个糟糕的散列函数还会把一个散列表变成线性链表。当遍历很长的链表并且在某些或者全部元素上调用equals方法时,会花费很长时间,而其他线程在这段时间内都不能访问容器。 ConcurrentHashMap使用一种粒度更细的称为分段锁的机制来实现更大程度的共享. 在这种机制中,任意数量的读取线程可以并发的访问Map,执行读操作的线程和执行写操作的线程可以并发的访问Map,并且一定数量的写线程可以并发的修改Map. ConcurrentHashMap与其他并发容器一起增强了同步容器:迭代器不会抛出ConcurrentModificationException,因此迭代过程无需加锁. 其迭代器具有"弱一致性",而并非"及时失败".可以容忍并发的修改,当创建迭代器时会遍历已有的元素,并可以(但不保证)在迭代器被构造后将修改操作反映给容器. 只有当需要加锁Map以进行独占访问时,才应该放弃使用ConcurrentHashMap. 2.2 额外的原子Map操作 由于ConcurrentHashMap不能被加锁来执行独占访问,因此 无法使用客户端加锁来创建新的原子操作. 一些常见的复合操作,eg."若没有则添加","若相等则移除"等,都已经实现为原子操作并且在ConcurrentMap接口中声明,如下面代码所示. public interface ConcurrentMap<K, V> extends Map<K, V> { //仅当K没有相应的映射值时才插入 V putIfAbsent(K key, V value); //仅当K被映射到V时才移除 boolean remove(Object key, Object value); //仅当K被映射到oldValue时才替换为newValue boolean replace(K key, V oldValue, V newValue); //仅当K被映射到某个值时才被替换为newValue V replace(K key, V value); }

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册