Tensorflow 2.0 输入正在创建,第一个形状元素为 None
Tensorflow 2.0 Input being creating with first shape element as None
我正在尝试通过以下方式创建输入:
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)
非常感谢阅读,非常感谢任何帮助解决这个问题的方法。
您的 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_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')
我正在尝试通过以下方式创建输入:
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)
非常感谢阅读,非常感谢任何帮助解决这个问题的方法。
您的 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_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')