在过去的两天里,我真的一直在努力解决这个问题。我创建了一个文件
test.py
通过预测单个样本来测试我的模型:
import os
import keras
import numpy as np
import tensorflow as tf
from main_copy import path_to_fft
model = keras.models.load_model(os.path.join(os.getcwd(), "model.keras"))
model.summary()
model.summary(expand_nested=True)
first_sample = path_to_fft(os.path.join(os.getcwd(), 'Sounds', 'Thomas', 'thomas_original.wav'))
second_sample = path_to_fft(os.path.join(os.getcwd(), 'Sounds', 'Thomas', 'thomas_original.wav'))
print("First: ", first_sample.shape)
print("Second: ", second_sample.shape)
prediction = model.predict([first_sample, second_sample])
print(prediction)
path_to_fft
函数解码 .wav 文件并应用快速傅立叶变换,然后返回该变换的正频率的前半部分,将 5 秒 16kHz 音频从形状 (80000, 1) 变换为 (40000, 1) ,这是适合我的模型的尺寸。但是,当我尝试使用 model.predict
预测两个样本之间的距离时,我收到以下错误消息:
Model: "functional"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Layer (type) ┃ Output Shape ┃ Param # ┃ Connected to ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ InputA (InputLayer) │ (None, 40000, 1) │ 0 │ - │
├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤
│ InputB (InputLayer) │ (None, 40000, 1) │ 0 │ - │
├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤
│ SiameseBranch (Functional) │ (None, 32) │ 14,003,824 │ InputA[0][0], InputB[0][0] │
├───────────────────────────────┼───────────────────────────┼─────────────────┼────────────────────────────┤
│ lambda (Lambda) │ (None, 1) │ 0 │ SiameseBranch[0][0], │
│ │ │ │ SiameseBranch[1][0] │
└───────────────────────────────┴───────────────────────────┴─────────────────┴────────────────────────────┘
Input 0 of layer "SiameseBranch" is incompatible with the layer: expected shape=(None, 40000, 1), found shape=(32, 1)
Arguments received by Functional.call():
• inputs=('tf.Tensor(shape=(32, 1), dtype=float32)', 'tf.Tensor(shape=(32, 1), dtype=float32)')
• training=False
• mask=('None', 'None')
当我向上滚动时,我看到 Tensorflow 生成了三个(??????)参数?:
Level 1:tensorflow:Creating new FuncGraph for Python function <function StructuredFunctionWrapper.__init__.<locals>.trace_tf_function.<locals>.wrapped_fn at 0x0000027A795AE480> (key: FunctionContext(context=EagerContext(parent_graph=None, device_functions=(), colocation_stack=(), in_cross_replica_context=False, variable_policy=None, xla_context_id=0), scope_type=<ScopeType.VARIABLE_CREATION: 2>), Input Parameters:
args_0 (POSITIONAL_ONLY): TensorSpec(shape=(32,), dtype=tf.int64, name=None)
args_1 (POSITIONAL_ONLY): TensorSpec(shape=(40000, 1), dtype=tf.float32, name=None)
args_2 (POSITIONAL_ONLY): TensorSpec(shape=(40000, 1), dtype=tf.float32, name=None)
Output Type:
None
Captures:
None)
我完全不知道该怎么做或如何处理这些错误日志。这是我第一次使用已保存为文件的模型,这绝对是一场噩梦。
作为参考,这里是 GitHub 存储库的链接(包含用于拟合模型和模型本身的
path_to_fft
函数和代码):https://github.com/brainage04/WestpacHackathon
这是运行
test.py
函数的完整错误日志,从开始到结束:https://pastebin.com/iVZ7dUWn
您的数据形状不正确,缺少批量维度,对于单个数据点,形状应该是
(1, 40000, 1)
。