使用第一个形状元素作为 None 创建 Tensorflow 2.0 输入

Seb*_*ado 5 python machine-learning deep-learning tensorflow tensorflow2.0

我正在尝试通过以下方式创建输入:

\n\n
    Tx = 318\n    n_freq = 101\n    input_anchor = Input(shape=(n_freq,Tx), name=\'input_anchor\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我跑步时:

\n\n
    input_anchor.shape\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到:

\n\n
    TensorShape([None, 101, 318])\n
Run Code Online (Sandbox Code Playgroud)\n\n

后来,当我尝试在模型中使用该输入时,出现以下错误:

\n\n
    TypeError: Cannot iterate over a tensor with unknown first dimension.\n
Run Code Online (Sandbox Code Playgroud)\n\n

张量流的 opy.py中,我发现这个代码块很可能是我的代码失败的地方:

\n\n
     def __iter__(self):\n        if not context.executing_eagerly():\n          raise TypeError(\n              "Tensor objects are only iterable when eager execution is "\n              "enabled. To iterate over this tensor use tf.map_fn.")\n        shape = self._shape_tuple()\n        if shape is None:\n          raise TypeError("Cannot iterate over a tensor with unknown shape.")\n        if not shape:\n          raise TypeError("Cannot iterate over a scalar tensor.")\n        if shape[0] is None:\n          raise TypeError(\n              "Cannot iterate over a tensor with unknown first dimension.")\n        for i in xrange(shape[0]):\n          yield self[i]\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果你想在这里看到我的整个模型实现,那就是:

\n\n
    def base_model(input_shape):\n\n        X_input = Input(shape = input_shape)\n\n\n        # Step 1: CONV layer (\xe2\x89\x884 lines)\n        X = Conv1D(196,kernel_size = 15, strides = 4)(X_input)                                 # CONV1D\n        X = BatchNormalization()(X)                                 # Batch normalization\n        X = Activation(\'relu\')(X)                                 # ReLu activation\n        X = Dropout(rate = 0.2)(X)                                 # dropout (use 0.8)\n\n        # Step 2: First GRU Layer (\xe2\x89\x884 lines)\n        X = LSTM(units = 128, return_sequences = True)(X_input)                                 # GRU (use 128 units and return the sequences)\n        X = Dropout(rate = 0.2)(X)                                 # dropout (use 0.8)\n        X = BatchNormalization()(X)                                 # Batch normalization\n\n        # Step 3: Second GRU Layer (\xe2\x89\x884 lines)\n        X = LSTM(units = 128, return_sequences = True)(X)                                 # GRU (use 128 units and return the sequences)\n        X = Dropout(rate = 0.2)(X)                                 # dropout (use 0.8)\n        X = BatchNormalization()(X)                                 # Batch normalization\n        X = Dropout(rate = 0.2)(X)                                 # dropout (use 0.8)\n\n        # Step 4: Third GRU Layer (\xe2\x89\x884 lines)\n        X = LSTM(units = 128)(X)                                 # GRU (use 128 units and return the sequences)\n        X = Dropout(rate = 0.2)(X)                                 # dropout (use 0.8)\n        X = BatchNormalization()(X)                                 # Batch normalization\n        X = Dropout(rate = 0.2)(X)                                 # dropout (use 0.8)\n\n        X = Dense(64)(X)\n\n        base_model = Model(inputs = X_input, outputs = X)\n\n        return base_model  \n\n    def speech_model(input_shape, base_model):\n\n        #get triplets vectors\n        input_anchor = Input(shape=input_shape, name=\'input_anchor\')\n        input_positive = Input(shape=input_shape, name=\'input_positive\')\n        input_negative = Input(shape=input_shape, name=\'input_negative\')\n\n        vec_anchor = base_model(input_anchor)\n        vec_positive = base_model(input_positive)\n        vec_negative = base_model(input_negative)\n\n        #Concatenate vectors vec_positive, vec_negative\n        concat_layer = concatenate([vec_anchor,vec_positive,vec_negative], axis = -1, name=\'concat_layer\')\n\n        model = Model(inputs = [input_anchor,input_positive,input_negative], outputs = concat_layer, name = \'speech_to_vec\')\n        #model = Model(inputs = [input_anchor,input_positive,input_negative], outputs = [vec_anchor,vec_positive,vec_negative], name = \'speech_to_vec\')\n        #model = Model(inputs = [input_anchor,input_positiv], outputs=vec_anchor)\n\n\n        return model  \n
Run Code Online (Sandbox Code Playgroud)\n\n

以及打破这一切并产生前面提到的错误的行

\n\n
\n    speech_model = speech_model(input_shape = (n_freq, Tx), base_model = base_model)\n
Run Code Online (Sandbox Code Playgroud)\n\n

非常感谢您的阅读,非常感谢任何解决此问题的帮助。

\n

gis*_*ang 1

您的base_model(input_shape)函数要求您传入tuple,但您传递Input Layer给了它。

# change
vec_anchor = base_model(input_anchor)
vec_positive = base_model(input_positive)
vec_negative = base_model(input_negative)
# to
vec_anchor = base_model(input_shape)
vec_positive = base_model(input_shape)
vec_negative = base_model(input_shape)
Run Code Online (Sandbox Code Playgroud)

此外,由于concatenate无法连接多个模型类型,因此您需要更正最终模型的输入和输出。

concat_layer = concatenate([vec_anchor.output,vec_positive.output,vec_negative.output], axis = -1, name='concat_layer')

model = Model(inputs = [vec_anchor.input,vec_positive.input,vec_negative.input], outputs = concat_layer, name = 'speech_to_vec')
Run Code Online (Sandbox Code Playgroud)