b***i 发帖数: 3043 | 1 假设是笔写数字识别的,我训练了400-25-10这样的三层(中间加了一层)。
那么,如果再训练一个字母的,假如是400-70-26个这样的。
那么,可以把两个网络合在一起吗?既可以识别数字,又可以识别字母?
变成400-95-36行吗? | L****8 发帖数: 3938 | 2 可以 需要把最后一两层重新训练
【在 b***i 的大作中提到】 : 假设是笔写数字识别的,我训练了400-25-10这样的三层(中间加了一层)。 : 那么,如果再训练一个字母的,假如是400-70-26个这样的。 : 那么,可以把两个网络合在一起吗?既可以识别数字,又可以识别字母? : 变成400-95-36行吗?
| s********k 发帖数: 6180 | 3 这个就是transfer learning吧,把400那层的输出当做embedding,直接用,下面怎么
改都可以
【在 b***i 的大作中提到】 : 假设是笔写数字识别的,我训练了400-25-10这样的三层(中间加了一层)。 : 那么,如果再训练一个字母的,假如是400-70-26个这样的。 : 那么,可以把两个网络合在一起吗?既可以识别数字,又可以识别字母? : 变成400-95-36行吗?
| s********k 发帖数: 6180 | 4 不过我觉得这个简单的累加25+70不太行,除非你不是全连接网络
【在 s********k 的大作中提到】 : 这个就是transfer learning吧,把400那层的输出当做embedding,直接用,下面怎么 : 改都可以
| i********s 发帖数: 6 | 5 在Coursera上有神经网络的课程,是Andrew Ng讲课。里面好像说这样的识别可以最后
用一层softmax函数来识别 | s********k 发帖数: 6180 | 6 softmax 是基本配置,但是不太明白楼主为什么要字母和数字分开training,可
以直接当做一个36类的softmax,否则就two stage来做先判断字母还是数字,在进一步
,不过网络结构没必要分别作
【在 i********s 的大作中提到】 : 在Coursera上有神经网络的课程,是Andrew Ng讲课。里面好像说这样的识别可以最后 : 用一层softmax函数来识别
| b***i 发帖数: 3043 | 7 问题是已经训练好的26和10两个网络能否合并识别36个字符。
【在 s********k 的大作中提到】 : softmax 是基本配置,但是不太明白楼主为什么要字母和数字分开training,可 : 以直接当做一个36类的softmax,否则就two stage来做先判断字母还是数字,在进一步 : ,不过网络结构没必要分别作
| s********k 发帖数: 6180 | 8 那你再在之前加一个binary 分类器吧,判别是字母还是数字,而不是像你这样涉及网络
【在 b***i 的大作中提到】 : 问题是已经训练好的26和10两个网络能否合并识别36个字符。
| m****o 发帖数: 182 | 9 应该是可以的。transfer learning做起来稍微比较麻烦一点。下面的程序极有可能不
能跑通,我直接在网页上写出来的。但是你可以知道我的意思。只获取数字和字母模型
的隐含层信息,然后把两个的最后两层concat在一起和输出层做一个全联接。训练的时
候冻结所有隐含层的权值更新。这样的话你只是训练最后一层即输出层的权值,速度应
该会快很多。如果效果不理想,可以在输出层之前再加上一层银行层。
import tensorflow as tf
from tensorflow.contrib.layers import fully_connected,
n_in = 28 * 28 # assuming the size of mnist
n_out = 10 + 26 # 0-9 + 'a'-'z'
n_hidden = 100 # assuming both models have two hidden layers with size = 100
with tf.Graph().as_default():
X = tf.placeholder(tf.float32, shape=[None, n_in], name='X')
y = tf.placeholder(tf.int64, shape=[None], name='y')
with tf.name_scope('model.digit'): # assuming this is the name space for
the digit model
letter_hidden1 = fully_connected(X, n_hidden, activation_fn=tf.nn.elu,
name='hidden1')
letter_hidden2 = fully_connected(letter_hidden1, n_hidden, activation_fn
=tf.nn.elu, scope='hidden2')
with tf.name_scope('model.character'): # assuming this is the name space
for the character model
character_hidden1 = fully_connected(X, n_hidden, activation_fn=tf.nn.elu
, name='hidden1')
character_hidden2 = fully_connected(character_hidden1, n_hidden,
activation=tf.nn.elu, scope='hidden2')
with tf.name_scope('combined'):
logits = fully_connected(tf.concat(letter_hidden2, character_hidden2), n
_out, activation_fn=None, scope='output')
with tf.name_scope('loss'):
xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y,
logits=logits)
loss = tf.reduce_mean(xentropy, name='loss')
train_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='
combined/output')
with tf.name_scope('train'):
optimizer = tf.train.GradientOptimizer(learning_rate=0.001)
train_op = optimizer.minimize(loss, var_list=train_vars)
letter_reuse_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,
scope='model.digit/hidden[12]')
letter_saver = tf.train.Saver(dict([(var.name, var.name) for var in letter
_reuse_vars]))
char_reuse_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,
scope='model.character/hidden[12]')
char_saver = tf.train.Saver(dict([(var.name, var.name) for var in char_
reuse_vars]))
saver = tf.train.Saver()
init = tf.global_variables_initializer()
with tf.Session() as sess:
init.run()
letter_saver.restore('./letter_dnn_model.ckpt')
char_saver.restore('./char_dnn_model.ckpt')
for epoch in range(100):
# get X_batch, y_batch from training data which is the mix of letters
and digits
sess.run(train_op, feed_dict={X:X_batch, y:y_batch})
saver.save(sess, 'combined_model.ckpt')
【在 b***i 的大作中提到】 : 假设是笔写数字识别的,我训练了400-25-10这样的三层(中间加了一层)。 : 那么,如果再训练一个字母的,假如是400-70-26个这样的。 : 那么,可以把两个网络合在一起吗?既可以识别数字,又可以识别字母? : 变成400-95-36行吗?
|
|