- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 PyTorch 中实现迁移学习方法。这是我正在使用的数据集:Dog-Breed
这是我要执行的步骤。
1. Load the data and read csv using pandas.
2. Resize (60, 60) the train images and store them as numpy array.
3. Apply stratification and split the train data into 7:1:2 (train:validation:test)
4. use the resnet18 model and train.
数据集位置
LABELS_LOCATION = './dataset/labels.csv'
TRAIN_LOCATION = './dataset/train/'
TEST_LOCATION = './dataset/test/'
ROOT_PATH = './dataset/'
读取 CSV (labels.csv)
def read_csv(csvf):
# print(pandas.read_csv(csvf).values)
data=pandas.read_csv(csvf).values
labels_dict = dict(data)
idz=list(labels_dict.keys())
clazz=list(labels_dict.values())
return labels_dict,idz,clazz
我这样做是因为一个约束,我将在接下来使用 DataLoader 加载数据时提到这个约束。
def class_hashmap(class_arr):
uniq_clazz = Counter(class_arr)
class_dict = {}
for i, j in enumerate(uniq_clazz):
class_dict[j] = i
return class_dict
labels, ids, class_names = read_csv(LABELS_LOCATION)
train_images = os.listdir(TRAIN_LOCATION)
class_numbers = class_hashmap(class_names)
接下来,我使用 opencv
将图像大小调整为 60,60,并将结果存储为 numpy 数组。
resize = []
indexed_labels = []
for t_i in train_images:
# resize.append(transform.resize(io.imread(TRAIN_LOCATION+t_i), (60, 60, 3))) # (60,60) is the height and widht; 3 is the number of channels
resize.append(cv2.resize(cv2.imread(TRAIN_LOCATION+t_i), (60, 60)).reshape(3, 60, 60))
indexed_labels.append(class_numbers[labels[t_i.split('.')[0]]])
resize = np.asarray(resize)
print(resize.shape)
在 indexed_labels 中,我给每个标签一个数字。
接下来,我将数据分成 7:1:2 的部分
X = resize # numpy array of images [training data]
y = np.array(indexed_labels) # indexed labels for images [training labels]
sss = StratifiedShuffleSplit(n_splits=3, test_size=0.2, random_state=0)
sss.get_n_splits(X, y)
for train_index, test_index in sss.split(X, y):
X_temp, X_test = X[train_index], X[test_index] # split train into train and test [data]
y_temp, y_test = y[train_index], y[test_index] # labels
sss = StratifiedShuffleSplit(n_splits=3, test_size=0.123, random_state=0)
sss.get_n_splits(X_temp, y_temp)
for train_index, test_index in sss.split(X_temp, y_temp):
print("TRAIN:", train_index, "VAL:", test_index)
X_train, X_val = X[train_index], X[test_index] # training and validation data
y_train, y_val = y[train_index], y[test_index] # training and validation labels
接下来,我将上一步的数据加载到 torch DataLoaders 中
batch_size = 500
learning_rate = 0.001
train = torch.utils.data.TensorDataset(torch.from_numpy(X_train), torch.from_numpy(y_train))
train_loader = torch.utils.data.DataLoader(train, batch_size=batch_size, shuffle=False)
val = torch.utils.data.TensorDataset(torch.from_numpy(X_val), torch.from_numpy(y_val))
val_loader = torch.utils.data.DataLoader(val, batch_size=batch_size, shuffle=False)
test = torch.utils.data.TensorDataset(torch.from_numpy(X_test), torch.from_numpy(y_test))
test_loader = torch.utils.data.DataLoader(test, batch_size=batch_size, shuffle=False)
# print(train_loader.size)
dataloaders = {
'train': train_loader,
'val': val_loader
}
接下来,我加载预训练的 rensnet 模型。
model_ft = models.resnet18(pretrained=True)
# freeze all model parameters
# for param in model_ft.parameters():
# param.requires_grad = False
num_ftrs = model_ft.fc.in_features
model_ft.fc = nn.Linear(num_ftrs, len(class_numbers))
if use_gpu:
model_ft = model_ft.cuda()
model_ft.fc = model_ft.fc.cuda()
criterion = nn.CrossEntropyLoss()
# Observe that all parameters are being optimized
optimizer_ft = optim.SGD(model_ft.fc.parameters(), lr=0.001, momentum=0.9)
# Decay LR by a factor of 0.1 every 7 epochs
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)
model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler,
num_epochs=25)
然后我使用 train_model,一种描述的方法 here在 PyTorch 的文档中。
但是,当我运行它时出现错误。
Traceback (most recent call last):
File "/Users/nirvair/Sites/pyTorch/TL.py",
line 244, in <module>
num_epochs=25)
File "/Users/nirvair/Sites/pyTorch/TL.py", line 176, in train_model
outputs = model(inputs)
File "/Library/Python/2.7/site-packages/torch/nn/modules/module.py", line 224, in __call__
result = self.forward(*input, **kwargs)
File "/Library/Python/2.7/site-packages/torchvision/models/resnet.py", line 149, in forward
x = self.avgpool(x)
File "/Library/Python/2.7/site-packages/torch/nn/modules/module.py", line 224, in __call__
result = self.forward(*input, **kwargs)
File "/Library/Python/2.7/site-packages/torch/nn/modules/pooling.py", line 505, in forward
self.padding, self.ceil_mode, self.count_include_pad)
File "/Library/Python/2.7/site-packages/torch/nn/functional.py", line 264, in avg_pool2d
ceil_mode, count_include_pad)
File "/Library/Python/2.7/site-packages/torch/nn/_functions/thnn/pooling.py", line 360, in forward
ctx.ceil_mode, ctx.count_include_pad)
RuntimeError: Given input size: (512x2x2). Calculated output size: (512x0x0). Output size is too small at /Users/soumith/code/builder/wheel/pytorch-src/torch/lib/THNN/generic/SpatialAveragePooling.c:64
我似乎无法弄清楚这里出了什么问题。
最佳答案
对于您使用的图像大小 (60x60),您的网络太深了。如您所知,随着输入图像在层中传播,CNN 层确实会产生越来越小的特征图。这是因为您没有使用填充。
您的错误只是说下一层需要 512 个大小为 2 x 2 像素的特征图。前向传递产生的实际特征图是 512 个大小为 0x0 的图。这种不匹配是触发错误的原因。
通常,所有股票网络,例如 RESNET-18、Inception 等,都要求输入图像的大小为 224x224(至少)。您可以使用 torchvision 转换
[1] 更轻松地完成此操作。您还可以使用更大的图像尺寸,但 AlexNet 有一个异常(exception),它具有硬编码的特征向量大小,如我在 [2] 中的回答中所述。
额外提示:如果您在预维护模式下使用网络,则需要使用 [3] 处的 pytorch 文档中的参数来白化数据。
链接
关于python - 使用 PyTorch 进行迁移学习 [resnet18]。数据集 : Dog-Breed-Identification,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47403634/
object a = new Dog(); 对比 Dog a = new Dog(); 在这两种情况下,a.GetType() 都会给出 Dog。两者都调用相同的构造函数(具有相同的层次结构)。 那你
如何将此 css 应用于移动元素文本“DOG DOG DOG”以覆盖 cat 图像? 我用chrome测试没问题 http://image.ohozaa.com/i/g53/BwHNe9.png 但在
为什么 && 运算符返回最后一个值(如果语句为真)? ("Dog" == ("Cat" || "Dog")) // false ("Dog" == (false || "Dog")) // true
这个问题已经有答案了: Can we omit parentheses when creating an object using the "new" operator? (6 个回答) 已关闭 9
mongodb Dog.find() 在 Dog.create() 之前执行 我只是遇到了一些我无法理解的问题以及为什么会发生。我刚刚开始通过在线教程学习 mongodb。我在 cloud9 练习我的
我不太确定为什么较大字符串(“cat”和“dog”)的答案不一致。我正在用链接列表和模板的使用做一些事情。我的好奇心促使我修改模板和函数重载。如果有人能解释发生了什么,我将不胜感激。谢谢你。 #inc
我有一个奇怪的异常,我不知道为什么。我在内存中有数据库中的列表,但是当我尝试访问 getter 或将实体保存在变量中时,它会引发异常。 这是实体: package model; import java
当我“打印”(狗)的大小时 char dog[1000];// i get size of 1000 char *dog = (char*)malloc(1000 * sizeof(char));//
我有一个类Animal , 及其子类 Dog .我有一个 List我想添加一些 List 的内容到 List .有没有比只投 List 更好的方法呢?到 List , 然后使用 AddRange ?
我在 Twitter 上找到了以下代码片段(查看帖子历史以获取来源)。 [5] pry(main)> Date.parse('3 Dogs') ArgumentError: invalid date
Dog是一个用于DNS查询的命令行工具,它的工作原理类似于dig。它具有丰富多彩的输出,支持DNS-over-TLS 和 DNS-over-HTTPS协议,并且可以输出JSON格式。 系统环境
我希望此代码使用 jQuery 更改 3 个 div 的类 maximum。 $(".cat, .dog").click(function() { var el = $(this);
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我正在尝试实现原始论文中的方法(Enhanced LocalTextureFeatureSetsforFace在困难光照条件下的识别,作者:Xiaoyang Tan 和 Bill Triggs)在 p
我正在阅读名为“Code Complete”的书。书中对“dog-tag field”有解释。 Use dog-tag fields to check for corrupted memory. A
我自己找不到问题!感谢您的帮助,当我将空结构传递给 getPets() 这是一个接口(interface)接收器时,我期待结构返回的空引用,但我得到了这个错误 **dog 没有实现宠物(说话的类型错误
代码是自动生成的,所以我无法通过添加 HTML 来添加类/id 等,所以我尝试使用 js 来执行此操作。我 chop 了内容,但基本上我想将类“dog1”添加到与 Dog 1 相关的行,将类“dog2
我在nodejs中创建了一个基本项目,但是当我提交数据时,它说无法发布api/dogs。 https://vfs.cloud9.us-east-2.amazonaws.com/vfs/3199fe30
如果 Dog 继承自 Animal。 我有一个动物 [],我碰巧知道它只包含狗。接触 Dog[] 的最快/最好方法是什么?我用过 new ArrayList(oldarray).ToArray(typ
Closed. This question is opinion-based。它当前不接受答案。 想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 已关闭6年。
我是一名优秀的程序员,十分优秀!