同時訓練兩個網絡“同時”!我的第一想法是用最底層的C / C ++編程實現神經網絡。後來,在微信公衆號上搜到了keras融合層!合併,真是太驚奇!可是大家不要使用合併,因爲這個keras已經不支持了的趕腳。
好了,上代碼了。敲黑板!
import keras
import numpy as np
from keras.utils import plot_model
import matplotlib.pyplot as plt
# 第一個網絡模型
# 輸入爲16維
input1 = keras.layers.Input(shape=(16,))
layer_1 = keras.layers.Dense(8, activation='relu')(input1)
layer_2 = keras.layers.Dense(1, activation='relu')(layer_1)
# 第二個網絡模型
# 輸入爲32維
input2 = keras.layers.Input(shape=(32,))
layer_3 = keras.layers.Dense(8, activation='relu')(input2)
layer_4 = keras.layers.Dense(1, activation='relu')(layer_3)
# 模型結果求和(也有求差、求積、求商......)
add = keras.layers.Add()([layer_2, layer_4])
# 最後以4維的向量輸出
out = keras.layers.Dense(4)(add)
# 利用Model搭建模型
model = keras.models.Model(inputs=[input1, input2], outputs=out)
# 編譯模型
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
# 輸入和輸出數據
x1 = np.random.random((1000, 16))
x2 = np.random.random((1000, 32))
y = np.random.randint(10, size=(1000, 4))
# 訓練模型,並保存訓練過程的細節
history = model.fit([x1, x2], y, batch_size=32, epochs=100, verbose=1,
callbacks=None, validation_split=0.1,
validation_data=None, shuffle=True,
class_weight=None, sample_weight=None,
initial_epoch=0)
# 打印模型信息
model.summary()
# 將模型保存爲圖像文件
plot_model(model, show_shapes = True, show_layer_names = True, to_file = 'Merge.png')
# 繪製訓練圖像
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epochs')
plt.legend(['train', 'validate'], loc='upper right')
plt.show()
這是一份簡易的代碼,實際我的程序很長,不管是我神經網絡的層數,輸入的個數,輸入和輸出的數據,都要比這個模型複雜,這個僅僅作爲參考,用keras搭建一個神經網絡真的只需要30秒經過100次的整體訓練,得到的結果如下!
1.模型的文字信息
2.模型的圖片信息:想要生成這種文件形式的模型,需要安裝Graphviz的,pydot組件!
3.訓練過程:(因爲數據是隨機生成的,只是爲了試驗模型,所以誤差大小不用理會啦!)