Использование этого создаст константу, которая не изменится вообще, потому что 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