Цепной автоэнкодер

Я пытаюсь написать ванильный автоэнкодер для сжатия 13 изображений. Однако я получаю следующую ошибку:

ValueError: аргумент поезда больше не поддерживается. Используйте chainer.using_config

Форма изображений (21,28,3).

filelist = 'ex1.png', 'ex2.png',...11 other images
x = np.array([np.array(Image.open(fname)) for fname in filelist])
xs = x.astype('float32')/255.

class Autoencoder(Chain):
  def __init__(self, activation=F.relu):
    super().__init__()
    with self.init_scope():
  # encoder part
      self.l1 = L.Linear(1764,800)
      self.l2 = L.Linear(800,300)
  # decoder part
      self.l3 = L.Linear(300,800)
      self.l4 = L.Linear(800,1764)
      self.activation = activation

  def forward(self,x):
      h = self.encode(x)
      x_recon = self.decode(h)
      return x_recon

  def __call__(self,x):
      x_recon = self.forward(x)
      loss = F.mean_squared_error(h, x)
      return loss

  def encode(self, x, train=True):
      h = F.dropout(self.activation(self.l1(x)), train=train)
      return self.activation(self.l2(x))

  def decode(self, h, train=True):
      h = self.activation(self.l3(h))
      return self.l4(x)

n_epoch = 5
batch_size = 2
model = Autoencoder()

optimizer = optimizers.SGD(lr=0.05).setup(model)
train_iter = iterators.SerialIterator(xs,batch_size)
valid_iter = iterators.SerialIterator(xs,batch_size)

updater = training.StandardUpdater(train_iter,optimizer)
trainer = training.Trainer(updater,(n_epoch,"epoch"),out="result")

from chainer.training import extensions
trainer.extend(extensions.Evaluator(valid_iter, model, device=gpu_id))

trainer.run()

Проблема связана с количеством узлов в модели или с чем-то другим?


person TulakHord    schedule 24.04.2019    source источник


Ответы (1)


Вам нужно написать часть "декодер".

Когда вы берете убыток mean_squared_error, форма h и x должна быть одинаковой. AutoEncoder закодирует исходный x в небольшое пространство (100-dim) h, но после этого нам нужно восстановить x' из этого h, добавив часть декодера. Затем можно рассчитать потери по этому реконструированному x'.

Например, следующим образом (извините, я не тестировал его для запуска)

  • Для Цепи v2~

Аргумент train обрабатывается глобальными конфигурациями, поэтому train вам не нужен. аргумент в функции исключения.

class Autoencoder(Chain):
  def __init__(self, activation=F.relu):
    super().__init__()
    with self.init_scope():
      # encoder part
      self.l1 = L.Linear(1308608,500)
      self.l2 = L.Linear(500,100)
      # decoder part
      self.l3 = L.Linear(100,500)
      self.l4 = L.Linear(500,1308608)
  self.activation = activation

  def forward(self,x):
      h = self.encode(x)
      x_recon = self.decode(h)
      return x_recon

  def __call__(self,x):
      x_recon = self.forward(x)
      loss = F.mean_squared_error(h, x)
      return loss

  def encode(self, x):
      h = F.dropout(self.activation(self.l1(x)))
      return self.activation(self.l2(x))

  def decode(self, h, train=True):
      h = self.activation(self.l3(h))
      return self.l4(x)
  • Для цепи v1
class Autoencoder(Chain):
  def __init__(self, activation=F.relu):
    super().__init__()
    with self.init_scope():
      # encoder part
      self.l1 = L.Linear(1308608,500)
      self.l2 = L.Linear(500,100)
      # decoder part
      self.l3 = L.Linear(100,500)
      self.l4 = L.Linear(500,1308608)
  self.activation = activation

  def forward(self,x):
      h = self.encode(x)
      x_recon = self.decode(h)
      return x_recon

  def __call__(self,x):
      x_recon = self.forward(x)
      loss = F.mean_squared_error(h, x)
      return loss

  def encode(self, x, train=True):
      h = F.dropout(self.activation(self.l1(x)), train=train)
      return self.activation(self.l2(x))

  def decode(self, h, train=True):
      h = self.activation(self.l3(h))
      return self.l4(x)

Вы также можете обратиться к официальному примеру Variational Auto Encoder для следующего шага:

person corochann    schedule 24.04.2019
comment
спасибо за указание на проблему в разделе модели ... и как здесь определить активацию = relu? - person TulakHord; 25.04.2019
comment
Еще раз спасибо ... однако исходная проблема все еще сохраняется ... теперь я попробовал изображение гораздо меньшего размера ... 28 * 21 = 588 и форму (21,28,3). Ошибка: - person TulakHord; 25.04.2019
comment
Можете ли вы отредактировать свой вопрос, чтобы добавить следующую ошибку внизу вашего вопроса? (пожалуйста, не удаляйте исходный вопрос, просто добавьте следующую ошибку). - person corochann; 25.04.2019
comment
stackoverflow.com/questions/55844644/stacked-autoencoder это следующая ошибка? - person corochann; 25.04.2019
comment
Я обновил код и описание проблемы... ссылка, которую вы прислали, - это другая проблема... хотя мне бы хотелось, чтобы вы помогли и в этом, если это возможно. - person TulakHord; 25.04.2019
comment
Я снова обновил свой ответ. Похоже, вы используете более новую версию Chainer, в этом случае вам не нужен аргумент train. - person corochann; 26.04.2019