CNN на tfidf как вход - PullRequest
       81

CNN на tfidf как вход

1 голос
/ 19 июня 2020

Я работаю над обнаружением фейковых новостей с помощью CNN, я новичок в кодировании CNN в keras и tensorflow. Мне нужна помощь в создании CNN, которая принимает входные данные в виде операторов в форме векторов длиной 100 и выводит 0 или 1 в зависимости от его прогнозируемого значения как ложное или истинное.

X_train.shape
# 10229, 100

X_train = np.expand_dims(X_train, axis=2)
X_train.shape
# 10229,100,1

# actual cnn model here
import tensorflow as tf
from tensorflow.keras import layers

# Conv1D + global max pooling

from keras.layers import Conv1D, MaxPooling1D, Embedding, Dropout, Flatten, Dense
from keras.layers import Input
text_len=100
from keras.models import Model

inp = Input(batch_shape=(None, text_len, 1))
conv2 = Conv1D(filters=128, kernel_size=5, activation='relu')(inp)
drop21 = Dropout(0.5)(conv2)
conv22 = Conv1D(filters=64, kernel_size=5, activation='relu')(drop21)
drop22 = Dropout(0.5)(conv22)
pool2 = MaxPooling1D(pool_size=2)(drop22)
flat2 = Flatten()(pool2)
out = Dense(1, activation='softmax')(flat2)

model = Model(inp, out)
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
model.fit(X_train, Y_train)

Я буду очень признателен, если кто-то мог бы дать мне рабочий код для этого с небольшими пояснениями

1 Ответ

1 голос
/ 19 июня 2020

в этом фиктивном примере я использую Conv1D с 2D функциями. Conv1D принимает в качестве входных последовательностей в 3D формате (n_samples, time_steps, features). Если вы используете 2D-функции, вам необходимо адаптировать их к 3D. нормальным выбором является рассмотрение ваших функций, поскольку это просто расширение временного измерения (expand_dims на оси 1), нет причин предполагать позиционный / временной шаблон для tfidf / one-hot features.

Когда вы создаете свою NN вы начинаете с трехмерного измерения и должны переходить к 2D. для перехода от 3D к 2D есть много возможностей, простой пост является сглаженным, с 1 временным затемнением слой объединения бесполезен. если вы используете softmax в качестве последнего слоя активации, не забудьте передать вашему плотному слою размерность, равную количеству ваших классов

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras.models import *

## define variable
n_sample = 10229
text_len = 100

## create dummy data
X_train = np.random.uniform(0,1, (n_sample,text_len))
y_train = np.random.randint(0,2, n_sample)

## expand train dimnesion: pass from 2d to 3d
X_train = np.expand_dims(X_train, axis=1)
print(X_train.shape, y_train.shape)

## create model
inp = Input(shape=(1,text_len))
conv2 = Conv1D(filters=128, kernel_size=5, activation='relu', padding='same')(inp)
drop21 = Dropout(0.5)(conv2)
conv22 = Conv1D(filters=64, kernel_size=5, activation='relu', padding='same')(drop21)
drop22 = Dropout(0.5)(conv22)
pool2 = Flatten()(drop22) # this is an option to pass from 3d to 2d
out = Dense(2, activation='softmax')(pool2) # the output dim must be equal to the num of class if u use softmax

model = Model(inp, out)
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
model.fit(X_train, y_train, epochs=5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...