【问题标题】:Tensorflow 2.0 Input being creating with first shape element as NoneTensorflow 2.0 输入正在创建,第一个形状元素为无
【发布时间】:2019-10-14 12:33:51
【问题描述】:

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

    Tx = 318
    n_freq = 101
    input_anchor = Input(shape=(n_freq,Tx), name='input_anchor')

当我跑步时:

    input_anchor.shape

我明白了:

    TensorShape([None, 101, 318])

稍后当我尝试在我的模型中使用该输入时,我收到以下错误:

    TypeError: Cannot iterate over a tensor with unknown first dimension.

Tensor flow's opy.py 我发现这个代码块很可能是我的代码失败的地方:

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

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

    def base_model(input_shape):

        X_input = Input(shape = input_shape)


        # Step 1: CONV layer (≈4 lines)
        X = Conv1D(196,kernel_size = 15, strides = 4)(X_input)                                 # CONV1D
        X = BatchNormalization()(X)                                 # Batch normalization
        X = Activation('relu')(X)                                 # ReLu activation
        X = Dropout(rate = 0.2)(X)                                 # dropout (use 0.8)

        # Step 2: First GRU Layer (≈4 lines)
        X = LSTM(units = 128, return_sequences = True)(X_input)                                 # GRU (use 128 units and return the sequences)
        X = Dropout(rate = 0.2)(X)                                 # dropout (use 0.8)
        X = BatchNormalization()(X)                                 # Batch normalization

        # Step 3: Second GRU Layer (≈4 lines)
        X = LSTM(units = 128, return_sequences = True)(X)                                 # GRU (use 128 units and return the sequences)
        X = Dropout(rate = 0.2)(X)                                 # dropout (use 0.8)
        X = BatchNormalization()(X)                                 # Batch normalization
        X = Dropout(rate = 0.2)(X)                                 # dropout (use 0.8)

        # Step 4: Third GRU Layer (≈4 lines)
        X = LSTM(units = 128)(X)                                 # GRU (use 128 units and return the sequences)
        X = Dropout(rate = 0.2)(X)                                 # dropout (use 0.8)
        X = BatchNormalization()(X)                                 # Batch normalization
        X = Dropout(rate = 0.2)(X)                                 # dropout (use 0.8)

        X = Dense(64)(X)

        base_model = Model(inputs = X_input, outputs = X)

        return base_model  

    def speech_model(input_shape, base_model):

        #get triplets vectors
        input_anchor = Input(shape=input_shape, name='input_anchor')
        input_positive = Input(shape=input_shape, name='input_positive')
        input_negative = Input(shape=input_shape, name='input_negative')

        vec_anchor = base_model(input_anchor)
        vec_positive = base_model(input_positive)
        vec_negative = base_model(input_negative)

        #Concatenate vectors vec_positive, vec_negative
        concat_layer = concatenate([vec_anchor,vec_positive,vec_negative], axis = -1, name='concat_layer')

        model = Model(inputs = [input_anchor,input_positive,input_negative], outputs = concat_layer, name = 'speech_to_vec')
        #model = Model(inputs = [input_anchor,input_positive,input_negative], outputs = [vec_anchor,vec_positive,vec_negative], name = 'speech_to_vec')
        #model = Model(inputs = [input_anchor,input_positiv], outputs=vec_anchor)


        return model  

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


    speech_model = speech_model(input_shape = (n_freq, Tx), base_model = base_model)

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

【问题讨论】:

    标签: python tensorflow machine-learning deep-learning tensorflow2.0


    【解决方案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)
    

    另外,由于concatenate不能concat多个模型类型,所以需要更正最终模型的输入输出。

    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')
    

    【讨论】:

      猜你喜欢
      • 2020-11-16
      • 2020-09-09
      • 2016-07-30
      • 2021-05-29
      • 1970-01-01
      • 2018-08-23
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多