数据准备:http://www.manythings.org/anki/cmn-eng.zip

源代码:https://github.com/pjgao/seq2seq_keras

参考:https://blog.csdn.net/PIPIXIU/article/details/81016974

导入库

执行代码:

from keras.layers import Input,LSTM,Dense
from keras.models import Model,load_model
from keras.utils import plot_model

import pandas as pd
import numpy as np

返回信息:

Using TensorFlow backend.

执行代码:

def create_model(n_input,n_output,n_units):
    #训练阶段
    #encoder
    encoder_input = Input(shape = (None, n_input))
    #encoder输入维度n_input为每个时间步的输入xt的维度,这里是用来one-hot的英文字符数
    encoder = LSTM(n_units, return_state=True)
    #n_units为LSTM单元中每个门的神经元的个数,return_state设为True时才会返回最后时刻的状态h,c
    _,encoder_h,encoder_c = encoder(encoder_input)
    encoder_state = [encoder_h,encoder_c]
    #保留下来encoder的末状态作为decoder的初始状态

    #decoder
    decoder_input = Input(shape = (None, n_output))
    #decoder的输入维度为中文字符数
    decoder = LSTM(n_units,return_sequences=True, return_state=True)
    #训练模型时需要decoder的输出序列来与结果对比优化,故return_sequences也要设为True
    decoder_output, _, _ = decoder(decoder_input,initial_state=encoder_state)
    #在训练阶段只需要用到decoder的输出序列,不需要用最终状态h.c
    decoder_dense = Dense(n_output,activation='softmax')
    decoder_output = decoder_dense(decoder_output)
    #输出序列经过全连接层得到结果

    #生成的训练模型
    model = Model([encoder_input,decoder_input],decoder_output)
    #第一个参数为训练模型的输入,包含了encoder和decoder的输入,第二个参数为模型的输出,包含了decoder的输出

    #推理阶段,用于预测过程
    #推断模型—encoder
    encoder_infer = Model(encoder_input,encoder_state)

    #推断模型-decoder
    decoder_state_input_h = Input(shape=(n_units,))
    decoder_state_input_c = Input(shape=(n_units,))
    decoder_state_input = [decoder_state_input_h, decoder_state_input_c]#上个时刻的状态h,c   

    decoder_infer_output, decoder_infer_state_h, decoder_infer_state_c = decoder(decoder_input,initial_state=decoder_state_input)
    decoder_infer_state = [decoder_infer_state_h, decoder_infer_state_c]#当前时刻得到的状态
    decoder_infer_output = decoder_dense(decoder_infer_output)#当前时刻的输出
    decoder_infer = Model([decoder_input]+decoder_state_input,[decoder_infer_output]+decoder_infer_state)

    return model, encoder_infer, decoder_infer
N_UNITS = 256
BATCH_SIZE = 64
EPOCH = 50
NUM_SAMPLES = 10000

数据处理

data_path = 'data/cmn.txt'

读取数据

执行代码:

df = pd.read_table(data_path,header=None).iloc[:NUM_SAMPLES,:,]
df.columns=['inputs','targets']

df['targets'] = df['targets'].apply(lambda x: '\t'+x+'\n')

input_texts = df.inputs.values.tolist()
target_texts = df.targets.values.tolist()

input_characters = sorted(list(set(df.inputs.unique().sum())))
target_characters = sorted(list(set(df.targets.unique().sum())))

返回信息:

C:\3rd\Anaconda2\lib\site-packages\ipykernel_launcher.py:1: FutureWarning: read_table is deprecated, use read_csv instead, passing sep='\t'.
  """Entry point for launching an IPython kernel.

执行代码:

INUPT_LENGTH = max([len(i) for i in input_texts])
OUTPUT_LENGTH = max([len(i) for i in target_texts])
INPUT_FEATURE_LENGTH = len(input_characters)
OUTPUT_FEATURE_LENGTH = len(target_characters)

向量化

执行代码:

encoder_input = np.zeros((NUM_SAMPLES,INUPT_LENGTH,INPUT_FEATURE_LENGTH))
decoder_input = np.zeros((NUM_SAMPLES,OUTPUT_LENGTH,OUTPUT_FEATURE_LENGTH))
decoder_output = np.zeros((NUM_SAMPLES,OUTPUT_LENGTH,OUTPUT_FEATURE_LENGTH))
input_dict = {char:index for index,char in enumerate(input_characters)}
input_dict_reverse = {index:char for index,char in enumerate(input_characters)}
target_dict = {char:index for index,char in enumerate(target_characters)}
target_dict_reverse = {index:char for index,char in enumerate(target_characters)}
for seq_index,seq in enumerate(input_texts):
    for char_index, char in enumerate(seq):
        encoder_input[seq_index,char_index,input_dict[char]] = 1
for seq_index,seq in enumerate(target_texts):
    for char_index,char in enumerate(seq):
        decoder_input[seq_index,char_index,target_dict[char]] = 1.0
        if char_index > 0:
            decoder_output[seq_index,char_index-1,target_dict[char]] = 1.0

观察向量化的数据

执行代码:

''.join([input_dict_reverse[np.argmax(i)] for i in encoder_input[0] if max(i) !=0])

返回信息:

'Hi.'

执行代码:

''.join([target_dict_reverse[np.argmax(i)] for i in decoder_output[0] if max(i) !=0])

返回信息:

'嗨。\n'

执行代码:

''.join([target_dict_reverse[np.argmax(i)] for i in decoder_input[0] if max(i) !=0])

返回信息:

'\t嗨。\n'

创建模型

执行代码:

model_train, encoder_infer, decoder_infer = create_model(INPUT_FEATURE_LENGTH, OUTPUT_FEATURE_LENGTH, N_UNITS)

返回信息:

WARNING:tensorflow:From C:\3rd\Anaconda2\lib\site-packages\tensorflow\python\framework\op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.

执行代码:

#查看模型结构
plot_model(to_file='model.png',model=model_train,show_shapes=True)
plot_model(to_file='encoder.png',model=encoder_infer,show_shapes=True)
plot_model(to_file='decoder.png',model=decoder_infer,show_shapes=True)
model_train.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model_train.summary()

返回信息:

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to
==================================================================================================
input_1 (InputLayer)            (None, None, 73)     0
__________________________________________________________________________________________________
input_2 (InputLayer)            (None, None, 2623)   0
__________________________________________________________________________________________________
lstm_1 (LSTM)                   [(None, 256), (None, 337920      input_1[0][0]
__________________________________________________________________________________________________
lstm_2 (LSTM)                   [(None, None, 256),  2949120     input_2[0][0]
                                                                 lstm_1[0][1]
                                                                 lstm_1[0][2]
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, None, 2623)   674111      lstm_2[0][0]
==================================================================================================
Total params: 3,961,151
Trainable params: 3,961,151
Non-trainable params: 0
__________________________________________________________________________________________________

执行代码:

encoder_infer.summary()

返回信息:

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         (None, None, 73)          0
_________________________________________________________________
lstm_1 (LSTM)                [(None, 256), (None, 256) 337920
=================================================================
Total params: 337,920
Trainable params: 337,920
Non-trainable params: 0
_________________________________________________________________

执行代码:

decoder_infer.summary()

返回信息:

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to
==================================================================================================
input_2 (InputLayer)            (None, None, 2623)   0
__________________________________________________________________________________________________
input_3 (InputLayer)            (None, 256)          0
__________________________________________________________________________________________________
input_4 (InputLayer)            (None, 256)          0
__________________________________________________________________________________________________
lstm_2 (LSTM)                   [(None, None, 256),  2949120     input_2[0][0]
                                                                 input_3[0][0]
                                                                 input_4[0][0]
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, None, 2623)   674111      lstm_2[1][0]
==================================================================================================
Total params: 3,623,231
Trainable params: 3,623,231
Non-trainable params: 0
__________________________________________________________________________________________________

模型训练

执行代码:

model_train.fit([encoder_input,decoder_input],decoder_output,batch_size=BATCH_SIZE,epochs=EPOCH,validation_split=0.2)

返回信息:

WARNING:tensorflow:From C:\3rd\Anaconda2\lib\site-packages\tensorflow\python\ops\math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.
WARNING:tensorflow:From C:\3rd\Anaconda2\lib\site-packages\tensorflow\python\ops\math_grad.py:102: div (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Deprecated in favor of operator or tf.math.divide.
Train on 8000 samples, validate on 2000 samples
Epoch 1/50
8000/8000 [==============================] - 165s 21ms/step - loss: 2.0312 - val_loss: 2.5347
Epoch 2/50
8000/8000 [==============================] - 135s 17ms/step - loss: 1.9115 - val_loss: 2.4281
Epoch 3/50
8000/8000 [==============================] - 137s 17ms/step - loss: 1.8016 - val_loss: 2.3045
Epoch 4/50
8000/8000 [==============================] - 136s 17ms/step - loss: 1.7122 - val_loss: 2.2427
Epoch 5/50
8000/8000 [==============================] - 138s 17ms/step - loss: 1.6271 - val_loss: 2.1663
Epoch 6/50
8000/8000 [==============================] - 135s 17ms/step - loss: 1.5521 - val_loss: 2.0765
Epoch 7/50
8000/8000 [==============================] - 136s 17ms/step - loss: 1.4851 - val_loss: 2.0489
Epoch 8/50
8000/8000 [==============================] - 136s 17ms/step - loss: 1.4294 - val_loss: 2.0093
Epoch 9/50
8000/8000 [==============================] - 136s 17ms/step - loss: 1.3731 - val_loss: 1.9413
Epoch 10/50
8000/8000 [==============================] - 137s 17ms/step - loss: 1.3267 - val_loss: 1.9104
Epoch 11/50
8000/8000 [==============================] - 136s 17ms/step - loss: 1.2840 - val_loss: 1.8889
Epoch 12/50
8000/8000 [==============================] - 136s 17ms/step - loss: 1.2452 - val_loss: 1.8658
Epoch 13/50
8000/8000 [==============================] - 135s 17ms/step - loss: 1.2077 - val_loss: 1.8468
Epoch 14/50
8000/8000 [==============================] - 136s 17ms/step - loss: 1.1747 - val_loss: 1.8372
Epoch 15/50
8000/8000 [==============================] - 135s 17ms/step - loss: 1.1425 - val_loss: 1.8197
Epoch 16/50
8000/8000 [==============================] - 136s 17ms/step - loss: 1.1125 - val_loss: 1.8159
Epoch 17/50
8000/8000 [==============================] - 135s 17ms/step - loss: 1.0834 - val_loss: 1.8012
Epoch 18/50
8000/8000 [==============================] - 136s 17ms/step - loss: 1.0553 - val_loss: 1.7965
Epoch 19/50
8000/8000 [==============================] - 136s 17ms/step - loss: 1.0287 - val_loss: 1.7954
Epoch 20/50
8000/8000 [==============================] - 137s 17ms/step - loss: 1.0026 - val_loss: 1.7882
Epoch 21/50
8000/8000 [==============================] - 136s 17ms/step - loss: 0.9766 - val_loss: 1.7861
Epoch 22/50
8000/8000 [==============================] - 138s 17ms/step - loss: 0.9517 - val_loss: 1.7907
Epoch 23/50
8000/8000 [==============================] - 137s 17ms/step - loss: 0.9274 - val_loss: 1.7936
Epoch 24/50
8000/8000 [==============================] - 135s 17ms/step - loss: 0.9044 - val_loss: 1.7815
Epoch 25/50
8000/8000 [==============================] - 135s 17ms/step - loss: 0.8811 - val_loss: 1.7831
Epoch 26/50
8000/8000 [==============================] - 136s 17ms/step - loss: 0.8592 - val_loss: 1.7894
Epoch 27/50
8000/8000 [==============================] - 137s 17ms/step - loss: 0.8376 - val_loss: 1.7932
Epoch 28/50
8000/8000 [==============================] - 139s 17ms/step - loss: 0.8161 - val_loss: 1.7874
Epoch 29/50
8000/8000 [==============================] - 137s 17ms/step - loss: 0.7947 - val_loss: 1.7913
Epoch 30/50
8000/8000 [==============================] - 136s 17ms/step - loss: 0.7746 - val_loss: 1.7912
Epoch 31/50
8000/8000 [==============================] - 136s 17ms/step - loss: 0.7545 - val_loss: 1.8008
Epoch 32/50
8000/8000 [==============================] - 136s 17ms/step - loss: 0.7353 - val_loss: 1.7989
Epoch 33/50
8000/8000 [==============================] - 135s 17ms/step - loss: 0.7164 - val_loss: 1.8023
Epoch 34/50
8000/8000 [==============================] - 136s 17ms/step - loss: 0.6984 - val_loss: 1.8090
Epoch 35/50
8000/8000 [==============================] - 135s 17ms/step - loss: 0.6803 - val_loss: 1.8092
Epoch 36/50
8000/8000 [==============================] - 142s 18ms/step - loss: 0.6627 - val_loss: 1.8177
Epoch 37/50
8000/8000 [==============================] - 140s 18ms/step - loss: 0.6467 - val_loss: 1.8249
Epoch 38/50
8000/8000 [==============================] - 144s 18ms/step - loss: 0.6288 - val_loss: 1.8290
Epoch 39/50
8000/8000 [==============================] - 143s 18ms/step - loss: 0.6127 - val_loss: 1.8333
Epoch 40/50
8000/8000 [==============================] - 144s 18ms/step - loss: 0.5973 - val_loss: 1.8454
Epoch 41/50
8000/8000 [==============================] - 143s 18ms/step - loss: 0.5824 - val_loss: 1.8488
Epoch 42/50
8000/8000 [==============================] - 160s 20ms/step - loss: 0.5669 - val_loss: 1.8490
Epoch 43/50
8000/8000 [==============================] - 143s 18ms/step - loss: 0.5529 - val_loss: 1.8600
Epoch 44/50
8000/8000 [==============================] - 144s 18ms/step - loss: 0.5383 - val_loss: 1.8636
Epoch 45/50
8000/8000 [==============================] - 144s 18ms/step - loss: 0.5244 - val_loss: 1.8806
Epoch 46/50
8000/8000 [==============================] - 827s 103ms/step - loss: 0.5120 - val_loss: 1.8877
Epoch 47/50
8000/8000 [==============================] - 147s 18ms/step - loss: 0.4992 - val_loss: 1.8902
Epoch 48/50
8000/8000 [==============================] - 150s 19ms/step - loss: 0.4859 - val_loss: 1.8981
Epoch 49/50
8000/8000 [==============================] - 149s 19ms/step - loss: 0.4737 - val_loss: 1.9022
Epoch 50/50
8000/8000 [==============================] - 149s 19ms/step - loss: 0.4619 - val_loss: 1.9096
<keras.callbacks.History at 0x2f3f3936908>

预测序列

执行代码:

def predict_chinese(source,encoder_inference, decoder_inference, n_steps, features):
    #先通过推理encoder获得预测输入序列的隐状态
    state = encoder_inference.predict(source)
    #第一个字符'\t',为起始标志
    predict_seq = np.zeros((1,1,features))
    predict_seq[0,0,target_dict['\t']] = 1

    output = ''
    #开始对encoder获得的隐状态进行推理
    #每次循环用上次预测的字符作为输入来预测下一次的字符,直到预测出了终止符
    for i in range(n_steps):#n_steps为句子最大长度
        #给decoder输入上一个时刻的h,c隐状态,以及上一次的预测字符predict_seq
        yhat,h,c = decoder_inference.predict([predict_seq]+state)
        #注意,这里的yhat为Dense之后输出的结果,因此与h不同
        char_index = np.argmax(yhat[0,-1,:])
        char = target_dict_reverse[char_index]
        output += char
        state = [h,c]#本次状态做为下一次的初始状态继续传递
        predict_seq = np.zeros((1,1,features))
        predict_seq[0,0,char_index] = 1
        if char == '\n':#预测到了终止符则停下来
            break
    return output
for i in range(1000,1100):
    test = encoder_input[i:i+1,:,:]#i:i+1保持数组是三维
    out = predict_chinese(test,encoder_infer,decoder_infer,OUTPUT_LENGTH,OUTPUT_FEATURE_LENGTH)
    #print(input_texts[i],'\n---\n',target_texts[i],'\n---\n',out)
    print(input_texts[i])
    print(out)

返回信息:

I have brothers.
我有一個意思。

I have ten pens.
我有一個意見。

I have to hurry!
我有一个好。

I have two cats.
我有一個意見。

I have two sons.
我有一個意見。

I just threw up.
我只是不能看看。

I lent him a CD.
我喜欢你的。

I like Tom, too.
我喜欢你的房间。

I like football.
我喜欢跑步。

I like potatoes.
我喜欢跑步。

I like the cold.
我喜欢跑步。

I like this dog.
我喜欢跑步。

I like your car.
我喜欢你的车。

I lived in Rome.
我愛這台車。

I love this car.
我愛這台車。

I might say yes.
我非常喜欢我的。

I must help her.
我在這裡吃飯了。

I need a friend.
我需要一張郵票。

I need evidence.
我需要一張郵票。

I need you here.
我需要你的幫助。

I paid the bill.
我同意他。

I played tennis.
我喜歡運動。

I run every day.
我非常喜欢。

I speak Swedish.
我同意他。

I talked to her.
我打算去那裡。

I teach Chinese.
我相信你。

I think it's OK.
我想感觉。

I took a shower.
我想要一張。

I want a guitar.
我想要一個。

I want that bag.
我想要一點。

I want to drive.
我想要一個。

I was surprised.
我真是不能运。

I wish you'd go.
我希望你去。

I woke up early.
我希望你去。

I work too much.
我在这个工作。

I'll bring wine.
我會開車。

I'll never stop.
我會打網球。

I'm a foreigner.
我是個老師。

I'm a night owl.
我是个男人。

I'm about ready.
我是個老師。

I'm always here.
我很高興。

I'm daydreaming.
我是個老師。

I'm feeling fit.
我是一個好男孩。

I'm left-handed.
我是一個好人。

I'm not serious.
我不是你的。

I'm out of time.
我是个男人。

I'm really busy.
我很快樂。

I'm really cold.
我很高興。

I'm still angry.
我是個老師。

I'm very hungry.
我很快樂。

I'm very lonely.
我很好奇。

I've had enough.
我有一切。

I've had enough.
我有一切。

Is Tom Canadian?
汤姆是好人。

Is he breathing?
他是日本人吗?

Is it all there?
那是一只是嗎?

Is it too salty?
那是你的車嗎?

Is she Japanese?
他的是日本人嗎?

Is this a river?
这是一只是用的铅笔吗?

Isn't that mine?
那是我的吗?

It is up to you.
那是你的想象。

It snowed a lot.
它不是真的。

It was terrible.
它是我們的錯誤。

It was very far.
它是我們的秘密。

It'll be cloudy.
它很大。

It's a dead end.
它是我們的錯。

It's a new book.
它是我們的秘密。

It's a nice day.
它是我們的秘密。

It's a surprise.
它是我們的!

It's almost six.
它是一個很好的問題。

It's already 11.
它是我們的秘密。

It's fine today.
它是一個好主意。

It's impossible.
它是一個很好的問題。

It's lunch time.
它是我們的錯。

It's okay to go.
它是我們的秘密。

It's over there.
它是一個好。

It's time to go.
它是我最好的。

It's time to go.
它是我最好的。

Jesus loves you.
把它给我的!

Keep on smiling.
保持微笑。

Keep on working.
让不要保持。

Keep the change!
繼續工作!

Large, isn't it?
很少, 不是嗎?

Lemons are sour.
讓我看一下。

Let me go alone.
讓我看看。

Let me see that.
讓我看看。

Let them decide.
讓我看看。

Let's eat sushi.
讓我們開始吧。

Let's go by bus.
讓我們開始吧。

Let's not argue.
讓我們開始吧。

Let's turn back.
讓我們開始吧。

Look at the sky.
看看那個好。

Look behind you.
看看那個人。

Make it smaller.
把它弄小一點。

May I leave now?
我可以看看你的行嗎?

May I try it on?
我可以看看你的行嗎?

Maybe next time.
大部電話是我的工作。

Men should work.
大下周日。

Merry Christmas!
瑪麗很高。

Mom, I'm hungry.
媽,我可以去游泳嗎?

参考:

https://zybuluo.com/hanbingtao/note/541458

https://zybuluo.com/hanbingtao/note/581764

Keras入门——(7)长短期记忆网络LSTM(四)的更多相关文章

  1. 如何预测股票分析--长短期记忆网络(LSTM)

    在上一篇中,我们回顾了先知的方法,但是在这个案例中表现也不是特别突出,今天介绍的是著名的l s t m算法,在时间序列中解决了传统r n n算法梯度消失问题的的它这一次还会有令人杰出的表现吗? 长短期 ...

  2. Keras入门——(6)长短期记忆网络LSTM(三)

    参考: https://blog.csdn.net/u012735708/article/details/82769711 https://zybuluo.com/hanbingtao/note/58 ...

  3. Keras入门——(5)长短期记忆网络LSTM(二)

    参考: https://blog.csdn.net/zwqjoy/article/details/80493341 https://blog.csdn.net/u012735708/article/d ...

  4. Keras入门——(4)长短期记忆网络LSTM(一)

    参考: https://blog.csdn.net/zwqjoy/article/details/80493341 https://blog.csdn.net/u012735708/article/d ...

  5. 递归神经网络之理解长短期记忆网络(LSTM NetWorks)(转载)

    递归神经网络 人类并不是每时每刻都从头开始思考.正如你阅读这篇文章的时候,你是在理解前面词语的基础上来理解每个词.你不会丢弃所有已知的信息而从头开始思考.你的思想具有持续性. 传统的神经网络不能做到这 ...

  6. 理解长短期记忆网络(LSTM NetWorks)

    转自:http://www.csdn.net/article/2015-11-25/2826323 原文链接:Understanding LSTM Networks(译者/刘翔宇 审校/赵屹华 责编/ ...

  7. LSTM - 长短期记忆网络

    循环神经网络(RNN) 人们不是每一秒都从头开始思考,就像你阅读本文时,不会从头去重新学习一个文字,人类的思维是有持续性的.传统的卷积神经网络没有记忆,不能解决这一个问题,循环神经网络(Recurre ...

  8. LSTMs 长短期记忆网络系列

    RNN的长期依赖问题 什么是长期依赖? 长期依赖是指当前系统的状态,可能受很长时间之前系统状态的影响,是RNN中无法解决的一个问题. 如果从(1) “ 这块冰糖味道真?”来预测下一个词,是很容易得出“ ...

  9. Long-Short Memory Network(LSTM长短期记忆网络)

    自剪枝神经网络 Simple RNN从理论上来看,具有全局记忆能力,因为T时刻,递归隐层一定记录着时序为1的状态 但由于Gradient Vanish问题,T时刻向前反向传播的Gradient在T-1 ...

随机推荐

  1. JarvisOJ - Writeup(5.31更新)

    此篇用来记录我在jarivsOJ上的一些题解,只给解题思路,不放flag Misc 0x01 You Need Python(300) 题目有两个文件,一个py文件,另一个是经过编码的key 文件ke ...

  2. ubuntu 切换用户

    app切换root ubuntu: sudo su - app sudo su - root centos : sudo su ############ root 切换app sudo su - ap ...

  3. 离线安装requests库

    离线安装需要五个 certifi-2019.9.11-py2.py3-none-any.whl chardet-3.0.4-py2.py3-none-any.whl idna-2.8-py2.py3- ...

  4. python接口自动化测试 - requests库的post请求进行文件下载

    前言 之前讲了文件上传,当然就有文件下载啦 文件下载操作步骤 极其简单,将二进制格式的响应内容存进本地文件中,根据需要下载的文件的格式来写文件名即可 down_url = 'https://www.i ...

  5. Vue - 表单修饰符

    .lazy 在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 . 使用 lazy 修饰符,从而转变为使用 change 事件进行同步 <div id=&qu ...

  6. 生成树计数 lighting 最终决定用这个模板! (有逆元的模板)

    #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> # ...

  7. 消息队列(六)--- RocketMQ-消息消费

    文章部分图片来自参考资料,侵删 概述 我们从前面的发送流程知道某个主题的消息到了broker 的 messageque 里,假如让我们来设计一个消息队列的消费者过程,那么多个消费者应该如何消费数量较少 ...

  8. 作业1:使用go搭建一个web-server

    todo1:搭建web-server的原理 todo2:go实现web-server

  9. 设备驱动基础学习--/proc下增加节点

    在需要创建一个由一系列数据顺序组合而成的/proc虚拟文件或一个较大的/proc虚拟文件时,推荐使用seq_file接口. 数据结构struct seq_fille定义在include/linux/s ...

  10. python:面试算法题

    ''' 1.买卖股票的最佳时机给定一个数组,它的第?i?个元素是一支给定股票第?i?天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不 ...