首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CNN on tfidf作为输入

CNN on tfidf作为输入
EN

Stack Overflow用户
提问于 2020-06-20 01:43:23
回答 1查看 467关注 0票数 1

我正在使用CNN进行假新闻检测,我对在keras和tensorflow中编码CNN是个新手。我需要关于创建CNN的帮助,该CNN将输入作为语句的形式,每个向量的长度为100,输出0或1取决于其预测值为false或true。

代码语言:javascript
复制
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)

如果有人能给我一点解释的工作代码,我将不胜感激

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-20 02:39:01

在这个虚拟示例中,我使用了一个具有2D特性的Conv1D。Conv1D接受3D格式(n_samples、time_steps、features)的输入序列。如果您正在使用2D功能,则必须将其调整为3D功能。通常的选择是考虑你的特征,简单地扩展时间维度(轴1上的expand_dims),没有理由假设tfidf/one-hot特征的位置/时间模式。

当你建立你的神经网络时,你从3D维度开始,你必须通过2D。从3D过渡到2D有很多可能性,简单的帖子是扁平化的,1个时间暗淡的池化层是无用的。如果您使用softmax作为最后一个激活层,请记住将一个维度传递给您的密集层,该维度等于您的类数

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62475807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档