Реализация обратного вызова для model.predict в керасе - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть пользовательский слой, которому передают копию ввода в качестве параметра, подобного этому x=MyLayer(100,array=input)(input_tensor). Затем я подгоняю обучающие примеры в al oop один за другим, так что конкретное значение X в model.fit совпадает с массивом 'input'. Входные данные передаются в слой, поскольку он определяет, какие индексы в матрице весов go где. то есть у меня есть матрица весов Dynami c, форма которой зависит от входных данных.

Проблема теперь возникает при выполнении model.predict. Как передать вход модели.predict слою, чтобы он знал, куда поместить индексы, прежде чем передавать данные по сети?

Вот мой код:

li = np.asarray(li3)
li = li.astype('float32') / 255.
random_dim = 400
noise = np.random.rand(400).astype(np.complex128)
noise = noise / 0.132174913205638
noise = np.reshape(noise, (1, random_dim))


input_tensor = Input(shape=(random_dim,))

x = MyLayer2(100, array=noise)(input_tensor)
x = Activation('relu')(x)
x = MyLayer2(100, array=noise)(x)
x = Activation('relu')(x)
x = MyLayer2(100, array=noise)(x)
x = Activation('relu')(x)

x = Dense(400, activation='relu')(x)
x = Dense(1 * 32 * 35 * 1, activation='relu')(x)
x = Reshape((1, 32, 35, 1))(x)
x = Conv3D(32, (4, 4, 4), activation='relu', padding='same')(x)
x = UpSampling3D((2, 2, 2))(x)

x = Conv3D(32, (4, 4, 4), activation='relu', padding='same')(x)
x = UpSampling3D((2, 2, 2))(x)
x = Conv3D(64, (4, 4, 4), activation='relu', padding='same')(x)
x = UpSampling3D((5, 5, 5))(x)

prediction = Conv3D(3, (3, 3, 3), activation='sigmoid', padding='same')(x)

modelE2 = Model(inputs=input_tensor, outputs=prediction)
ss = 'pmed.h5'
                                                modelE2.load_weights('/ssd_sda/textfiles/' + ss)
sgd = optimizers.Adadelta(lr=0.1)
modelE2.compile(optimizer=sgd, loss='mse')
callbacks = [EarlyStoppingByLossVal(monitor='loss', value=0.04, verbose=1)                                                     
                                                ]


modelE2.fit(noise, li,batch_size=1, verbose=1, epochs=40,                                                              
                                   callbacks=callbacks)

Для моего метода вызова в mylayer у меня есть следующее:

 def call(self, y):
        li = []
        li2 = []
        li3 = []
        li4 = []
        li5 = []
        li6 = []
        liz = []

        h = -10
        for t in self.array:
            h += 10
            for d in t:
                l = [int(i) for i in str(d) if i.isdigit()]
                if  len(l) < 20:
                    for c in l:
                        c = c + h
                        c = int(c)
                        li6.append(c)

                    for x in range(20 - len(li6)):
                        x = int(x)
                        li5.append(x)
                else:
                    for x in range(20):
                        c = c + h
                        c = int(c)
                        li6.append(c)
                        li5 = []
                li6 = np.asarray(li6)
                li5 = np.asarray(li5)
                li = np.concatenate((li6, li5))
                li6 = []
                li5 = []

                li = np.asarray(li)
                li2.append(li)
            li2 = np.asarray(li2)

        li2 = np.ndarray.flatten(li2)

        li2 = li2.astype(int)
        li2 = np.tile(li2, 20)
        # li2 = li2.astype(int)
        S = tf.Variable(lambda: tf.reshape((tf.gather((tf.reshape(self.w, [-1])), li2)), (400, 400)), trainable=True)

        self._trainable_weights = [S]

        return K.dot(tf.reshape(y, [1, 400]), S)

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