python - 如何将最终的密集层写入“接受”(x,y)元组
问题描述
TL;DR:有输入(batch_size,128,60,41,2)
和标签(batch_size, 128)
,每个标签是0、1或2。网络输出应该如何/如何设计输出?
我正在将每个长度为 60 秒的音频剪辑转换为(128, 60, 41, 2)
*. 这是我的每个示例的特征数据。
至于标签,(128,)
对于我提取的 128 个事物中的每一个,我都有(每个示例)和 shape 数组。
所以一对(特征,标签)是 int form (feature={128, 60, 41,2}, label={128})
。
当我对数据进行批处理时,会附加特征和标签;例如,对于大小为 10 的批次:特征是形状:(10,128,60,41,2)
,标签是形状(10,128)
我澄清的问题是:我如何设计网络以根据此标签计算损失?
更长的版本:最后一个密集层应该有3
单元,每个类一个。现在,我有一批bs
物品。因此,我在 shape 中有标签(bs,128)
。如何设计网络来计算损失;第一批项目是形状(128,60,41,2)
,第一个项目的标签是形状(128,)
。其中的每个标签都是 0、1 或 2。现在我想计算以设计网络,使其最后输出的形状为(None, 128,3)
.
None 是批量大小,我提取的所有东西都是 128,而 3 因为我有三个类
编辑:谢谢你的笔记,我希望能澄清这个问题
*对于那些更感兴趣的人:我在时间轴上使用滑动窗口。对于每个窗口,我提取对数比例的频谱图。这里,128 是窗口数,60 和 41 控制 Mel 比例,2 用于添加增量维度。
生成音频的代码:
def sub_method(fn, label, bands, frames, delta):
def _windows(data, window_size):
start = 0
while start < len(data):
yield int(start), int(start + window_size)
start += (window_size // 2)
window_size = 512 * (frames - 1)
segment_log_specgrams, segment_labels = [], []
sound_clip,sr = librosa.load(fn)
for (start,end) in _windows(sound_clip,window_size):
if(len(sound_clip[start:end]) == window_size):
signal = sound_clip[start:end]
melspec = librosa.feature.melspectrogram(signal,n_mels=bands)
logspec = librosa.amplitude_to_db(melspec)
logspec = logspec.T.flatten()[:, np.newaxis].T
segment_log_specgrams.append(logspec)
segment_labels.append(label)
if delta:
segment_log_specgrams = np.asarray(segment_log_specgrams)
segment_log_specgrams = segment_log_specgrams.reshape(len(segment_log_specgrams),bands,frames,1)
segment_features = np.concatenate((segment_log_specgrams, np.zeros(np.shape(segment_log_specgrams))), axis=3)
for i in range(len(segment_features)):
segment_features[i, :, :, 1] = librosa.feature.delta(segment_features[i, :, :, 0])
else:
segment_features = segment_log_specgrams
if len(segment_features) > 0: # check for empty segments
return 1, segment_features, segment_labels
else:
return 0, 0, 0
解决方案
试试这个:
import tensorflow as tf
from tensorflow.keras.layers import Input, Dense, Reshape
from tensorflow.keras import Sequential
model = Sequential([
Reshape((128, -1), input_shape=(128, 60, 41, 2)),
Dense(3)
])
inp = tf.random.uniform([10, 128, 60, 41, 2], dtype=tf.float32)
labels = tf.random.uniform([10, 128], 0, 3, dtype=tf.int32)
pred = model(inp)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.fit(inp, labels)
推荐阅读
- kotlin - 将 Groovy 任务 build.gradle 转换为 kotlin kts 文件
- javascript - 一个对象如何既是字符串又不是字符串?
- sql - 尝试将 oracle sql 转换为 Sql Server 日期以进行迁移活动
- javascript - 如何修复 React Native Agora 异步错误
- c - 如何开发包含 PostGIS 库的 PostgreSQL 扩展
- ios - _dispatch_assert_queue_fail 在 iOS 14 上崩溃
- java - 如何将 .equals 答案(对或错)更改为(是或否)?
- proxy - {"message":"没有与这些值匹配的路由"}
- python - **AttributeError:“NoneType”错误。BS的问题
- mysql - 没有用户在线时MySql显示800个连接?