-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathmodel.py
More file actions
69 lines (50 loc) · 2.97 KB
/
model.py
File metadata and controls
69 lines (50 loc) · 2.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import tensorflow
from tensorflow import keras
from tensorflow.keras import Model, layers
from tensorflow.keras.layers import Dense, Dropout, Conv2D
from tensorflow.keras.layers import LSTM, TimeDistributed, Bidirectional
from tensorflow.keras.constraints import max_norm
class CNN_BLSTM(object):
def __init__(self):
print('CNN_BLSTM init')
def build(self):
_input = keras.Input(shape=(None, 80))
n_classes = 4 # emo_label = ['Angry', 'Happy', 'Surprise', 'Sad']
_input2 = Dense(257)(_input)
re_input = layers.Reshape((-1, 257, 1), input_shape=(-1, 257))(_input2)
# CNN
conv1 = (Conv2D(16, (3,3), strides=(1, 1), activation='relu', padding='same'))(re_input)
conv1 = (Conv2D(16, (3,3), strides=(1, 1), activation='relu', padding='same'))(conv1)
conv1 = (Conv2D(16, (3,3), strides=(1, 3), activation='relu', padding='same'))(conv1)
conv2 = (Conv2D(32, (3,3), strides=(1, 1), activation='relu', padding='same'))(conv1)
conv2 = (Conv2D(32, (3,3), strides=(1, 1), activation='relu', padding='same'))(conv2)
conv2 = (Conv2D(32, (3,3), strides=(1, 3), activation='relu', padding='same'))(conv2)
conv3 = (Conv2D(64, (3,3), strides=(1, 1), activation='relu', padding='same'))(conv2)
conv3 = (Conv2D(64, (3,3), strides=(1, 1), activation='relu', padding='same'))(conv3)
conv3 = (Conv2D(64, (3,3), strides=(1, 3), activation='relu', padding='same'))(conv3)
conv4 = (Conv2D(128, (3,3), strides=(1, 1), activation='relu', padding='same'))(conv3)
conv4 = (Conv2D(128, (3,3), strides=(1, 1), activation='relu', padding='same'))(conv4)
conv4 = (Conv2D(128, (3,3), strides=(1, 3), activation='relu', padding='same'))(conv4)
re_shape = layers.Reshape((-1, 4*128), input_shape=(-1, 4, 128))(conv4)
# BLSTM
blstm1 = Bidirectional(
LSTM(128, return_sequences=True, dropout=0.3,
recurrent_dropout=0.3, recurrent_constraint=max_norm(0.00001)),
merge_mode='concat')(re_shape)
# DNN
flatten = TimeDistributed(layers.Flatten())(blstm1)
dense1=TimeDistributed(Dense(128, activation='relu'))(flatten)
dense1=Dropout(0.3)(dense1)
# TODO add emotion classfication layer
# BLSTM
blstm2 = Bidirectional(
LSTM(128, dropout=0.3,
recurrent_dropout=0.3, recurrent_constraint=max_norm(0.00001)),
merge_mode='concat')(re_shape)
dense2 = Dense(n_classes, activation = 'softmax', name = 'class')(Dropout(0.3)(blstm2))
frame_score=TimeDistributed(Dense(1), name='frame')(dense1)
average_score=layers.GlobalAveragePooling1D(name='avg')(frame_score)
# TODO add output layer to predict emotion class
out_class = dense2
model = Model(outputs=[average_score, frame_score, out_class], inputs=_input)
return model