Таким образом, проблема заключалась, в конечном счете, в связи между сверткой kernel_size и шагами (более подробное объяснение каждого термина см. В разделе Conv3DTranspose здесь https://keras.io/layers/convolutional/). Плотный слой был просто отличным для начала.
В исходном коде следующие строки Conv3DTranspose для kernel_size не охватывают шаг по направлению высоты (5 <6) и ширине (5 <19) </p>
model.add(layers.Conv3DTranspose(128, (2, 5, 5), strides=(1, 6, 1), padding='same', use_bias=False))
model.add(layers.Conv3DTranspose(128, (2, 5, 5), strides=(1, 3, 19), padding='same', use_bias=False))
Проблема решена, убедившись, что минимальные размеры kernel_size соответствуют выбранным размерам шагов. Вот исправленный код:
from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
tf.__version__
import numpy as np
import os
from tensorflow.keras import layers
import librosa
import librosa.display
import matplotlib.pyplot as plt
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
sr = 44100/2
sample_path = os.getcwd()
def make_generator_model():
model = tf.keras.Sequential()
model.add(layers.Dense(2*7*19*128, use_bias=False, dtype='float32', input_shape=(50,)))
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Reshape((2 ,7, 19, 128)))
assert model.output_shape == (None,2, 7, 19, 128) # Note: None is the batch size
model.add(layers.Conv3DTranspose(128, (1, 6, 1), strides=(1, 6, 1), padding='same', use_bias=False))
assert model.output_shape == (None, 2, 42, 19, 128)
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Conv3DTranspose(128, (1, 3, 19), strides=(1, 3, 19), padding='same', use_bias=False))
assert model.output_shape == (None, 2, 126, 361, 128)
model.add(layers.BatchNormalization())
model.add(layers.LeakyReLU())
model.add(layers.Conv3DTranspose(1, (1, 2, 1), strides=(1, 2, 1), padding='same', use_bias=False, activation='tanh'))
assert model.output_shape == (None, 2, 252, 361, 1)
return model
generator = make_generator_model()
noise = tf.random.normal([1, 50])
generated_audio = generator(noise, training=False)
D = []
for x in range(len(generated_audio[0][0])):
this_line = []
for y in range(len(generated_audio[0][0][x])):
this_line.append(np.complex(generated_audio[0][0][x][y],generated_audio[0][1][x][y]))
D.append(this_line)
D = np.asarray(D)
librosa.display.specshow(librosa.amplitude_to_db(np.abs(D), ref=np.max),
sr=sr, x_axis='time', y_axis='cqt_note')
plt.axis('off')
plt.savefig(sample_path + '\\image_at_epoch_fuzz.png')
plt.show()
print(D.shape)
результат: