from keras.layers import Conv2D, Input
# input tensor for a 3-channel 256x256 image
x = Input(shape=(256, 256, 3))
# 3x3 conv with 2 output channels (same as input channels)
y = Conv2D(2, (3, 3), padding='same')(x)
z = keras.layers.add([x, y])
我需要创建一个不仅可以对图像进行分类而且还可以对其中的对象进行计数的神经网络,所以我必须创建两个通道,上面的代码对吗?在这种情况下,我该如何训练和预测?
答案 0 :(得分:0)
经过一番深思后,在我看来,您要实现的目标不是keras的主要目的,尽管完全有可能在keras中做到这一点,但创建自定义损失函数并维持其流向超出keras的范围,我建议您完全切换到tensorflow,并且为简化起见,如果需要使用tf.layers,我还创建了自定义损失函数,尽管我建议您尝试更改它以更好地满足您的需求。 >
import tensorflow as tf
import numpy as np
x=np.random.randn(5,5,3)
x=x.reshape(1,*x.shape)
y_val=np.random.randn(1,3)
inputv=tf.placeholder(tf.float32,shape=(None,5,5,3))
y=tf.placeholder(tf.float32,shape=(None,3))
w=tf.Variable(tf.truncated_normal([1,3,3,1],stddev=0.1),name="W")
b=tf.Variable(tf.constant(0.1,shape=[3]),name="B")
conv=tf.nn.conv2d(inputv,w,strides=[1,1,1,1],padding="SAME")
act=tf.nn.relu(conv+b)
flat=tf.contrib.layers.flatten(act)
w1=tf.Variable(tf.truncated_normal([75,3],stddev=0.1),name="W")
b1=tf.Variable(tf.constant(0.1,shape=[3]),name="B")
logits=tf.nn.relu(tf.matmul(flat,w1)+b1)
loss=tf.reduce_mean(tf.concat([tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits[0][1:],labels=y[0][1:]),tf.losses.mean_squared_error(y[0][0],logits[0][0])],0))
train_step=tf.train.AdamOptimizer(1e-4).minimize(loss)
sess=tf.Session()
sess.run(tf.global_variables_initializer())
val=sess.run((logits,loss,train_step),feed_dict={inputv:x,y:y_val})
sess.close()