Pytorch - невозможно разрезать набор данных MNIST

Два возможных подхода.

  1. Если у вас есть внешний ключ, объявите его как on-delete-cascade и удалите родительские строки старше 30 дней. Все дочерние строки будут удалены автоматически.
  2. Основываясь на вашем описании, похоже, что вы знаете родительские строки, которые хотите удалить, и должны удалить соответствующие дочерние строки. Вы пробовали SQL как это?
      delete from child_table
          where parent_id in (
               select parent_id from parent_table
                    where updd_tms != (sysdate-30)
    
    - теперь удалить записи родительской таблицы
    delete from parent_table
    where updd_tms != (sysdate-30);
    

---- Исходя из вашего требования, похоже, что вам, возможно, придется использовать PL / SQL. Я посмотрю, может ли кто-нибудь опубликовать на нем чистое SQL-решение (в этом случае это определенно будет способ).

declare
    v_sqlcode number;
    PRAGMA EXCEPTION_INIT(foreign_key_violated, -02291);
begin
    for v_rec in (select parent_id, child id from child_table
                         where updd_tms != (sysdate-30) ) loop

    -- delete the children
    delete from child_table where child_id = v_rec.child_id;

    -- delete the parent. If we get foreign key violation, 
    -- stop this step and continue the loop
    begin
       delete from parent_table
          where parent_id = v_rec.parent_id;
    exception
       when foreign_key_violated
         then null;
    end;
 end loop;
end;
/
1
задан u2gilles 18 January 2019 в 10:13
поделиться

2 ответа

Интерфейс Dataset требует, чтобы

Все подклассы переопределяли __len__, который обеспечивает размер набора данных, и __getitem__, поддерживающие целочисленную индексацию в диапазоне от 0 до len(self) эксклюзив.

, который явно не упоминает нарезку - поведение нарезки других наборов данных является дополнительной функцией. Если вы хотите получить все данные сразу, вы можете посмотреть реализацию и просто использовать тензоры mnist.data и mnist.targets, определенные к концу __init__.

Если вы хотите преобразовать данные, вы можете использовать

data = [mnist_ds[i] for i in range(len(mnist_ds))]
xs = torch.stack([d[0] for d in data], dim=0)
ys = torch.stack([d[1] for d in data], dim=0)

или преобразовать тензор mnist.data одновременно (хотя это не будет работать с преобразованиями torchvision.transform).

0
ответ дан Jatentaki 18 January 2019 в 10:13
поделиться

Я нашел 2 решения для преобразования набора данных torchvision MNIST в тензоры. Первый из них взят из комментария Фабио Переса:

print("\nFirst...")
st = time()
x_all_ts = torch.tensor([mnist_ds[i][0].numpy() for i in range(0, len(mnist_ds))])
t_all_ts = mnist_ds.train_labels
print(f"{time()-st}   images:{x_all_ts.size()}  targets:{t_all_ts.size()} ")

print("\nSecond...")
st = time()
mnist_dl = DataLoader(dataset=mnist_ds, batch_size=len(mnist_ds))
x_all_ts2, t_all_ts2 = list(mnist_dl)[0]
print(f"{time()-st}   images:{x_all_ts2.size()}  targets:{t_all_ts2.size()} ")


First...
19.573785066604614   images:torch.Size([60000, 1, 16, 16])  targets:torch.Size([60000]) 
Second...
16.826476573944092   images:torch.Size([60000, 1, 16, 16])  targets:torch.Size([60000]) 

Пожалуйста, дайте мне знать, если вы найдете лучшие из них.

0
ответ дан u2gilles 18 January 2019 в 10:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: