Когда в слое Keras Lambda генерируется случайное число? - PullRequest
0 голосов
/ 26 декабря 2018

Я хотел бы применить простое увеличение данных (умножение входного вектора на случайный скаляр) для полностью подключенной нейронной сети, реализованной в Keras.У Keras есть хорошая функциональность для увеличения изображения, но попытка использовать это выглядела неловко и медленно для моего ввода (1-тензор), чей набор обучающих данных помещается в память моего компьютера.

Вместо этого я представил, что могу достичьэто с использованием лямбда-слоя, например, что-то вроде этого:

x = Input(shape=(10,))
y = x
y = Lambda(lambda z: random.uniform(0.5,1.0)*z)(y)
y = Dense(units=5, activation='relu')(y)
y = Dense(units=1, activation='sigmoid')(y)
model = Model(x, y)

Мой вопрос касается того, когда будет генерироваться это случайное число.Будет ли это исправлять одно случайное число для:

  • всего процесса обучения?
  • каждой партии?
  • каждой точки данных тренировки?

1 Ответ

0 голосов
/ 26 декабря 2018

Использование этого создаст константу, которая не изменится вообще, потому что random.uniform не является функцией keras.Вы определили эту операцию на графике как constant * tensor, и коэффициент будет постоянным.

Вам нужны случайные функции "из кераса" или "из тензорного потока".Например, вы можете взять K.random_uniform((1,), 0.5, 1.).

Это будет изменено для каждой партии.Вы можете проверить его, обучив этот код для многих эпох и увидев, что потери меняются.

from keras.layers import *
from keras.models import Model
from keras.callbacks import LambdaCallback

import numpy as np


ins = Input((1,))
outs = Lambda(lambda x: K.random_uniform((1,))*x)(ins)
model = Model(ins,outs)

print(model.predict(np.ones((1,1))))
print(model.predict(np.ones((1,1))))
print(model.predict(np.ones((1,1))))

model.compile('adam','mae')
model.fit(np.ones((100000,1)), np.ones((100000,1)))

Если вы хотите изменить его для каждой обучающей выборки, то получите фиксированный размер партии и сгенерируйте тензор сслучайные числа для каждой выборки: K.random_uniform((batch_size,), .5, 1.).


Вероятно, вы получите лучшую производительность, если сделаете это в своем собственном генераторе и model.fit_generator(), хотя:

class MyGenerator(keras.utils.Sequence):
    def __init__(self, inputs, outputs, batchSize, minRand, maxRand):
        self.inputs = inputs
        self.outputs = outputs
        self.batchSize = batchSize
        self.minRand = minRand
        self.maxRand = maxRand

    #if you want shuffling
    def on_epoch_end(self):
        indices = np.array(range(len(self.inputs)))
        np.random.shuffle(indices)
        self.inputs = self.inputs[indices]
        self.outputs = self.outputs[indices] 

    def __len__(self):
        leng,rem = divmod(len(self.inputs), self.batchSize)
        return (leng + (1 if rem > 0 else 0))

    def __getitem__(self,i):
        start = i*self.batchSize
        end = start + self.batchSize

        x = self.inputs[start:end] * random.uniform(self.minRand,self.maxRand)
        y = self.outputs[start:end]

        return x,y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...