定义Keras功能

时间:2018-06-08 17:59:03

标签: function keras deep-learning convolutional-neural-network

我最近开始学习深度学习和CNN。我遇到了以下代码,它定义了一个简单的CNN。

任何人都可以帮助我理解这些线是如何工作的:

  1. loss = layer_output[:, :, :, 0] - 这是什么结果?我的问题是,网络还没有接受过培训。权重[Kernels]尚未计算。那么,它将返回什么样的数据! 0代表第一个内核吗?

  2. iterate = K.function([input_img], [loss, grads]) - Keras网站上没有太多文档可用。我理解的是iterate是一个函数,它接受输入张量并返回张量列表,第一个是loss,第二个是grads。但是,它们在其他地方定义!!

  3. 使用以下尺寸定义输入图像:

    img_data = np.random.uniform(size=(1, 250, 250, 3))  
    

    有一个简单的CNN,它有一个卷积层。它使用两个3 X 3内核。

    input = Input(shape=250, 250, 3,), name='input_1')
    
    First_Conv2D = Conv2D(2, kernel_size=(3, 3), padding="same", name='conv2d_1', activation='relu')(input)
    flat = Flatten(name='flatten_1')(First_Conv2D)
    output = Dense(2, name='dense_1', activation='softmax')(flat)
    
    model = Model(inputs=[input], outputs=[output])
    
    layer_dict = dict([(layer.name, layer) for layer in model.layers[0:]])
    layer_output = layer_dict['conv2d_1'].output
    
    input_img = model.input
    
    # Calculate loss and gradient.
    loss = layer_output[:, :, :, 0]
    grads = K.gradients(loss, input_img)[0]
    
    # Define a Keras function
    iterate = K.function([input_img], [loss, grads])
    
    # Call iterate function 
    loss_value, grads_value = iterate([img_data])
    

    谢谢。

1 个答案:

答案 0 :(得分:0)

这看起来像是一个令人讨厌的解剖Keras作为API。我认为它会导致更多的混乱,而不是深度学习的介绍。无论如何,解决你的问题:

  1. 所有张量都是符号,这意味着在我们运行会话之前,它们不包含任何值。他们改为定义有向计算图。 loss = layer_output[:,:,:,0]是一个切片操作,它使最后一个维度的第一个元素返回另一个具有3个维度的张量。当您使用实际输入运行会话时,张量将具有这些操作运行的值。这些操作几乎与NumPy ndarray完全相同,它们不是符号并且包含值,你可以获得直觉。
  2. K.function只是将输入粘合到输出上,返回单个操作,当给定输入时,它将遵循从输入到定义输出的计算图。在这种情况下,给定单个输入列表,它返回2个输出张量损失和梯度的列表。这些仍然是象征性的记忆,如果你试图打印一个,你就会得到它的形状和数据类型。