def predict(word_indices, model, builder, target): """ predict demographic label :param word_indices: :param model: :param builder: :return: tag and label predictions """ forward_states = build_tagging_graph(word_indices, model, builder) final_state = forward_states[-1] H = pycnn.parameter(pH) bias_H = pycnn.parameter(biasH) H2 = pycnn.parameter(pH2) bias_H2 = pycnn.parameter(biasH2) if target in ['age', 'both', 'joint']: O = pycnn.parameter(pOutAge) bias_O = pycnn.parameter(biasOutAge) elif target == 'gender': O = pycnn.parameter(pOutGender) bias_O = pycnn.parameter(biasOutGender) if target == 'both': O2 = pycnn.parameter(pOutGender) bias_O2 = pycnn.parameter(biasOutGender) if target == 'both': # hidden = bias_H2 + pycnn.tanh(H2 * (bias_H + pycnn.tanh(H * final_state))) hidden = bias_H + pycnn.rectify(H * final_state) r_age = bias_O + (O * hidden) r_gender = bias_O2 + (O2 * hidden) out_age = pycnn.softmax(r_age) out_gender = pycnn.softmax(r_gender) return [np.argmax(out_age.npvalue()), np.argmax(out_gender.npvalue())] else: # r_t = bias_O + (O * (bias_H2 + pycnn.tanh(H2 * (bias_H + pycnn.tanh(H * final_state))))) r_t = bias_O + (O * (bias_H + pycnn.rectify(H * final_state))) out = pycnn.softmax(r_t) chosen = np.argmax(out.npvalue()) return chosen
def fit(word_indices, label, model, builder, target): """ compute joint error of the :param word_indices: list of indices :param label: index :param model: current model to access parameters :param builder: builder to create state combinations :return: joint error """ forward_states = build_tagging_graph(word_indices, model, builder) # retrieve model parameters final_state = forward_states[-1] # final_state = pycnn.dropout(final_state, 0.1) # print("final state", final_state, file=sys.stderr) H = pycnn.parameter(pH) bias_H = pycnn.parameter(biasH) H2 = pycnn.parameter(pH2) bias_H2 = pycnn.parameter(biasH2) if target in ['age', 'joint']: O = pycnn.parameter(pOutAge) bias_O = pycnn.parameter(biasOutAge) elif target == 'gender': O = pycnn.parameter(pOutGender) bias_O = pycnn.parameter(biasOutGender) # print(pycnn.cg().PrintGraphviz()) # if target == 'both': # hidden = bias_H + pycnn.tanh(H * final_state) # r_age = bias_O + (O * hidden) # r_gender = bias_O2 + (O2 * hidden) # return pycnn.esum([pycnn.pickneglogsoftmax(r_age, label[0]), pycnn.pickneglogsoftmax(r_gender, label[1])]) # r_t = bias_O + (O * (bias_H2 + pycnn.tanh(H2 * (bias_H + pycnn.tanh(H * final_state))))) r_t = bias_O + (O * (bias_H + pycnn.rectify(H * final_state))) # return pycnn.pick(r_t, label) return pycnn.pickneglogsoftmax(r_t, label)