Как я могу кормить входы сети, если она не подается модель.fit? - PullRequest
0 голосов
/ 26 апреля 2019

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

def C(u):
    if u == 0:
        return 1. / np.sqrt(2.)
    else:
        return 1.

def DCT(a, b):
    for u in range(8):
        for v in range(8):
            for x in range(8):
                for y  in range(8):
                    b[u,v] = b[u, v] + 0.25 * C(u) * C(v) * a[x, y]* np.cos((2 * x+1) * (u) * np.pi / 16) * np.cos((2 * y+1) * (v) * np.pi / 16)

def IDCT(a, b):
    for u in range(8):
        for v in range(8):
            for x in range(8):
                for y  in range(8):
                    b[x,y] = b[x, y] + 0.25 * C(u) * C(v) * a[u,v] * np.cos((2 * x+1) * (u) * np.pi / 16) * np.cos((2 * y+1) * (v) * np.pi / 16)

def quntize_mask(window_size: int, keep_count: int):
    mask = np.zeros((window_size, window_size), dtype=np.uint8)

    index_order = sorted(((x, y) for x in range(window_size) for y in range(window_size)),
                         key=lambda p: (p[0] + p[1], -p[1] if (p[0] + p[1]) % 2 else p[1]))

    for i, j in index_order[0:keep_count]:
        mask[i, j] = 1
    return mask
def slicAndJpeg(img):
    for i in range (int(img.shape[1].value/8)):
        for j in range(int(img.shape[2].value/8)):
            temp=(img[:,i*8:i*8+8,j*8:j*8+8])
            tempb=np.zeros((8,8))
            DCT(temp,tempb)
            mask=quntize_mask(8,9)
            qunz=Kr.layers.multiply(mask,tempb)
            tempc=K.zeros((8,8))
            IDCT(qunz,tempc)
            img[:,i*8:i*8+8,j*8:j*8+8]=tempc

class JPEGLayer(Layer):

    def __init__(self,**kwargs):
        super(JPEGLayer, self).__init__(**kwargs)
        self.supports_masking = True
    def call(self, noised_image, training=True):
        def noise():
#            noised_image = noised_and_cover
            # pad the image so that we can do dct on 8x8 blocks
            pad_height = (8 - noised_image.shape[1] % 8) % 8
            pad_width = (8 - noised_image.shape[2] % 8) % 8

            noised_image_pad = Kr.layers.ZeroPadding2D(padding=(( pad_width, 0),( pad_height,0)))(noised_image)
            slicAndJpeg(K.eval(noised_image_pad))


        # un-pad
            noised_and_cover = noised_image_pad[ :, :noised_image_pad.shape[1]-pad_height, :noised_image_pad.shape[2]-pad_width]
            return noised_and_cover 
        return noise()

#-----------------building w train---------------------------------------------
wt_random=np.random.randint(2, size=(49999,4,4))
w_expand=wt_random.astype(np.float32)
wv_random=np.random.randint(2, size=(9999,4,4))
wv_expand=wv_random.astype(np.float32)
x,y,z=w_expand.shape
w_expand=w_expand.reshape((x,y,z,1))
x,y,z=wv_expand.shape
wv_expand=wv_expand.reshape((x,y,z,1))

#-----------------building w test---------------------------------------------
w_test = np.random.randint(2,size=(1,4,4))
w_test=w_test.astype(np.float32)
w_test=w_test.reshape((1,4,4,1))


#-----------------------encoder------------------------------------------------
#------------------------------------------------------------------------------
image = Input((28, 28, 1))
conv1 = Conv2D(64, (5, 5),activation='relu',padding='same', name='convl1e')(image)
wtm=Input((4,4,1))
#--------------------------------------------------------------
wpad=Kr.layers.Lambda(lambda xy: xy[0] + Kr.backend.spatial_2d_padding(xy[1], padding=((0, 24), (0, 24))))
encoded_merged=wpad([conv1,wtm])#-----------------------decoder------------------------------------------------
#------------------------------------------------------------------------------
decoded = Conv2D(1, (5, 5),activation='relu', padding='same', name='decoder_output')(encoded_merged) 
model=Model(inputs=[image,wtm],outputs=decoded)
model.summary()
decoded_noise=JPEGLayer()(decoded)#16

#----------------------w extraction------------------------------------
convw1 = Conv2D(64, (5,5),activation='relu' , name='conl1w')(decoded_noise)#24
convw2 = Conv2D(64, (5,5),activation='relu' , name='conl2w')(convw1)#20
#Avw1=AveragePooling2D(pool_size=(2,2))(convw2)
convw3 = Conv2D(64, (5,5),activation='relu' ,name='conl3w')(convw2)#16
convw4 = Conv2D(64, (5,5), activation='relu' ,name='conl4w')(convw3)#12
#Avw2=AveragePooling2D(pool_size=(2,2))(convw4)
convw5 = Conv2D(64, (5,5), activation='relu' ,name='conl5w')(convw4)#8

convw6 = Conv2D(64, (5,5), activation='relu' ,name='conl6w')(convw5)#4
pred_w = Conv2D(1, (1, 1),activation='relu' ,padding='same', name='reconstructed_W')(convw6)

model1=Model(inputs=[image,wtm],outputs=[decoded,pred_w])

model1.summary()
#----------------------training the model--------------------------------------
#------------------------------------------------------------------------------
#----------------------Data preparesion----------------------------------------

(x_train, _), (x_test, _) = mnist.load_data()
x_validation=x_train[1:10000,:,:]
x_train=x_train[10001:60000,:,:]
#
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_validation = x_validation.astype('float32') / 255.
x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))  # adapt this if using `channels_first` image data format
x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))  # adapt this if using `channels_first` image data format
x_validation = np.reshape(x_validation, (len(x_validation), 28, 28, 1))

#---------------------compile and train the model------------------------------
opt=SGD(momentum=0.99,lr=0.0001)
model1.compile(optimizer='adam', loss={'imageprim':'mse','wprim':'binary_crossentropy'}, loss_weights={'imageprim': 0.5, 'wprim': 1.0},metrics=['mae'])
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=40)
#rlrp = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=20, min_delta=1E-4, verbose=1)
mc = ModelCheckpoint('sendAct.h5', monitor='val_loss', mode='min', verbose=1, save_best_only=True)
history=model1.fit([x_train,w_expand], [x_train,w_expand],
          epochs=4000,
          batch_size=32, 
          validation_data=([x_validation,wv_expand], [x_validation,wv_expand]),
          callbacks=[TensorBoard(log_dir='/home/jamalm8/tensorboardGNWLoss/', histogram_freq=0, write_graph=False),es,mc])
model1.summary()

Traceback (последний последний вызов):

Файл "", строка 124, в decoded_noise = JPEGLayer () (декодированы) # 16

Файл "D: \ Software \ Anaconda3 \ envs \ py36 \ Lib \ сайт-пакеты \ keras \ двигатель \ base_layer.py", линия 457, вызов output = self.call (входы, ** кваргс)

Файл "", строка 94, в вызове возвратный шум ()

Файл "", строка 88, в шуме slicAndJpeg (K.eval (noised_image_pad))

Файл "D: \ Software \ Anaconda3 \ envs \ py36 \ Lib \ сайт-пакеты \ keras \ бэкэнд \ tensorflow_backend.py", линия 673, в eval return to_dense (x) .eval (session = get_session ())

Файл "D: \ Software \ Anaconda3 \ envs \ py36 \ Lib \ сайт-пакеты \ tensorflow \ питон \ рамки \ ops.py", строка 713, в eval return _eval_using_default_session (self, feed_dict, self.graph, session)

Файл "D: \ Software \ Anaconda3 \ envs \ py36 \ Lib \ сайт-пакеты \ tensorflow \ питон \ рамки \ ops.py", строка 5157, в _eval_using_default_session return session.run (тензор, feed_dict)

Файл "D: \ Software \ Anaconda3 \ envs \ py36 \ Lib \ сайт-пакеты \ tensorflow \ питон \ клиент \ session.py", линия 929, в прогоне run_metadata_ptr)

Файл "D: \ Software \ Anaconda3 \ envs \ py36 \ Lib \ сайт-пакеты \ tensorflow \ питон \ клиент \ session.py", строка 1152, в _run feed_dict_tensor, options, run_metadata)

Файл "D: \ Software \ Anaconda3 \ envs \ py36 \ Lib \ сайт-пакеты \ tensorflow \ питон \ клиент \ session.py", строка 1328, в _do_run run_metadata)

Файл "D: \ Software \ Anaconda3 \ envs \ py36 \ Lib \ сайт-пакеты \ tensorflow \ питон \ клиент \ session.py", строка 1348, в _do_call поднять тип (e) (node_def, op, message)

InvalidArgumentError: Вы должны указать значение для тензора заполнителя 'input_1' с плавающей точкой dtype и формой [?, 28,28,1] [[node input_1 (определяется в D: \ Software \ Anaconda3 \ envs \ py36 \ Lib \ сайт-пакеты \ keras \ бэкенд \ tensorflow_backend.py: 517) = Placeholderdtype = DT_FLOAT, shape = [?, 28,28,1], _device = "/ job: localhost / replica: 0 / task: 0 / device: GPU: 0"]] [[{{node jpeg_layer_1 / zero_padding2d_1 / Pad / _9}} = _Recvclient_terminated = false, recv_device = "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0", send_device = "/ работа: локальный / реплика: 0 / задача: 0 / устройства: GPU: 0", send_device_incarnation = 1, tensor_name = "edge_39_jpeg_layer_1 / zero_padding2d_1 / Pad", tensor_type = DT_FLOAT, _device = "/ работа: локальный / реплика: 0 / задача: 0 / устройства: CPU: 0"]]

Вызывается операцией 'input_1', определенной в: File "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ runpy.py", строка 193, в _run_module_as_main " main ", mod_spec) Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ runpy.py", строка 85, в _run_code exec (code, run_globals) Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ spyder_kernels \ console__main __. py", строка 11, в файл start.main () "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ spyder_kernels \ console \ start.py", линия 310, в основном Файл kernel.start () "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ ipykernel \ kernelapp.py", строка 505, в начале self.io_loop.start () Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ tornado \ platform \ asyncio.py", строка 132, в начале self.asyncio_loop.run_forever () Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ asyncio \ base_events.py", строка 438, в run_forever self._run_once () Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ asyncio \ base_events.py", строка1451, в файле _run_once handle._run () "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ asyncio \ events.py", строка 145, в файле _run self._callback (* self._args) "D: \software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ tornado \ ioloop.py ", строка 758, в _run_callback ret = callback () Файл" D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ "tornado \ stack_context.py ", строка 300, в null_wrapper возвращает fn (* args, ** kwargs) Файл" D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ tornado \ gen.py ", строка 1233, во внутреннем файле self.run () "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ tornado \ gen.py", строка 1147, в рабочем файле yielded = self.gen.send (значение)Строка "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ ipykernel \ kernelbase.py", строка 357, в файле process_one приводит к генерации gen.maybe_future (dispatch (* args)) файла "D: \ software \ Anaconda3 \envs \ py36 \ lib \ site-packages \ tornado \ gen.py ", строка 326, в оболочке уступил = следующий (результат) Файл" D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ ipykernel \ kernelbase ".py ", строка 267, в dispatch_shell yield gen.maybe_future (handler (stream, idents, msg)) Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ tornado \ gen.py", строка 326, в оболочке, приведен = следующий (результат) Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ ipykernel \ kernelbase.py", строка 534, в execute_request user_expressions, allow_stdin, файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib\ site-packages \ tornado \ gen.py ", строка 326, в оболочке уступил = next (результат) Файл" D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ ipykernel \ ipkernel.py ", строка294, в do_execute res = shell.run_cell (code, store_history = store_history, silent = silent) Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ ipykernel \ zmqshell.py", строка 536, вrun_cell возвращает super (ZMQInteractiveShell, self) .run_cell (* args, ** kwargs) Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ IPython \ core \ interactiveshell.py", строка 2819, вrun_cell raw_cell, store_history, silent, shell_futures) Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ IPython \ core \interactiveshell.py ", строка 2845, в _run_cell, возврат бегуна (coro). Файл" D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ IPython \ core \ async_helpers.py ", строка 67, в _pseudo_sync_runner coro.отправить (нет) файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ IPython \ core \ interactiveshell.py", строка 3020, в файле run_cell_async интерактивность = интерактивность, компилятор = компилятор, результат = результат) Файл"D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ IPython \ core \ interactiveshell.py", строка 3185, в run_ast_nodes if (выход из self.run_code (код, результат)): файл "D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ IPython \ core \ interactiveshell.py ", строка 3267, в файле run_code exec (code_obj, self.user_global_ns, self.user_ns), файл" ", строка 114, в изображении= Входной ((28, 28, 1)) файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ input_layer.py", строка 178, в файле Input input_tensor = тензор) "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ legacy \ interfaces.py ", строка 91, в возврате оболочкиfunc (* args, ** kwargs) Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ input_layer.py", строка 87, в init name =self.name) Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ backend \ tenorflow_backend.py", строка 517, в заполнителе x = tf.placeholder (dtype, shape = shape, name= имя) Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ tenorflow \ python \ ops \ array_ops.py", строка 1747, в заполнителе возвращает gen_array_ops.placeholder (dtype = dtype, shape = shape, name = name) Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ tenorflow \ python \ ops \ gen_array_ops.py", строка 5206, в качестве заполнителяФайл-заполнитель, dtype = dtype, shape = shape, name = name строка 787, в _apply_op_helper op_def = op_def) Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ tenorflow \ python \ util \ deprecation.py", строка 488, в new_func return func (* args, ** kwargs) Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ensorflow \ python \ framework \ ops.py", строка 3274, в create_op op_def = op_def) Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ tenorflow \ python \ framework \ ops.py", строка 1770, в init self._traceback = tf_stack.extract_stack ()

InvalidArgumentError (см. Выше для отслеживания): вы должны передать значение для тензора-заполнителя 'input_1' с плавающей точкой dtype и формой [?, 28,28,1] [[узел ввода_1 (определен в D: \ Software \ Anaconda3 \ envs \ py36 \ Lib \ сайт-пакеты \ keras \ бэкенд \ tensorflow_backend.py: 517) = Placeholderdtype = DT_FLOAT, shape = [?, 28,28,1], _device = "/ job: localhost / replica: 0 / task: 0 / device: GPU: 0"]] [[{{node jpeg_layer_1 / zero_padding2d_1 / Pad / _9}} = _Recvclient_terminated = false, recv_device = "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0", send_device = "/ работа: локальный / реплика: 0 / задача: 0 / устройства: GPU: 0", send_device_incarnation = 1, tensor_name = "edge_39_jpeg_layer_1 / zero_padding2d_1 / Pad", tensor_type = DT_FLOAT, _device = "/ работа: локальный / реплика: 0 / задача: 0 / устройства: CPU: 0"]]

1 Ответ

0 голосов
/ 29 апреля 2019

Это вызвано строкой slicAndJpeg(K.eval(noised_image_pad)) в вашем классе JPEGLayer. По сути, вы пытаетесь оценить тензор, вызывая K.eval(), не передавая ему никаких данных. Вы не можете оценить пустой тензор, верно? Это можно исправить, удалив эту функцию noise() полностью и выполнив заполнение / нарезку и другие задачи при предварительной обработке.

Замените класс JPEGLayer на следующий, и он должен работать (при условии, что входные данные уже заполнены)

class JPEGLayer(Layer):

    def __init__(self,**kwargs):
        super(JPEGLayer, self).__init__(**kwargs)
        self.supports_masking = True
    def call(self, noised_image, training=True):
        return noised_image
...