首页 > 解决方案 > 如何将最终的密集层写入“接受”(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

标签: pythontensorflowkeras

解决方案


试试这个:

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)

推荐阅读