在深度学习中训练模型都是小批量小批量地优化训练的,即每次都会从原数据集中取出一小批量进行训练,完成一次权重更新后,再从原数据集中取下一个小批量数据,然后再训练再更新。
另外,原数据集往往很大,不可能一次性的全部载入模型,只能一小批一小批地载入。训练完了就扔了,再加载下一小批。
准备数据
import pandas as pd
import numpy as np
data = np.random.rand(128, 3) # 128x3
data = pd.DataFrame(data, columns=['feature_1', 'feature_2', 'label'])
Dataset和Dataloader使用模板
class MyDataset(Dataset):
def __init__(self, data):
super().__init__()
'''
有两种写法:
1、将全部数据都加载进内存里,适用于少量数据;
2、当数据量或者标签量很大时,比如图片,就把这些数据或者标签放到文件或数据库里去,只需在此方法中初始化定义这些文件索引的列表即可。
'''
# 以下2个方法都是魔法方法
def __getitem__(self, index): # 实现索引数据集中的某一个数据
# 表示将来实例化这个对象后,它能支持下标(索引)操作,也就是能通过索引把里面的数据拿出来。
# ...
# 数据解析
# ...
return 某一个数据
def __len__(self): # 返回数据集的长度
return len(self.data)
my_dataset = MyDataset(data)
train_loader = DataLoader(dataset=my_dataset, # 传递数据集
batch_size=32, #一个小批量容量是多少
shuffle=True, # 数据集顺序是否要打乱,一般是要的。测试数据集一般没必要
num_workers=0) # 需要几个进程来一次性读取这个小批量数据
创建一个完整的Dataset,使用上面自己生成的数据集。
from torch.utils.data import Dataset # Dataset是个抽象类,只能用于继承
from torch.utils.data import DataLoader # DataLoader需实例化,用于加载数据
class MyDataset(Dataset):
def __init__(self, data):
super().__init__()
self.data = data
self.features = self.data[['feature_1', 'feature_2']].values # [[]]是返回结果是一个df,[]可能返回一个Serial;
self.label = self.data[['label']].values
# .values 取DataFrame或Series的值,返回值是一个numpy ndarray的副本;而不是对原始数据的引用。这意味着你可以对返回的数组执行任何操作,而不会影响原始的pandas对象。
def __getitem__(self, index): # 参数index必写
return self.features[index], self.label[index]
def __len__(self):
return len(self.data)
# 实例化
my_dataset = MyDataset(data)
train_loader = DataLoader(dataset=my_dataset, # 要传递的数据集
batch_size=32, #一个小批量数据的大小是多少
shuffle=True, # 数据集顺序是否要打乱,一般是要的。测试数据集一般没必要
num_workers=0) # 需要几个进程来一次性读取这个小批量数据
dataloader 本质上是一个可迭代对象!
关于可迭代对象以及迭代器的说明:https://www.cnblogs.com/kphang/p/17026932.html
所以就有这说明里提到的几种方式进行访问。
# 方式1:每一轮就是Dataloader中设置的batch_size的大小。
for batch_features, batch_labels in train_loader:
pass
# 方式2:
for i, batch_data in enumerate(train_loader):
print(i) # 0 1 2 3 # 共4轮,因为batch_size设置的是32,数据项共128个;
在 PyTorch 中,dataloader 会遍历完所有的数据。每次迭代会返回一个批次的数据。你可以使用 for 循环来迭代 dataloader,每次循环会返回一个批次的数据。当 dataloader 迭代完所有数据时,for 循环将会结束。
也可以使用 iter() 函数来获取迭代器,然后使用 next() 函数来迭代数据。例如:
# 方式3:
iterator = iter(dataloader)
while True:
try:
data = next(iterator)
# Process the data
except StopIteration:
break
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po