【问题标题】:Keras: Functional API -- Layer Datatype ErrorKeras:功能 API——层数据类型错误
【发布时间】:2017-10-25 06:52:39
【问题描述】:

我正在尝试使用 for 循环分隔 keras Conv2D 层的每个输出,然后通过 Functional API 向其添加另一层,但出现类型错误。代码是:

import keras
from keras.models import Sequential, Model
from keras.layers import Flatten, Dense, Dropout, Input, Activation
from keras.layers.convolutional import Conv2D, MaxPooling2D, ZeroPadding2D
from keras.layers.merge import Add
from keras.optimizers import SGD
import cv2, numpy as np
import glob
import csv

def conv_layer:
    input = Input(shape=(3,224,224))
    k = 64
    x = np.empty(k, dtype=object)
    y = np.empty(k, dtype=object)
    z = np.empty(k, dtype=object)
    for i in range(0,k):
        x[i] = Conv2D(1, (3,3), data_format='channels_first', padding='same')(input)
        y[i] = Conv2D(1, (3,3), data_format='channels_first', padding='same')(x[i])
        z[i] = keras.layers.add([x[i], y[i]])
    out = Activation('relu')(z)
    model = Model(inputs, out, name='split-layer-model')

    return model

但是,它抛出以下错误:

Traceback (most recent call last):
  File "vgg16-local-connections.py", line 352, in <module>
    model = VGG_16_local_connections()
  File "vgg16-local-connections.py", line 40, in VGG_16_local_connections
    out = Activation('relu')(z)
  File "/Users/klab/anaconda2/lib/python2.7/site-packages/keras/engine/topology.py", line 519, in __call__
    input_shapes.append(K.int_shape(x_elem))
  File "/Users/klab/anaconda2/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py", line 409, in int_shape
    shape = x.get_shape()
AttributeError: 'numpy.ndarray' object has no attribute 'get_shape'

因此,z 的数据类型与 Functional API 的数据类型不匹配。我怎样才能解决这个问题?任何帮助将不胜感激!

【问题讨论】:

    标签: keras conv-neural-network keras-layer


    【解决方案1】:

    我想你的意思是:

    out = Activation('relu')(z[k - 1])
    

    您的代码将带有所有层的整个向量 z 设置为 Activation 的输入,而 Keras 不知道如何处理。

    【讨论】:

    • 实际上,我希望整个堆栈都有一个 ReLU 激活,我认为只需调用 z 就足够了。后来我意识到我的错误,并在out = Activation('relu')(z) 行之前添加了z = keras.layers.concatenate([z[i] for i in range (0,k)], axis=1),并且效果很好。
    【解决方案2】:

    由于我将z[i]-s 定义为单独的层,我认为z 将实际上是那些z[i]-s 的堆栈。但是,它们基本上必须连接起来才能形成我想要的堆栈,

    z = keras.layers.concatenate([z[i] for i in range (0,k)], axis=1)
    out = Activation('relu')(z)
    

    由于我使用的是data_format='channels_first',所以连接是用axis=1完成的,但对于更常见的data_format='channels_last',连接必须用axis=3完成。

    【讨论】:

      猜你喜欢
      • 2019-05-07
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2021-02-22
      相关资源
      最近更新 更多