python版本的tensorflow-CNN的简易多分类

首先还是推荐大家去tensorflow官网去看一下,或者中文社区的tensorflow官网
如何用Python搭建一个简易的多分类模型
首先大家得先安装上tensorflow,版本是1.4.1的,我用的Python版本是3.6的,高版本是潮流了,其他的配置包是anaconda3.6上的
假设我有个test.csv文件,这个文件是2706维度的,其中2704维度是特征,2维度为label,就是个二分了,多维就是多分的了,其实本来这个特征是3k多维,用来卡方检验之后特意减少到2706维,为了方便后面的网络搭建,

import tensorflow as tf
#这个是用于分开训练样本和测试样本的,也可以自己随机分开也可以
from sklearn import cross_validation
import pandas as pd

上面就是简单的导入一些包,这里我们只用到了这几个

pp = test.csv
#特征的列名为label0,label1,两维
data_label = pd.read_csv(pp)
X_train,X_test, y_train, y_test =\
    cross_validation.train_test_split(data_label.iloc[:,0:2704],data_label.iloc[:,2704:],test_size=0.2, random_state=0)
train = X_train.append(y_train)
test = X_test.append(y_test)

上面就是将测试集和训练集分开的,其实后面的append可以不用添加的,只是为了后面统一才这个处理了一下
下面直接上代码

#这里的定义可以省去with的会话模式,tensorflow上有介绍,这种sess的定义
sess=tf.InteractiveSession()
# 定义权重和偏置的初始化函数
def weight_varible(shape):
    initial=tf.truncated_normal(shape,stddev=0.2)#stddev表示标准差
    return tf.Variable(initial)
def bias_variable(shape):
    # 给偏置增加一些小的正值(0.1)
    initial=tf.constant(0.5,shape=shape)
    return tf.Variable(initial)
# 定义卷积层和池化层的初始化函数
def conv2d(x,W):
    return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')
def max_pool_2x2(x):
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
# 定义输入的placeholder,占位符
x=tf.placeholder(tf.float32,[None,2704])#特征
y_=tf.placeholder(tf.float32,[None,2])#train的label
W_conv1=weight_varible([5,5,1,32])
b_conv1=bias_variable([32])
h_conv1=tf.nn.relu(conv2d(x_image,W_conv1)+b_conv1) 
h_pool1=max_pool_2x2(h_conv1)#使用最大池化函数max_pool_2x2函数对卷积的输出结果进行池化操作
W_conv2=weight_varible([5,5,32,64]) 
b_conv2=bias_variable([64])
h_conv2=tf.nn.relu(conv2d(h_pool1,W_conv2)+b_conv2)
h_pool2=max_pool_2x2(h_conv2)
# 经过两次步长为2*2的最大池化,现在边长已经只有1/4了。这里就是52/4 方便取个整数的,实际应用时还应该理解卷积块的大小和strides 步长的定义和padding填充模式的定义
# 定义一个全连接层
W_fc1=weight_varible([13*13*64,1024])  # 全连接层隐含节点为1024个
b_fc1=bias_variable([1024])
h_pool2_flat=tf.reshape(h_pool2,[-1,13*13*64]) 
h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1)+b_fc1)
# 为了减轻过拟合,下面使用一个dropout层
keep_prob=tf.placeholder(tf.float32)
h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)
# 将dropout层的输出连接一个softmax层,得到最后的概率输出
W_fc2=weight_varible([1024,2])
b_fc2=bias_variable([2])
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop,W_fc2)+b_fc2)
# 定义损失函数为cross entronpy,优化器使用Adam
cross_entropy=tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y_conv),reduction_indices=[1]))
train_step=tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)  # 学习率为1e-4
# 定义评测准确率的操作
corret_prediction=tf.equal(tf.argmax(y_conv,1),tf.argmax(y_,1))
accuracy=tf.reduce_mean(tf.cast(corret_prediction,tf.float32))
# 开始训练过程
tf.global_variables_initializer().run()
#为了持久化操作加的,可以不加
#saver = tf.train.Saver()
#saver.save(sess, 'log/model.ckpt')
for i in range(20000):  # 进行20000次迭代训练
    # 初始化所有参数,设置dropout的keep_drop为0.5,这里用sample取batch的为50个每次
    batch=train.sample(n=50,replace = False)
    if i%100==0:  # 每进行100次训练,对准确率进行一次评测。评测时keep_prob设为1
        train_accuracy=accuracy.eval(feed_dict={x:batch.iloc[:,0:2704],y_:batch.iloc[:,2704:],keep_prob:1.0})
        print("step %d,training accurancy %g"%(i,train_accuracy))
    train_step.run(feed_dict={x:batch.iloc[:,0:2704],y_:batch.iloc[:,2704:],keep_prob:0.5})
print("accuracy %g"%accuracy.eval(feed_dict={x:test.iloc[:,0:2704],y_:test.iloc[:,2704:],keep_prob:1.0}))

其实内部的这些参数具体是多少需要自己简单了解一下CNN的卷积和池化操作,因为不用考虑反向传播误差的传递,这个其实就是一些加减乘除,
可以加入持久化操作,比较训练模型就是为了后续load用的,也可以加入TensorBoard,可视化流程还是挺不错的,本次模型比较简单,所有就没添加

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用LSTM模型进行微博文本csv文件情感分类的代码,其中使用了Keras框架和tensorflow作为后端: ``` import pandas as pd import numpy as np from keras.utils import to_categorical from keras.preprocessing.text import Tokenizer from keras.preprocessing.sequence import pad_sequences from keras.models import Sequential from keras.layers import Embedding, LSTM, Dense # 读取csv文件 df = pd.read_csv('weibo.csv') # 将情感标签转化为数字 df['sentiment'] = df['sentiment'].replace({'positive': 1, 'negative': 0}) # 分离文本和情感标签 X = df['review'].values y = df['sentiment'].values # 对文本进行分词和序列化 tokenizer = Tokenizer(num_words=5000) tokenizer.fit_on_texts(X) X = tokenizer.texts_to_sequences(X) # 对序列进行填充 X = pad_sequences(X, maxlen=50) # 对情感标签进行独热编码 y = to_categorical(y) # 构建LSTM模型 model = Sequential() model.add(Embedding(input_dim=5000, output_dim=50, input_length=50)) model.add(LSTM(units=256, dropout=0.2, recurrent_dropout=0.2)) model.add(Dense(units=2, activation='softmax')) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(X, y, batch_size=128, epochs=10, validation_split=0.2) # 保存模型 model.save('weibo_lstm.h5') ``` 这段代码首先读取了一个名为weibo.csv的csv文件,并将其中的情感标签(positive或negative)转换为数字(1或0),然后对文本进行分词和序列化,并对情感标签进行独热编码。接着,使用Keras框架构建了一个包含Embedding层、LSTM层和Dense层的模型,并编译了模型。最后,使用训练集对模型进行训练,并将训练好的模型保存为weibo_lstm.h5文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xuxixixixixixix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值