代码之家  ›  专栏  ›  技术社区  ›  Bartek Wójcik

Keras-分叉架构的预处理和扩展

  •  0
  • Bartek Wójcik  · 技术社区  · 6 年前

    x1,x2 输出一个二进制值(0,1)和45个实数(输出向量总共有46个属性)。我想对这1个二进制值和45个实数使用不同的损失函数,即二进制交叉熵和均方误差。

    首先,预处理:

    # load dataset
    dataframe = pandas.read_csv("inputs.csv", delim_whitespace=True,header=None)
    dataset = dataframe.values
    # split into input (X) and output (Y) variables
    X = dataset[:,0:2]
    Y = dataset[:,3:]
    
    x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, 
    random_state=123)
    y_train_L, y_train_R = y_train[:,0], y_train[:,1:]
    y_train_L = y_train_L.reshape(-1,1)
    scalarX, scalarY_L, scalarY_R = MinMaxScaler(), MinMaxScaler(), MinMaxScaler()
    scalarX.fit(x_train)
    scalarY_L.fit(y_train_L)
    scalarY_R.fit(y_train_R)
    
    x_train = scalarX.transform(x_train)
    y_train_L = scalarY_L.transform(y_train_L)
    y_train_R = scalarY_R.transform(y_train_R)
    

    哪里 y_train_L left 部分只是二进制值 y_train_R 都是实数。我不得不将它们分开,因为在定义架构时:

    # define and fit the final model
    
    inputs = Input(shape=(x_train.shape[1],))
    first =Dense(46, activation='relu')(inputs)
    
    #last
    layer45 = Dense(45, activation='linear')(first)
    layer1 = Dense(1, activation='tanh')(first)
    out = [layer1,layer45]
    #end last
    
    model = Model(inputs=inputs,outputs=out)
    model.compile(loss=['binary_crossentropy','mean_squared_error'], optimizer='adam')
    model.fit(x_train, [y_train_L,y_train_R], epochs=1000, verbose=1)
    
    
    Xnew = scalarX.transform(x_test)
    y_test_L, y_test_R = y_test[:,0], y_test[:,1:]
    y_test_L = y_test_L.reshape(-1,1)
    y_test_L=scalarY_L.transform(y_test_L)
    y_test_R=scalarY_R.transform(y_test_R)
    # make a prediction
    ynew = model.predict(Xnew)
    

    loss=['binary_crossentropy','mean_squared_error'] 需要两个不同的数组 model.fit(x_train, [y_train_L,y_train_R])

    然后我必须做所有的“有趣的”技巧来得到预测值,并将它们彼此比较,因为 ynew = model.predict(Xnew) 返回 list 共两个 lists ,一个用于二进制值,一个用于实数。

    ynew = model.predict(Xnew)
    # show the inputs and predicted outputs
    print("SCALED VALUES")
    for i in range(len(Xnew)):
        print("X=%s\n P=%s,%s\n A=%s,%s" % (Xnew[i], ynew[0][i], ynew[1][i], y_test_L[i], y_test_R[i]))
    
    inversed_X_test = scalarX.inverse_transform(Xnew)
    inversed_Y_test_L = scalarY_L.inverse_transform(y_test_L)
    inversed_Y_test_R = scalarY_R.inverse_transform(y_test_R)
    inversed_y_predicted_L = scalarY_L.inverse_transform(ynew[0])
    inversed_y_predicted_R = scalarY_R.inverse_transform(ynew[1])
    print("REAL VALUES")
    for i in range(len(inversed_X_test)):
        print("X=%s\n P=%s,%s\n A=%s,%s" % (inversed_X_test[i], inversed_y_predicted_L[i],inversed_y_predicted_R[i], inversed_Y_test_L[i],inversed_Y_test_R[i]))
    

    问题:

    2) 我如何衡量损失?我想创建挖沟期间的损失值图表。

    1 回复  |  直到 6 年前
        1
  •  1
  •   sdcbr    6 年前

    1) 您定义模型的方式似乎是正确的,而且没有“更干净”的方法(我认为Keras的函数API是尽可能干净的)

    2) 要可视化培训损失,请将培训历史记录存储在变量中:

    history = model.fit(...)
    

    这个 history

    3) 在你的分类输出中( layer1 ),您要使用 sigmoid 激活而不是 tanh . sigmoid函数返回0到1之间的值, 返回介于-1和1之间的值。你的 binary_crossentropy 损失函数期望前者。