Вы можете использовать K.dot()
напрямую. Поскольку вы уже используете K.l2_normalize
, результатом умножения матриц является близость косинуса.
from keras.models import Model
import keras.backend as K
from keras.layers import Lambda,Input
import numpy as np
N = 100
def dot_similarity(jdes):
jdes = K.l2_normalize(jdes, axis=-1) # (?, 100)
# define it myself
jt_six = K.constant(np.random.uniform(0, 1, size=(6, N)))
jt_six = K.l2_normalize(K.variable(jt_six), axis=-1) # (6, 100)
return K.dot(jdes,K.transpose(jt_six))
jdes = Input(shape=(N,))
result = Lambda(dot_similarity)(jdes)
model = Model(jdes,result)
print(model.summary())
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 100) 0
_________________________________________________________________
lambda_1 (Lambda) (None, 6) 0
=================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0
_________________________________________________________________
Следующий код должен работать на 90-95% гарнитур там та поддержка JSR-135. Упорядочивание всех различных вызовов метода является ключевым, чтобы это было портативно. Это для звуков, локальных для Вашего JAR. Любое переданное потоком аудио было бы другой проблемой в целом :)
// loads the InputStream for the sound
InputStream inputStream = this.getClass().getResourceAsStream( musicFile );
// create the standard Player
musicPlayer = Manager.createPlayer( inputStream, musicEncoding );
musicPlayer.prefetch();
// add player listener to access sound events
musicPlayer.addPlayerListener( this );
if( loopMusic )
{
// use the loop count method for infinite looping
musicPlayer.setLoopCount( -1 );
}
// The set occurs twice to prevent sound spikes at the very
// beginning of the sound.
VolumeControl volumeControl =
(VolumeControl) musicPlayer.getControl( "VolumeControl" );
volumeControl.setLevel( curVolume );
// finally start the piece of music
musicPlayer.start();
// set the volume once more
volumeControl = (VolumeControl) musicPlayer.getControl( "VolumeControl" );
volumeControl.setLevel( curVolume );
// finally, delete the input stream to save on resources
inputStream.close();
inputStream = null;
Лучшим, что Вы имеете в виду? Высшее качество? Лучший пользовательский опыт? Самый совместимый стандартами?
В основном (это не лучший вид ответа, который я знаю), он зависит от платформы - что-то, что это - знакомая тема с J2ME - так как реализации могут значительно различаться, и MMAPI обычно усиливает некоторое собственное программное обеспечение/аппаратные средства медиаплеера. На BlackBerry MMAPI работает отлично с несколькими причудами.
Мой совет состоит в том, чтобы использовать MMAPI, где он работает хорошо - он даст Вам самое портативное приложение. Экспериментируйте или просмотрите платы разработчика для своего определенного набора целевого устройства, чтобы видеть, как хорошо он функционирует на гарнитурах, которые Вы хотите поддерживать.
На некоторых устройствах с помощью запроса платформы заставит приложение закрываться, и на других определенные запросы платформы разрушат устройство (что-либо кроме URL HTTP на некоторых устройствах).
Таким образом, Вы, возможно, должны использовать оба подхода, выбирая который использовать на основе тестирования устройства.
Локальное аудио (в файле Банки) легче поддерживать, как объяснено в ответе Shane выше. Для содержания по сети это становится намного более твердым, поскольку много факторов как проблемы возможности соединения сервера, память гарнитур и т.д. играет роль. Если Вы будете обязаны поддерживать большое количество гарнитур затем его желательное для работы над 2-3 методами реализации и использованием соответственно.